<?php
/**
 * config/database.php
 * সব সার্ভারে কাজ করবে: XAMPP, cPanel, Linux VPS
 *
 * ══════════════════════════════════════════
 *  লাইভ সার্ভারের জন্য নিচের তথ্য পূরণ করুন
 * ══════════════════════════════════════════
 */

// ── Output Buffering ─────────────────────────────────────────
// এটা সবার আগে থাকে — headers already sent ঠেকাতে
if (ob_get_level() === 0) ob_start();

// ── Database Config ───────────────────────────────────────────
define('DB_HOST',    'localhost');
define('DB_NAME',    'bengali_shop');           // ← আপনার DB নাম
define('DB_USER',    'root');                   // ← আপনার DB user
define('DB_PASS',    '');                       // ← আপনার DB password
define('DB_CHARSET', 'utf8mb4');

// ── Site URL (trailing slash ছাড়া) ───────────────────────────
define('BASE_URL', 'http://localhost/ecommerce'); // ← আপনার সাইট URL

// ── Upload Paths ──────────────────────────────────────────────
// config/ ফোল্ডার থেকে এক ধাপ উপরে গিয়ে uploads/ এ যাই
// __DIR__ = /path/to/ecommerce/config
// dirname(__DIR__) = /path/to/ecommerce
$_rootPath    = dirname(__DIR__);        // ecommerce/ এর absolute path
$_uploadsPath = $_rootPath . DIRECTORY_SEPARATOR . 'uploads' . DIRECTORY_SEPARATOR;

// uploads ফোল্ডার না থাকলে তৈরি করো
if (!is_dir($_uploadsPath)) {
    @mkdir($_uploadsPath, 0755, true);
}

define('UPLOADS_PATH', $_uploadsPath);
define('UPLOADS_URL',  BASE_URL . '/uploads/');

// ── PDO Connection ────────────────────────────────────────────
try {
    $pdo = new PDO(
        "mysql:host=" . DB_HOST . ";dbname=" . DB_NAME . ";charset=" . DB_CHARSET,
        DB_USER,
        DB_PASS,
        [
            PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
            PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
            PDO::ATTR_EMULATE_PREPARES   => false,
        ]
    );
} catch (PDOException $e) {
    ob_end_clean();
    die('<!DOCTYPE html><html lang="bn"><head><meta charset="UTF-8"><title>DB Error</title></head><body>
    <div style="font-family:sans-serif;padding:28px;max-width:560px;margin:40px auto;
        background:#fff5f5;border:1px solid #fed7d7;border-radius:10px;color:#c53030;">
        <h2>⚠️ ডেটাবেজ সংযোগ ব্যর্থ!</h2>
        <p>' . htmlspecialchars($e->getMessage()) . '</p>
        <hr style="border-color:#fed7d7;margin:16px 0;">
        <p><strong>config/database.php</strong> ফাইলে এই তথ্যগুলো ঠিক করুন:</p>
        <ul style="margin:10px 0 0 20px;line-height:2;">
            <li>DB_HOST (সাধারণত: localhost)</li>
            <li>DB_NAME (আপনার ডেটাবেজের নাম)</li>
            <li>DB_USER (ডেটাবেজ username)</li>
            <li>DB_PASS (ডেটাবেজ password)</li>
        </ul>
    </div></body></html>');
}

// ── Session ───────────────────────────────────────────────────
if (session_status() === PHP_SESSION_NONE) {
    session_start();
}

// ═══════════════════════════════════════════════════════════════
// HELPER FUNCTIONS
// ═══════════════════════════════════════════════════════════════

/** XSS থেকে রক্ষা — সব output এ ব্যবহার করুন */
function e($str) {
    return htmlspecialchars((string)($str ?? ''), ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8');
}

/**
 * Safe Redirect — output buffer clear করে তারপর header পাঠায়
 * এটাই "headers already sent" সমস্যার সমাধান
 */
function redirect($url) {
    // সব open output buffer বন্ধ করো
    while (ob_get_level() > 0) {
        ob_end_clean();
    }
    header('Location: ' . $url, true, 302);
    exit;
}

/** Single setting পড়া */
function getSetting($pdo, $key) {
    $stmt = $pdo->prepare("SELECT setting_value FROM settings WHERE setting_key = ?");
    $stmt->execute([$key]);
    $row = $stmt->fetch();
    return $row ? $row['setting_value'] : null;
}

/** সব settings array হিসেবে পড়া */
function getAllSettings($pdo) {
    $stmt = $pdo->query("SELECT setting_key, setting_value FROM settings");
    $out  = [];
    while ($row = $stmt->fetch()) {
        $out[$row['setting_key']] = $row['setting_value'];
    }
    return $out;
}

/**
 * Image Upload
 * @param array  $file    $_FILES['fieldname']
 * @param string $folder  'products' | 'banner' | 'logo'
 * @return string|false   "products/img_xxx.jpg" অথবা false
 */
function uploadImage($file, $folder = 'products') {

    // ১. PHP upload error check
    if (!isset($file['error'])) return false;
    if ($file['error'] !== UPLOAD_ERR_OK) return false;

    // ২. File type check
    $allowedMimes = ['image/jpeg','image/png','image/gif','image/webp'];
    $extMap       = ['image/jpeg'=>'jpg','image/png'=>'png','image/gif'=>'gif','image/webp'=>'webp'];

    // finfo দিয়ে real MIME detect করো
    if (function_exists('finfo_open')) {
        $finfo = new finfo(FILEINFO_MIME_TYPE);
        $mime  = $finfo->file($file['tmp_name']);
    } else {
        // Fallback: extension দেখো
        $ext  = strtolower(pathinfo($file['name'], PATHINFO_EXTENSION));
        $mime = match($ext) {
            'jpg','jpeg' => 'image/jpeg',
            'png'        => 'image/png',
            'gif'        => 'image/gif',
            'webp'       => 'image/webp',
            default      => 'unknown'
        };
    }

    if (!in_array($mime, $allowedMimes)) return false;

    // ৩. Size check (8 MB max)
    if ($file['size'] > 8 * 1024 * 1024) return false;
    if ($file['size'] === 0) return false;

    // ৪. Destination directory
    $ext      = $extMap[$mime] ?? 'jpg';
    $filename = 'img_' . uniqid() . '_' . time() . '.' . $ext;
    $dir      = UPLOADS_PATH . $folder . DIRECTORY_SEPARATOR;

    // Directory তৈরি করো যদি না থাকে
    if (!is_dir($dir)) {
        if (!mkdir($dir, 0755, true)) {
            return false;
        }
    }

    // Permission ঠিক করো
    if (!is_writable($dir)) {
        @chmod($dir, 0755);
        if (!is_writable($dir)) {
            return false;
        }
    }

    // ৫. File move করো
    $destPath = $dir . $filename;
    if (!move_uploaded_file($file['tmp_name'], $destPath)) {
        return false;
    }

    // ৬. Relative path ফেরত দাও (DB তে সংরক্ষণের জন্য)
    return $folder . '/' . $filename;
}

/** Upload error কারণ বাংলায় */
function uploadError($file) {
    if (!isset($file['error'])) return 'ফাইল তথ্য নেই';
    $codes = [
        UPLOAD_ERR_OK        => 'সফল',
        UPLOAD_ERR_INI_SIZE  => 'php.ini-র upload_max_filesize সীমা অতিক্রম',
        UPLOAD_ERR_FORM_SIZE => 'MAX_FILE_SIZE সীমা অতিক্রম',
        UPLOAD_ERR_PARTIAL   => 'আংশিক আপলোড',
        UPLOAD_ERR_NO_FILE   => 'কোনো ফাইল নির্বাচন হয়নি',
        UPLOAD_ERR_NO_TMP_DIR=> 'tmp ফোল্ডার নেই',
        UPLOAD_ERR_CANT_WRITE=> 'ডিস্কে লেখা যাচ্ছে না',
        UPLOAD_ERR_EXTENSION => 'Extension বাধা দিচ্ছে',
    ];
    $msg = $codes[$file['error']] ?? 'অজানা ত্রুটি: ' . $file['error'];
    $msg .= ' | Path: ' . UPLOADS_PATH;
    $msg .= ' | Writable: ' . (is_writable(UPLOADS_PATH) ? 'হ্যাঁ' : 'না');
    return $msg;
}

/** Bengali-safe slug */
function makeSlug($text) {
    $slug = preg_replace('/[^\p{L}\p{N}]+/u', '-', $text);
    $slug = trim($slug, '-');
    $slug = mb_strtolower($slug, 'UTF-8');
    return $slug ?: ('item-' . uniqid());
}

// ── Auth Helpers ──────────────────────────────────────────────
function isLoggedIn()  { return !empty($_SESSION['user_id']); }
function isAdmin()     { return isset($_SESSION['role']) && $_SESSION['role'] === 'admin'; }
function isInvestor()  { return isset($_SESSION['role']) && $_SESSION['role'] === 'investor'; }

function requireAdmin() {
    if (!isAdmin()) {
        redirect(BASE_URL . '/admin/login.php');
    }
}
function requireLogin() {
    if (!isLoggedIn()) {
        redirect(BASE_URL . '/login.php');
    }
}
function requireInvestor() {
    if (!isInvestor() && !isAdmin()) {
        redirect(BASE_URL . '/login.php');
    }
}
