<?php
// db.php - Database connection and auto-setup

// 0. Load external config file if available (useful for hosting deployment)
if (file_exists(__DIR__ . '/config.php')) {
    require_once __DIR__ . '/config.php';
}

// Auto-detect student user ID from path or request URI if hosted on server (e.g. /u69319090014/)
$detected_user = null;
if (preg_match('/(u\d{8,11})/i', __DIR__ . ' ' . ($_SERVER['REQUEST_URI'] ?? '') . ' ' . ($_SERVER['SCRIPT_NAME'] ?? ''), $m)) {
    $detected_user = strtolower($m[1]);
}

$host     = defined('DB_HOST') ? DB_HOST : (getenv('DB_HOST') ?: ($_SERVER['DB_HOST'] ?? 'localhost'));
$username = defined('DB_USER') ? DB_USER : (getenv('DB_USER') ?: ($_SERVER['DB_USER'] ?? ($detected_user ?: 'root')));
$password = defined('DB_PASS') ? DB_PASS : (getenv('DB_PASS') ?: ($_SERVER['DB_PASS'] ?? ''));
$dbname   = defined('DB_NAME') ? DB_NAME : (getenv('DB_NAME') ?: ($_SERVER['DB_NAME'] ?? 'shop_non_014'));

// Build list of candidate database names to try automatically on web hosting
$db_candidates = array_unique(array_filter([
    $dbname,
    $detected_user,
    $detected_user ? $detected_user . '_db' : null,
    $detected_user ? $detected_user . '_shop' : null,
    $username !== 'root' ? $username : null,
    $username !== 'root' ? $username . '_db' : null,
    'shop_non_014'
]));

$pdo = null;
$last_exception = null;

try {
    // 1. Try connecting to candidate databases directly
    foreach ($db_candidates as $try_db) {
        try {
            $pdo = new PDO("mysql:host=$host;dbname=$try_db;charset=utf8mb4", $username, $password);
            $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
            $dbname = $try_db; // Successfully connected!
            break;
        } catch (PDOException $e) {
            $last_exception = $e;
            // If database missing (1049) or access denied to specific db name (1044), try next candidate
            if ($e->getCode() == 1049 || $e->getCode() == 1044 || strpos($e->getMessage(), 'Access denied for user') !== false && strpos($e->getMessage(), 'to database') !== false) {
                continue;
            } else {
                // For user authentication failures (1045, 1698), stop loop to display credentials error
                break;
            }
        }
    }

    // If direct connection to candidate DBs failed, attempt creating DB if permitted (Local XAMPP)
    if (!$pdo) {
        try {
            $pdo = new PDO("mysql:host=$host", $username, $password);
            $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
            $pdo->exec("CREATE DATABASE IF NOT EXISTS `$dbname` CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci");
            $pdo = new PDO("mysql:host=$host;dbname=$dbname;charset=utf8mb4", $username, $password);
            $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        } catch (PDOException $e) {
            throw $last_exception ?: $e;
        }
    }
    
    // Table: products
    $pdo->exec("CREATE TABLE IF NOT EXISTS products (
        id INT AUTO_INCREMENT PRIMARY KEY,
        name VARCHAR(255) NOT NULL,
        description TEXT,
        price DECIMAL(10, 2) NOT NULL,
        category VARCHAR(100) NOT NULL,
        sizes VARCHAR(100) NOT NULL, -- Comma-separated S,M,L,XL
        colors VARCHAR(100) NOT NULL, -- Comma-separated Black,White,Grey
        stock INT NOT NULL DEFAULT 0,
        image VARCHAR(255) NOT NULL,
        created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;");

    // Table: users
    $pdo->exec("CREATE TABLE IF NOT EXISTS users (
        id INT AUTO_INCREMENT PRIMARY KEY,
        username VARCHAR(100) UNIQUE NOT NULL,
        password_hash VARCHAR(255) NOT NULL,
        role VARCHAR(50) NOT NULL DEFAULT 'customer',
        created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;");

    // Table: orders (Updated to include user_id)
    $pdo->exec("CREATE TABLE IF NOT EXISTS orders (
        id INT AUTO_INCREMENT PRIMARY KEY,
        user_id INT NULL,
        customer_name VARCHAR(255) NOT NULL,
        phone VARCHAR(20) NOT NULL,
        address TEXT NOT NULL,
        total_price DECIMAL(10, 2) NOT NULL,
        status VARCHAR(50) DEFAULT 'Pending',
        created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
        FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE SET NULL
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;");

    // Table: order_items
    $pdo->exec("CREATE TABLE IF NOT EXISTS order_items (
        id INT AUTO_INCREMENT PRIMARY KEY,
        order_id INT NOT NULL,
        product_id INT NOT NULL,
        size VARCHAR(20) NOT NULL,
        color VARCHAR(50) NOT NULL,
        quantity INT NOT NULL,
        price DECIMAL(10, 2) NOT NULL,
        FOREIGN KEY (order_id) REFERENCES orders(id) ON DELETE CASCADE,
        FOREIGN KEY (product_id) REFERENCES products(id) ON DELETE CASCADE
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;");

    // Table: coupons
    $pdo->exec("CREATE TABLE IF NOT EXISTS coupons (
        id INT AUTO_INCREMENT PRIMARY KEY,
        code VARCHAR(50) UNIQUE NOT NULL,
        discount_type VARCHAR(20) NOT NULL, -- 'percent' or 'fixed'
        discount_value DECIMAL(10, 2) NOT NULL,
        min_order_value DECIMAL(10, 2) NOT NULL DEFAULT 0.00,
        description VARCHAR(255) NOT NULL,
        created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;");

    // Table: user_coupons
    $pdo->exec("CREATE TABLE IF NOT EXISTS user_coupons (
        id INT AUTO_INCREMENT PRIMARY KEY,
        user_id INT NOT NULL,
        coupon_id INT NOT NULL,
        is_used TINYINT(1) DEFAULT 0,
        collected_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
        FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE,
        FOREIGN KEY (coupon_id) REFERENCES coupons(id) ON DELETE CASCADE,
        UNIQUE KEY user_coupon_unique (user_id, coupon_id)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;");

    // Check if we need to upgrade the database to luxury version
    $check_luxury = $pdo->query("SELECT COUNT(*) FROM products WHERE name LIKE '%Audemars%'")->fetchColumn();
    if ($check_luxury == 0) {
        $pdo->exec("SET FOREIGN_KEY_CHECKS = 0;");
        $pdo->exec("TRUNCATE TABLE order_items;");
        $pdo->exec("TRUNCATE TABLE orders;");
        $pdo->exec("TRUNCATE TABLE user_coupons;");
        $pdo->exec("TRUNCATE TABLE coupons;");
        $pdo->exec("TRUNCATE TABLE products;");
        $pdo->exec("SET FOREIGN_KEY_CHECKS = 1;");
    }

    // Insert Default Admin & Customer if not exist
    $check_user = $pdo->prepare("SELECT COUNT(*) FROM users WHERE username = :username");
    
    // Admin
    $check_user->execute([':username' => 'admin']);
    if ($check_user->fetchColumn() == 0) {
        $admin_hash = password_hash('admin1234', PASSWORD_BCRYPT);
        $pdo->prepare("INSERT INTO users (username, password_hash, role) VALUES ('admin', :hash, 'admin')")
            ->execute([':hash' => $admin_hash]);
    }
    
    // Customer
    $check_user->execute([':username' => 'customer']);
    if ($check_user->fetchColumn() == 0) {
        $customer_hash = password_hash('customer1234', PASSWORD_BCRYPT);
        $pdo->prepare("INSERT INTO users (username, password_hash, role) VALUES ('customer', :hash, 'customer')")
            ->execute([':hash' => $customer_hash]);
    }

    // Insert Default Coupons if none exist
    $coupon_count = $pdo->query("SELECT COUNT(*) FROM coupons")->fetchColumn();
    if ($coupon_count == 0) {
        $default_coupons = [
            [
                'code' => 'WELCOMEVIP',
                'discount_type' => 'percent',
                'discount_value' => 10.00,
                'min_order_value' => 50000.00,
                'description' => 'ลด 10% สำหรับสมาชิกใหม่ระดับ VIP เมื่อช้อปครบ 50,000 บาทขึ้นไป'
            ],
            [
                'code' => 'ROYALTY10000',
                'discount_type' => 'fixed',
                'discount_value' => 10000.00,
                'min_order_value' => 100000.00,
                'description' => 'ลดทันที 10,000 บาท สำหรับยอดช้อปครบ 100,000 บาทขึ้นไป'
            ],
            [
                'code' => 'ELITE50000',
                'discount_type' => 'fixed',
                'discount_value' => 50000.00,
                'min_order_value' => 500000.00,
                'description' => 'ลดพิเศษ 50,000 บาท สำหรับยอดสั่งซื้อพิเศษครบ 500,000 บาทขึ้นไป'
            ],
            [
                'code' => 'GOLDDELIVERY',
                'discount_type' => 'fixed',
                'discount_value' => 1000.00,
                'min_order_value' => 10000.00,
                'description' => 'บริการขนส่งและประกันภัยระดับพรีเมียม มูลค่า 1,000 บาท ฟรีไม่มีค่าใช้จ่าย'
            ]
        ];
        $insert_coupon = $pdo->prepare("INSERT INTO coupons (code, discount_type, discount_value, min_order_value, description) VALUES (:code, :discount_type, :discount_value, :min_order_value, :description)");
        foreach ($default_coupons as $cp) {
            $insert_coupon->execute($cp);
        }
    }

    // Determine paths
    $image_ap = 'https://images.unsplash.com/photo-1547996160-81dfa63595aa?w=800&auto=format&fit=crop';
    $image_hermes = 'https://images.unsplash.com/photo-1584917865442-de89df76afd3?w=800&auto=format&fit=crop';
    $image_loropiana = 'https://images.unsplash.com/photo-1533867617858-e7b97e060509?w=800&auto=format&fit=crop';
    $image_cucinelli = 'https://images.unsplash.com/photo-1620799140408-edc6dcb6d633?w=800&auto=format&fit=crop';
    $image_tomford = 'https://images.unsplash.com/photo-1593032465175-481ac7f401a0?w=800&auto=format&fit=crop';

    // Insert sample data if products table is empty
    $stmt = $pdo->query("SELECT COUNT(*) FROM products");
    $count = $stmt->fetchColumn();
    
    if ($count == 0) {
        $sample_products = [
            [
                'name' => "Audemars Piguet Royal Oak Chronograph 41mm",
                'description' => "นาฬิกาสปอร์ตหรูระดับมาสเตอร์พีซ ตัวเรือนทองคำชมพู 18 กะรัต (18k Rose Gold) ขัดแต่งหน้าปัดลาย 'Grande Tapisserie' สีน้ำเงินคลาสสิก พร้อมกลไก Chronograph ไขลานอัตโนมัติ สำรองพลังงาน 70 ชั่วโมง สัญลักษณ์เหนือกาลเวลาสำหรับผู้สะสมระดับ Elite",
                'price' => 2650000.00,
                'category' => "นาฬิกาหรู (Luxury Watches)",
                'sizes' => "38mm,41mm",
                'colors' => "Rose Gold,Yellow Gold,Platinum",
                'stock' => 3,
                'image' => $image_ap
            ],
            [
                'name' => "Hermès Birkin 30 Gold Togo Gold Hardware",
                'description' => "กระเป๋าถือระดับสูงสุดที่เป็นที่ต้องการทั่วโลก ผลิตจากหนัง Togo สี Gold อะไหล่ทองคำ (Gold Hardware) ตัดเย็บด้วยมือโดยช่างฝีมือชั้นสูงชาวฝรั่งเศสในระดับชิ้นต่อชิ้น มอบสัมผัสที่สง่างามและแสดงถึงรสนิยมระดับสูงสุด",
                'price' => 850000.00,
                'category' => "กระเป๋าดีไซเนอร์ (Designer Bags)",
                'sizes' => "Size 30,Size 35",
                'colors' => "Gold Brown,Noir Black,Etain Grey",
                'stock' => 2,
                'image' => $image_hermes
            ],
            [
                'name' => "Loro Piana Summer Walk Loafers",
                'description' => "รองเท้าโลฟเฟอร์หนังกลับกันน้ำ ซับในหนังลูกวัวเกรดพรีเมียม สวมใส่สบายด้วยพื้นยางเอกลักษณ์ นุ่มเบาเป็นพิเศษตามมาตรฐานระดับ Old Money มอบลุคสุภาพบุรุษที่เรียบง่ายแต่ทรงพลัง สะท้อนถึงการพักผ่อนระดับผู้มีอันจะกิน",
                'price' => 45000.00,
                'category' => "รองเท้าหรู (Luxury Shoes)",
                'sizes' => "EU 40,EU 41,EU 42,EU 43,EU 44",
                'colors' => "Sand Beige,Navy Blue,Charcoal",
                'stock' => 8,
                'image' => $image_loropiana
            ],
            [
                'name' => "Brunello Cucinelli Cashmere Knit Sweater",
                'description' => "เสื้อสเวตเตอร์ถักไหมแคชเมียร์แท้ 100% คัดสรรอย่างเข้มงวดจากแคว้น Solomeo ประเทศอิตาลี เนื้อผ้านุ่มละเอียดเป็นพิเศษ มอบความอบอุ่นและภาพลักษณ์ที่เรียบหรูสไตล์ Quiet Luxury ไร้กาลเวลา",
                'price' => 68000.00,
                'category' => "เสื้อผ้าแฟชั่นหรู (Haute Couture)",
                'sizes' => "S,M,L,XL",
                'colors' => "Oatmeal Melange,Slate Grey,Camel",
                'stock' => 5,
                'image' => $image_cucinelli
            ],
            [
                'name' => "Tom Ford Peak-Lapel Silk Tuxedo Suit",
                'description' => "สูททักซิโด้ปกแหลมหุ้มผ้าซาตินไหมขัดเงาตัวท็อป คัตติ้งเน้นบ่าคมสไตล์อิตาเลียนสุดประณีต ออกแบบโดยดีไซเนอร์ระดับโลก Tom Ford มอบบุคลิกโดดเด่น สง่างาม ไร้ที่ติสำหรับงานกาล่าค่ำคืนสำคัญ",
                'price' => 189000.00,
                'category' => "เสื้อผ้าแฟชั่นหรู (Haute Couture)",
                'sizes' => "EU 48,EU 50,EU 52,EU 54",
                'colors' => "Classic Black,Midnight Blue",
                'stock' => 4,
                'image' => $image_tomford
            ]
        ];
 
        $insert_stmt = $pdo->prepare("INSERT INTO products (name, description, price, category, sizes, colors, stock, image) VALUES (:name, :description, :price, :category, :sizes, :colors, :stock, :image)");
        foreach ($sample_products as $prod) {
            $insert_stmt->execute($prod);
        }
    }
    
} catch (PDOException $e) {
    // If output buffer is clean, output friendly error UI
    if (!headers_sent()) {
        http_response_code(500);
    }
    ?>
    <!DOCTYPE html>
    <html lang="th">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>Database Connection Error - N O N _ S H O P</title>
        <link href="https://fonts.googleapis.com/css2?family=Kanit:wght@300;400;600&family=Outfit:wght@400;600;700&display=swap" rel="stylesheet">
        <style>
            * { box-sizing: border-box; margin: 0; padding: 0; font-family: 'Kanit', 'Outfit', sans-serif; }
            body { background-color: #0b0c10; color: #c5c6c7; display: flex; align-items: center; justify-content: center; min-height: 100vh; padding: 20px; }
            .error-card { background: rgba(26, 26, 46, 0.95); border: 1px solid rgba(255, 75, 75, 0.4); border-radius: 16px; padding: 30px; max-width: 650px; width: 100%; box-shadow: 0 10px 30px rgba(0,0,0,0.5); backdrop-filter: blur(10px); }
            .error-header { display: flex; align-items: center; gap: 15px; margin-bottom: 20px; border-bottom: 1px solid rgba(255, 255, 255, 0.1); padding-bottom: 15px; }
            .error-icon { width: 48px; height: 48px; background: rgba(255, 75, 75, 0.2); color: #ff4b4b; border-radius: 12px; display: flex; align-items: center; justify-content: center; font-size: 24px; font-weight: bold; }
            .error-title { font-size: 20px; font-weight: 600; color: #ffffff; }
            .error-subtitle { font-size: 13px; color: #8892b0; }
            .error-msg { background: rgba(0,0,0,0.4); border-left: 4px solid #ff4b4b; padding: 12px 15px; border-radius: 6px; font-family: monospace; font-size: 13px; color: #ff8e8e; margin-bottom: 20px; word-break: break-all; }
            .solution-title { font-size: 16px; font-weight: 600; color: #66fcf1; margin-bottom: 10px; }
            .solution-steps { font-size: 14px; line-height: 1.6; color: #d1d5db; margin-bottom: 15px; }
            .code-box { background: #111; border: 1px solid #333; border-radius: 8px; padding: 15px; font-family: monospace; font-size: 13px; color: #00ffcc; overflow-x: auto; white-space: pre; margin-top: 10px; }
        </style>
    </head>
    <body>
        <div class="error-card">
            <div class="error-header">
                <div class="error-icon">!</div>
                <div>
                    <div class="error-title">ไม่สามารถเชื่อมต่อฐานข้อมูลได้ (Database Error)</div>
                    <div class="error-subtitle">N O N _ S H O P Connection Diagnostic</div>
                </div>
            </div>
            <div class="error-msg">การเชื่อมต่อล้มเหลว: <?php echo htmlspecialchars($e->getMessage()); ?></div>
            <div class="solution-title">💡 วิธีแก้ไขสำหรับ Web Hosting:</div>
            <div class="solution-steps">
                สร้างหรือแก้ไขไฟล์ <strong><code>config.php</code></strong> บน Server (ในโฟลเดอร์เดียวกับ <code>db.php</code>) ให้ตรงกับบัญชี MySQL ของโฮสติ้ง:
            </div>
            <div class="code-box">&lt;?php
// config.php
define('DB_HOST', 'localhost');
define('DB_USER', 'ชื่อผู้ใช้_MySQL_บน_Server');
define('DB_PASS', 'รหัสผ่าน_MySQL_บน_Server');
define('DB_NAME', 'ชื่อฐานข้อมูล_บน_Server');</div>
        </div>
    </body>
    </html>
    <?php
    exit;
}
