<?php
/**
 * Database Connection class using PDO
 * CMTC Shopping
 */

// Enable error reporting to identify any server-side issues
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);

class Database {
    // ==========================================
    // [ตั้งค่าฐานข้อมูล HOST จริง / PRODUCTION]
    // ==========================================
    private $prod_host = "localhost";        // หรือ IP / Hostname ที่โฮสติ้งกำหนด เช่น mysql.host.com
    private $prod_name = "shop69319090037";  // ชื่อฐานข้อมูลบนโฮสต์ (DB_NAME)
    private $prod_user = "u69319090037";     // ชื่อผู้ใช้ฐานข้อมูลบนโฮสต์ (DB_USER)
    private $prod_pass = "@6937";            // รหัสผ่านฐานข้อมูลบนโฮสต์ (DB_PASS)

    // ==========================================
    // [ตั้งค่าฐานข้อมูล LOCALHOST / XAMPP]
    // ==========================================
    private $local_host = "localhost";
    private $local_name = "shop69319090037";
    private $local_user = "root";
    private $local_pass = "";

    public $conn;

    /**
     * Get the database connection
     * @return PDO
     */
    public function getConnection() {
        $this->conn = null;

        // ตรวจสอบสภาพแวดล้อมอัตโนมัติ (Localhost vs Production Host)
        $server_name = $_SERVER['SERVER_NAME'] ?? $_SERVER['HTTP_HOST'] ?? 'localhost';
        $is_local = in_array($server_name, ['localhost', '127.0.0.1', '::1']) || strpos($server_name, '192.168.') === 0;

        if ($is_local) {
            $host = $this->local_host;
            $db_name = $this->local_name;
            $username = $this->local_user;
            $password = $this->local_pass;
        } else {
            $host = $this->prod_host;
            $db_name = $this->prod_name;
            $username = $this->prod_user;
            $password = $this->prod_pass;
        }

        try {
            // บน Localhost ให้ช่วยสร้าง DB / ตารางอัตโนมัติถ้ายังไม่มี
            if ($is_local && $username === 'root') {
                try {
                    $pdo_init = new PDO("mysql:host={$host};charset=utf8mb4", $username, $password, [PDO::ATTR_ERRMODE => PDO::ERRMODE_SILENT]);
                    $pdo_init->exec("CREATE DATABASE IF NOT EXISTS `{$db_name}` CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;");
                } catch(Throwable $e) {}
            }

            // เชื่อมต่อฐานข้อมูลด้วย PDO + UTF-8 (utf8mb4)
            $this->conn = new PDO(
                "mysql:host={$host};dbname={$db_name};charset=utf8mb4",
                $username,
                $password,
                [
                    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
                    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
                    PDO::ATTR_EMULATE_PREPARES => false,
                    PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci"
                ]
            );

            // นำเข้าข้อมูลเริ่มต้นอัตโนมัติ (หากฐานข้อมูลยังว่างเปล่า)
            try {
                $checkTable = $this->conn->query("SHOW TABLES LIKE 'users'");
                if ($checkTable && $checkTable->rowCount() == 0) {
                    $schemaFile = __DIR__ . '/../database/schema.sql';
                    if (file_exists($schemaFile)) {
                        $sql = file_get_contents($schemaFile);
                        $this->conn->exec($sql);
                    }
                }
            } catch(Throwable $e) {}

            // Auto migration ตรวจสอบคอลัมน์ที่จำเป็น
            try {
                $this->conn->exec("ALTER TABLE users ADD COLUMN address TEXT NULL AFTER phone");
            } catch(Throwable $e) {}
            try {
                $this->conn->exec("ALTER TABLE orders ADD COLUMN shipping_address TEXT NULL AFTER recipient_photo");
            } catch(Throwable $e) {}
            try {
                // Drop unique index on sku to allow flexibility and prevent duplicate SKU errors
                $indexes = $this->conn->query("SHOW INDEX FROM products WHERE Column_name = 'sku' AND Non_unique = 0");
                if ($indexes) {
                    $idxRows = $indexes->fetchAll();
                    foreach ($idxRows as $idx) {
                        $this->conn->exec("ALTER TABLE products DROP INDEX `{$idx['Key_name']}`");
                    }
                }
            } catch(Throwable $e) {}

        } catch(Throwable $exception) {
            while (ob_get_level() > 0) {
                ob_end_clean();
            }
            
            // Strip sensitive credentials from error message before logging
            $raw_msg = $exception->getMessage();
            $safe_msg = !empty($password) ? str_replace($password, '********', $raw_msg) : $raw_msg;
            
            // Server-side error log
            error_log("Database Connection Error: " . $safe_msg);
            
            // Display clean, secure user-facing message
            $error_html = "<div style='font-family: Sarabun, Tahoma, sans-serif; max-width: 650px; margin: 60px auto; padding: 30px; border-radius: 14px; background: #fff; border: 1px solid #f5c2c7; color: #842029; box-shadow: 0 10px 30px rgba(0,0,0,0.08);'>";
            $error_html .= "<h3 style='margin-top:0; color:#dc3545; display:flex; align-items:center; gap:8px;'>⚠️ ระบบไม่สามารถเชื่อมต่อฐานข้อมูลได้</h3>";
            $error_html .= "<div style='background:#fdf2f2; padding:12px 15px; border-radius:8px; font-family:monospace; margin:15px 0; word-break:break-all;'><b>Error:</b> " . htmlspecialchars($safe_msg) . "</div>";
            $error_html .= "<p style='margin-bottom:8px; font-weight:bold; color:#333;'>การตั้งค่าที่ระบบพยายามเชื่อมต่อบน Hosting:</p>";
            $error_html .= "<ul style='margin-top:5px; padding-left:20px; color:#555; line-height:1.8;'>";
            $error_html .= "<li>Host: <code>" . htmlspecialchars($host) . "</code></li>";
            $error_html .= "<li>Database Name: <code>" . htmlspecialchars($db_name) . "</code></li>";
            $error_html .= "<li>Username: <code>" . htmlspecialchars($username) . "</code></li>";
            $error_html .= "</ul>";
            $error_html .= "<hr style='border:0; border-top:1px solid #eee; margin:20px 0;'>";
            $error_html .= "<p style='margin-bottom:5px; font-weight:bold; color:#333;'>วิธีแก้ไข:</p>";
            $error_html .= "<ol style='margin-top:5px; padding-left:20px; color:#555; line-height:1.8;'>";
            $error_html .= "<li>เปิดไฟล์ <code>config/db.php</code> แล้วตรวจสอบว่า <b>\$prod_name</b>, <b>\$prod_user</b>, <b>\$prod_pass</b> ตรงกับที่สร้างไว้บน Hosting Control Panel หรือไม่</li>";
            $error_html .= "<li>ตรวจสอบใน phpMyAdmin ว่าได้ Import ไฟล์ <code>database/schema.sql</code> เข้าไปในฐานข้อมูลแล้วหรือไม่</li>";
            $error_html .= "</ol></div>";
            
            die($error_html);
        }

        return $this->conn;
    }
}
?>
