<?php
require_once __DIR__ . '/../config/db.php';

$action = $_GET['action'] ?? 'list';

// 1. GET: List Products
if ($action === 'list' && $_SERVER['REQUEST_METHOD'] === 'GET') {
    $search = $_GET['search'] ?? '';
    $category = $_GET['category'] ?? '';
    $sellerId = $_GET['seller_id'] ?? '';

    $sql = "SELECT p.*, u.name as seller_name, u.shop_name 
            FROM products p
            JOIN users u ON p.seller_id = u.id
            WHERE 1=1";
    
    $params = [];
    if (!empty($search)) {
        $sql .= " AND (p.name LIKE :search OR u.shop_name LIKE :search)";
        $params['search'] = "%{$search}%";
    }
    if (!empty($category) && $category !== 'all') {
        $sql .= " AND p.category = :cat";
        $params['cat'] = $category;
    }
    if (!empty($sellerId) && $sellerId !== 'all') {
        $sql .= " AND p.seller_id = :sid";
        $params['sid'] = $sellerId;
    }
    $sql .= " ORDER BY p.id DESC";

    $stmt = $pdo->prepare($sql);
    $stmt->execute($params);
    $products = $stmt->fetchAll();

    if (!empty($products)) {
        $productIds = array_column($products, 'id');
        $inClause = implode(',', array_fill(0, count($productIds), '?'));

        // Fetch Images
        $imgStmt = $pdo->prepare("SELECT product_id, image_path, is_primary FROM product_images WHERE product_id IN ($inClause) ORDER BY is_primary DESC, sort_order ASC");
        $imgStmt->execute($productIds);
        $allImages = $imgStmt->fetchAll();
        $imagesByProduct = [];
        foreach ($allImages as $img) {
            $imagesByProduct[$img['product_id']][] = $img['image_path'];
        }

        // Fetch Variants
        $varStmt = $pdo->prepare("SELECT id, product_id, name, color, size, price, stock, active FROM product_variants WHERE product_id IN ($inClause)");
        $varStmt->execute($productIds);
        $allVariants = $varStmt->fetchAll();
        $variantsByProduct = [];
        foreach ($allVariants as $var) {
            $variantsByProduct[$var['product_id']][] = $var;
        }

        foreach ($products as &$p) {
            $p['images'] = $imagesByProduct[$p['id']] ?? [];
            $p['variants'] = $variantsByProduct[$p['id']] ?? [];
            $p['primary_image'] = !empty($p['images']) ? $p['images'][0] : null;
            $p['image'] = $p['primary_image'] ?: 'https://images.unsplash.com/photo-1511707171634-5f897ff02aa9?auto=format&fit=crop&w=600&q=80';
        }
    }

    sendResponse(true, ['data' => $products]);
}

// 2. POST: Create or Update Product
if (($action === 'create' || $action === 'update') && $_SERVER['REQUEST_METHOD'] === 'POST') {
    $user = requireAuth(['admin', 'seller']);
    $pdo->beginTransaction();

    try {
        $id = $_POST['id'] ?? null;
        $name = trim($_POST['name'] ?? '');
        $category = $_POST['category'] ?? '';
        $description = $_POST['description'] ?? '';
        $price = (float)($_POST['price'] ?? 0);
        $stock = (int)($_POST['stock'] ?? 0);
        $sellerId = ($user['role'] === 'admin' && !empty($_POST['seller_id'])) ? $_POST['seller_id'] : $user['id'];

        if (empty($name) || empty($category)) {
            sendResponse(false, 'กรุณากรอกชื่อสินค้าและหมวดหมู่', 400);
        }

        if ($action === 'create') {
            $stmt = $pdo->prepare("INSERT INTO products (seller_id, name, category, description, price, stock) VALUES (?, ?, ?, ?, ?, ?)");
            $stmt->execute([$sellerId, $name, $category, $description, $price, $stock]);
            $id = $pdo->lastInsertId();
        } else {
            $stmt = $pdo->prepare("UPDATE products SET name=?, category=?, description=?, price=?, stock=? WHERE id=?");
            $stmt->execute([$name, $category, $description, $price, $stock, $id]);
        }

        // Upload Product Images
        if (!empty($_FILES['images']['name'][0])) {
            $uploadDir = __DIR__ . '/../uploads/products/';
            if (!is_dir($uploadDir)) mkdir($uploadDir, 0777, true);

            foreach ($_FILES['images']['tmp_name'] as $k => $tmp) {
                if ($_FILES['images']['error'][$k] === UPLOAD_ERR_OK) {
                    $ext = strtolower(pathinfo($_FILES['images']['name'][$k], PATHINFO_EXTENSION));
                    if (in_array($ext, ['jpg', 'jpeg', 'png', 'webp', 'gif'])) {
                        $filename = "p_{$id}_" . uniqid() . ".{$ext}";
                        if (move_uploaded_file($tmp, $uploadDir . $filename)) {
                            $imgStmt = $pdo->prepare("INSERT INTO product_images (product_id, image_path, is_primary) VALUES (?, ?, ?)");
                            $imgStmt->execute([$id, 'uploads/products/' . $filename, $k === 0 ? 1 : 0]);
                        }
                    }
                }
            }
        }

        // Variants Handling
        if (!empty($_POST['variants'])) {
            $vars = is_array($_POST['variants']) ? $_POST['variants'] : json_decode($_POST['variants'], true);
            if (is_array($vars)) {
                $pdo->prepare("DELETE FROM product_variants WHERE product_id = ?")->execute([$id]);
                $vStmt = $pdo->prepare("INSERT INTO product_variants (product_id, name, color, size, price, stock) VALUES (?, ?, ?, ?, ?, ?)");
                foreach ($vars as $v) {
                    $vStmt->execute([$id, $v['name'], $v['color'] ?? 'Default', $v['size'] ?? 'Default', $v['price'], $v['stock']]);
                }
            }
        }

        $pdo->commit();
        sendResponse(true, ['message' => 'บันทึกข้อมูลสินค้าเรียบร้อย', 'product_id' => $id]);
    } catch (Exception $e) {
        $pdo->rollBack();
        sendResponse(false, $e->getMessage(), 500);
    }
}

// 3. Update stock for a variant
if ($action === 'update_variant_stock' && $_SERVER['REQUEST_METHOD'] === 'POST') {
    requireAuth(['admin', 'seller']);
    $body = getJsonInput();
    $variantId = $body['variant_id'] ?? null;
    $stock = (int)($body['stock'] ?? 0);

    if ($variantId) {
        $pdo->prepare("UPDATE product_variants SET stock = ? WHERE id = ?")->execute([$stock, $variantId]);
        sendResponse(true, 'อัปเดตสต็อกเรียบร้อย');
    }
    sendResponse(false, 'Variant ID required', 400);
}

// 4. Toggle Product Active
if ($action === 'toggle_active' && $_SERVER['REQUEST_METHOD'] === 'POST') {
    requireAuth(['admin', 'seller']);
    $body = getJsonInput();
    $productId = $body['product_id'] ?? null;
    $active = (int)($body['active'] ?? 1);

    if ($productId) {
        $pdo->prepare("UPDATE products SET active = ? WHERE id = ?")->execute([$active, $productId]);
        sendResponse(true, 'อัปเดตสถานะการขายเรียบร้อย');
    }
    sendResponse(false, 'Product ID required', 400);
}
