<?php
header("Access-Control-Allow-Origin: *");
header("Access-Control-Allow-Methods: GET, POST, OPTIONS");
header("Access-Control-Allow-Headers: Content-Type, Authorization, X-Requested-With");
header("Content-Type: application/json; charset=utf-8");

if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') { exit; }

$db_host = 'localhost';
$db_name = 'feclkhfswqmv_book_manager';
$db_user = 'feclkhfswqmv_hailvh';
$db_pass = '@HaiHang4832';

try {
    $pdo = new PDO("mysql:host=$db_host;dbname=$db_name;charset=utf8mb4", $db_user, $db_pass, [
        PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
        PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC
    ]);
    
    // 1. Đảm bảo cấu trúc bảng chuẩn
    $pdo->exec("CREATE TABLE IF NOT EXISTS books (
        code VARCHAR(50) NOT NULL PRIMARY KEY,
        name VARCHAR(255) NOT NULL,
        pages INT DEFAULT 0,
        size VARCHAR(50),
        has_file TINYINT(1) DEFAULT 0
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;");

    $pdo->exec("CREATE TABLE IF NOT EXISTS orders (
        id VARCHAR(100) PRIMARY KEY,
        file_name VARCHAR(255),
        date_str VARCHAR(50),
        full_date DATETIME,
        is_paid TINYINT(1) DEFAULT 0
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;");

    // TỰ ĐỘNG CẬP NHẬT CỘT 'is_paid' NẾU THIẾU (Sửa lỗi Unknown column 'is_paid')
    try {
        $checkPaid = $pdo->query("SHOW COLUMNS FROM orders LIKE 'is_paid'")->fetch();
        if (!$checkPaid) {
            $pdo->exec("ALTER TABLE orders ADD COLUMN is_paid TINYINT(1) DEFAULT 0");
        }
    } catch (Exception $e) { /* Bỏ qua nếu đã có */ }

    $pdo->exec("CREATE TABLE IF NOT EXISTS order_items (
        id INT AUTO_INCREMENT PRIMARY KEY,
        order_id VARCHAR(100),
        book_code VARCHAR(50),
        book_name VARCHAR(255),
        book_pages INT,
        book_size VARCHAR(50),
        qty_bw INT,
        qty_color INT,
        cost_bw DECIMAL(15,2),
        cost_color DECIMAL(15,2),
        total_amount DECIMAL(15,2),
        applied_price_bw DECIMAL(10,2),
        applied_price_color DECIMAL(10,2),
        FOREIGN KEY (order_id) REFERENCES orders(id) ON DELETE CASCADE
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;");

    $pdo->exec("CREATE TABLE IF NOT EXISTS debts (
        id VARCHAR(100) PRIMARY KEY,
        amount DECIMAL(15,2),
        note TEXT,
        date_str VARCHAR(50),
        is_paid TINYINT(1) DEFAULT 0,
        created_at_milestone VARCHAR(100)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;");

    $pdo->exec("CREATE TABLE IF NOT EXISTS system_config (
        config_key VARCHAR(100) PRIMARY KEY,
        config_value TEXT
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;");

} catch (\PDOException $e) {
    echo json_encode(['success' => false, 'error' => 'Kết nối DB thất bại: ' . $e->getMessage()]); exit;
}

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

if ($action === 'ping') {
    echo json_encode(['success' => true, 'message' => 'pong']);
    exit;
}

if ($action === 'load_all') {
    try {
        $data = [
            'success' => true,
            'books' => $pdo->query("SELECT * FROM books ORDER BY code ASC")->fetchAll(),
            'orders' => $pdo->query("SELECT * FROM orders ORDER BY full_date DESC")->fetchAll(),
            'order_items' => $pdo->query("SELECT * FROM order_items")->fetchAll(),
            'debts' => $pdo->query("SELECT * FROM debts ORDER BY created_at_milestone DESC")->fetchAll(),
            'config' => null
        ];
        $resConf = $pdo->query("SELECT config_value FROM system_config WHERE config_key='payment_config'");
        if ($confRow = $resConf->fetch()) { $data['config'] = json_decode($confRow['config_value']); }
        echo json_encode($data);
    } catch (Exception $e) {
        echo json_encode(['success' => false, 'error' => $e->getMessage()]);
    }
} 
elseif ($action === 'save' && $_SERVER['REQUEST_METHOD'] === 'POST') {
    $input = json_decode(file_get_contents('php://input'), true);
    $is_batch = isset($input['is_batch']) && $input['is_batch'] === true;
    
    $pdo->beginTransaction();
    try {
        if ($is_batch) {
            foreach ($input['data'] as $batch) {
                $table = $batch['table'];
                $rows = $batch['rows'];
                foreach ($rows as $row) {
                    saveRow($pdo, $table, $row);
                }
            }
        } else {
            $table = $input['key'];
            $rows = $input['data'];
            foreach ($rows as $row) {
                saveRow($pdo, $table, $row);
            }
        }
        $pdo->commit();
        echo json_encode(['success' => true]);
    } catch (Exception $e) {
        $pdo->rollBack();
        echo json_encode(['success' => false, 'error' => $e->getMessage()]);
    }
}
elseif ($action === 'delete') {
    $input = json_decode(file_get_contents('php://input'), true);
    $table = $input['table'] ?? '';
    $id = $input['id'] ?? '';
    if (!$table || !$id) { echo json_encode(['success' => false, 'error' => 'Thiếu thông tin']); exit; }

    try {
        $pk = ($table === 'books') ? 'code' : 'id';
        $stmt = $pdo->prepare("DELETE FROM $table WHERE $pk = ?");
        $stmt->execute([trim((string)$id)]);
        echo json_encode(['success' => true]);
    } catch (Exception $e) {
        echo json_encode(['success' => false, 'error' => $e->getMessage()]);
    }
}

function saveRow($pdo, $table, $row) {
    $cleanRow = array_filter($row, function($v) { return $v !== null; });
    if (empty($cleanRow)) return;

    $cols = array_keys($cleanRow);
    $placeholders = array_map(fn($c) => ":$c", $cols);
    
    $updates = [];
    foreach ($cols as $c) {
        if ($c !== 'id' && $c !== 'code') {
            $updates[] = "$c = VALUES($c)";
        }
    }
    
    $sql = "INSERT INTO $table (" . implode(',', $cols) . ") VALUES (" . implode(',', $placeholders) . ")";
    if (!empty($updates)) {
        $sql .= " ON DUPLICATE KEY UPDATE " . implode(',', $updates);
    }
    
    $stmt = $pdo->prepare($sql);
    $stmt->execute($cleanRow);
}
?>