<?php
/**
 * Heritage Voice — partner_booking.php
 * POST /api/partner-booking
 *
 * Đặt bàn / đặt phòng tại đối tác
 * - Nếu đối tác có website → trả về ref link
 * - Nếu không có website → gửi email thông báo cho đối tác
 *
 * Body JSON:
 *   partner_uuid  string  UUID đối tác
 *   guest_name    string  Tên khách
 *   guest_phone   string  SĐT khách
 *   guest_email   string  Email khách (optional)
 *   booking_type  string  table | room | service
 *   date          string  Ngày đặt (YYYY-MM-DD)
 *   time          string  Giờ (HH:MM) - cho đặt bàn
 *   guests        int     Số người
 *   note          string  Ghi chú thêm
 */

require_once __DIR__ . '/config.php';
require_once __DIR__ . '/db.php';
require_once __DIR__ . '/helpers.php';

function partner_booking() {
    $b = body();

    // Validate
    $uuid  = trim($b['partner_uuid'] ?? '');
    $name  = trim($b['guest_name']   ?? '');
    $phone = trim($b['guest_phone']  ?? '');
    if (!$uuid)  json_error('Thiếu partner_uuid');
    // Validate thời gian đặt phải trong tương lai
    $bdate = trim($b['date'] ?? '');
    $btime = trim($b['time'] ?? '12:00');
    $btype = trim($b['booking_type'] ?? 'table');
    if ($bdate) {
        $dtStr   = $bdate . ' ' . ($btype==='table' ? $btime : '00:00') . ':00';
        $bookDT  = new DateTime($dtStr);
        $nowDT   = new DateTime();
        if ($bookDT <= $nowDT) json_error('Thời gian đặt chỗ phải trong tương lai', 400);
    }
    if (!$name)  json_error('Vui lòng nhập họ tên');
    if (!$phone) json_error('Vui lòng nhập số điện thoại');

    // Lấy thông tin đối tác
    $ps = db()->prepare("SELECT * FROM hv_partners WHERE uuid = :uuid AND status = 'active'");
    $ps->execute([':uuid' => $uuid]);
    $partner = $ps->fetch();
    if (!$partner) json_error('Đối tác không tồn tại hoặc chưa hoạt động', 404);

    $booking_type = $b['booking_type'] ?? 'table';
    $date         = $b['date']         ?? '';
    $date_out     = $b['date_out']     ?? '';
    $time         = $b['time']         ?? '';
    $guests       = (int)($b['guests'] ?? 1);
    $note         = trim($b['note']    ?? '');
    $guest_email  = trim($b['guest_email'] ?? '');
    $room_id      = !empty($b['room_id']) ? (int)$b['room_id'] : null;
    $menu_items   = !empty($b['menu_items']) ? $b['menu_items'] : null;

    // Validate room
    $room = null;
    if ($booking_type === 'room' && $room_id) {
        $rs = db()->prepare("SELECT * FROM partner_rooms WHERE id=:id AND partner_id=:pid AND is_active=1");
        $rs->execute([':id'=>$room_id, ':pid'=>$partner['id']]);
        $room = $rs->fetch();
    }

    // Validate menu items & tính tổng
    $menu_total = 0;
    $menu_details = [];
    if ($menu_items && is_array($menu_items)) {
        foreach ($menu_items as $mid => $qty) {
            $ms = db()->prepare("SELECT * FROM partner_menu_items WHERE id=:id AND partner_id=:pid AND is_active=1");
            $ms->execute([':id'=>(int)$mid, ':pid'=>$partner['id']]);
            $item = $ms->fetch();
            if ($item) {
                $qty = max(1, (int)$qty);
                $menu_details[] = ['name'=>$item['name'], 'price'=>$item['price'], 'qty'=>$qty];
                $menu_total += $item['price'] * $qty;
            }
        }
    }

    // Tạo ref code
    $ref_code = strtoupper(substr(md5(uniqid()), 0, 12));

    // Lưu booking vào DB
    $uid  = get_token_uid();
    $anon = $_SERVER['HTTP_X_ANONYMOUS_ID'] ?? null;

    $note_full = "Khách: $name | SĐT: $phone | Ngày: $date" .
        ($date_out ? " → $date_out" : ($time ? " $time" : "")) .
        " | Số người: $guests" .
        ($room ? " | Phòng: {$room['name']}" : "") .
        ($menu_total > 0 ? " | Đặt trước: " . number_format($menu_total) . "đ" : "") .
        ($note ? " | Ghi chú: $note" : "");

    db()->prepare("
        INSERT INTO hv_bookings
            (ref_code, partner_id, user_id, anon_id, type, status,
             check_in, check_out, room_id, menu_items,
             note, guest_email, commission_rate, clicked_at, created_at, updated_at)
        VALUES
            (:ref, :pid, :uid, :anon, :type, 'referred',
             :cin, :cout, :rid, :menu,
             :note, :gemail, :rate, NOW(), NOW(), NOW())
    ")->execute([
        ':ref'    => $ref_code,
        ':pid'    => $partner['id'],
        ':uid'    => $uid,
        ':anon'   => $anon,
        ':type'   => $booking_type === 'room' ? 'room' : 'table',
        ':cin'    => $booking_type === 'room' ? $date : null,
        ':cout'   => $booking_type === 'room' ? $date_out : null,
        ':rid'    => $room_id,
        ':menu'   => $menu_details ? json_encode($menu_details, JSON_UNESCAPED_UNICODE) : null,
        ':note'   => $note_full,
        ':gemail' => $guest_email ?: null,
        ':rate'   => $partner['commission_rate'],
    ]);

    // Tăng click count
    db()->prepare("UPDATE hv_partners SET click_count = click_count + 1 WHERE id = :id")
        ->execute([':id' => $partner['id']]);

    // Nếu có website → trả về ref link (Hướng 1)
    if (!empty($partner['website'])) {
        // Đảm bảo website có https://
    $website = $partner['website'];
    if (!preg_match('/^https?:\/\//i', $website)) {
        $website = 'https://' . $website;
    }
    $ref_url = rtrim($website, '/')
            . '?ref=' . $ref_code
            . '&utm_source=heritage_voice'
            . '&utm_medium=booking';

        // Luôn gửi email thông báo cho đối tác
        $eInfo = ['ref_code'=>$ref_code,'guest_name'=>$name,'guest_phone'=>$phone,'guest_email'=>$guest_email,'booking_type'=>$booking_type,'date'=>$date,'date_out'=>$date_out,'time'=>$time,'guests'=>$guests,'note'=>$note,'room'=>$room,'menu_details'=>$menu_details,'menu_total'=>$menu_total];
        $sent2 = _send_booking_email($partner, $eInfo);
        if ($guest_email && filter_var($guest_email, FILTER_VALIDATE_EMAIL)) _send_guest_confirmation($partner, $eInfo, $guest_email);
        json_ok([
            'mode'     => 'redirect',
            'ref_code' => $ref_code,
            'url'      => $ref_url,
        ], 'Đang chuyển đến trang đặt chỗ...');
    }

    $eInfo = ['ref_code'=>$ref_code,'guest_name'=>$name,'guest_phone'=>$phone,'guest_email'=>$guest_email,'booking_type'=>$booking_type,'date'=>$date,'date_out'=>$date_out,'time'=>$time,'guests'=>$guests,'note'=>$note,'room'=>$room,'menu_details'=>$menu_details,'menu_total'=>$menu_total];
    _send_booking_email($partner, $eInfo);
    if ($guest_email && filter_var($guest_email, FILTER_VALIDATE_EMAIL)) _send_guest_confirmation($partner, $eInfo, $guest_email);

    json_ok([
        'mode'     => 'email',
        'ref_code' => $ref_code,
    ], 'Đặt chỗ thành công! Đối tác sẽ liên hệ xác nhận sớm.');
}

// ── GỬI EMAIL CHO ĐỐI TÁC ────────────────────────────────────
function _send_booking_email(array $partner, array $info): bool {
    try {
        $mailerPath = dirname(__DIR__) . '/PHPMailer/src/';
        require_once $mailerPath . 'Exception.php';
        require_once $mailerPath . 'PHPMailer.php';
        require_once $mailerPath . 'SMTP.php';

        $mail = new PHPMailer\PHPMailer\PHPMailer(true);
        $mail->isSMTP();
        $mail->Host       = MAIL_HOST;
        $mail->SMTPAuth   = true;
        $mail->Username   = MAIL_USER;
        $mail->Password   = MAIL_PASS;
        $mail->SMTPSecure = 'tls';
        $mail->Port       = MAIL_PORT;
        $mail->CharSet    = 'UTF-8';

        $mail->setFrom(MAIL_FROM, MAIL_FROM_NAME);
        // Gửi cho email đối tác
        $toEmail = !empty($partner['owner_email']) ? $partner['owner_email'] : MAIL_TO;
        $mail->addAddress($toEmail, $partner['owner_name'] ?? $partner['name']);
        // CC về Heritage Voice
        $mail->addCC(MAIL_TO, MAIL_TO_NAME);

        $typeLabel = $info['booking_type'] === 'room' ? '🛏 Đặt phòng' : '🍽 Đặt bàn';
        $mail->isHTML(true);
        $mail->Subject = "[Heritage Voice] {$typeLabel} mới — {$partner['name']} — Mã: {$info['ref_code']}";
        $mail->Body    = _booking_email_html($partner, $info);

        $mail->send();
        error_log('[HV Booking Mail OK] Sent to ' . $toEmail);
        return true;
    } catch (\Exception $e) {
        error_log('[HV Booking Mail ERROR] ' . $e->getMessage());
        return false;
    }
}

function _booking_email_html(array $partner, array $info): string {
    $typeLabel = $info['booking_type'] === 'room' ? '🛏 Đặt phòng' : '🍽 Đặt bàn';
    $isRoom    = $info['booking_type'] === 'room';
    $date      = $info['date'] ? date('d/m/Y', strtotime($info['date'])) : '—';
    $date_out  = !empty($info['date_out']) ? date('d/m/Y', strtotime($info['date_out'])) : null;
    $nights    = ($info['date'] && $info['date_out']) ? (int)((strtotime($info['date_out'])-strtotime($info['date']))/86400) : null;
    $time      = $info['time'] ?: '—';
    $note      = htmlspecialchars($info['note'] ?: 'Không có');
    $room      = $info['room'] ?? null;
    $menuRows  = '';
    if (!empty($info['menu_details'])) {
        foreach ($info['menu_details'] as $m) {
            $menuRows .= "<tr style='border-bottom:1px solid #f0ece8;'>
                <td style='padding:6px 0;color:#888;'>".htmlspecialchars($m['name'])." x{$m['qty']}</td>
                <td style='padding:6px 0;font-weight:700;text-align:right;'>".number_format($m['price']*$m['qty'])."đ</td>
            </tr>";
        }
    }

    return "
<html>
<body style='font-family:Arial,sans-serif;max-width:600px;margin:0 auto;background:#f5f2ee;padding:20px;'>
  <div style='background:#8B3E18;padding:24px;border-radius:12px 12px 0 0;text-align:center;'>
    <h2 style='color:#fff;margin:0;font-size:20px;'>🏛 Heritage Voice</h2>
    <p style='color:rgba(255,255,255,.8);margin:6px 0 0;font-size:14px;'>Thông báo đặt chỗ mới</p>
  </div>
  <div style='background:#fff;border:1px solid #e0d8d0;border-top:none;padding:24px;border-radius:0 0 12px 12px;'>

    <div style='background:#FDF6EE;border-radius:10px;padding:16px;margin-bottom:20px;border-left:4px solid #C0622A;'>
      <div style='font-size:13px;color:#888;margin-bottom:4px;'>Cơ sở nhận đặt chỗ</div>
      <div style='font-size:18px;font-weight:800;color:#2C1A0E;'>{$partner['name']}</div>
      <div style='font-size:13px;color:#666;margin-top:2px;'>{$typeLabel}</div>
    </div>

    <table style='width:100%;border-collapse:collapse;font-size:14px;'>
      <tr style='border-bottom:1px solid #f0ece8;'>
        <td style='padding:10px 0;color:#888;width:140px;'>Mã đặt chỗ</td>
        <td style='padding:10px 0;font-weight:800;color:#8B3E18;letter-spacing:2px;'>{$info['ref_code']}</td>
      </tr>
      <tr style='border-bottom:1px solid #f0ece8;'>
        <td style='padding:10px 0;color:#888;'>Họ tên khách</td>
        <td style='padding:10px 0;font-weight:700;'>".htmlspecialchars($info['guest_name'])."</td>
      </tr>
      <tr style='border-bottom:1px solid #f0ece8;'>
        <td style='padding:10px 0;color:#888;'>Số điện thoại</td>
        <td style='padding:10px 0;font-weight:700;color:#C0622A;'>
          <a href='tel:{$info['guest_phone']}' style='color:#C0622A;'>".htmlspecialchars($info['guest_phone'])."</a>
        </td>
      </tr>
      ".(!empty($info['guest_email']) ? "
      <tr style='border-bottom:1px solid #f0ece8;'>
        <td style='padding:10px 0;color:#888;'>Email khách</td>
        <td style='padding:10px 0;'>".htmlspecialchars($info['guest_email'])."</td>
      </tr>" : "")."
      ".($room ? "
      <tr style='border-bottom:1px solid #f0ece8;'>
        <td style='padding:10px 0;color:#888;'>Hạng phòng</td>
        <td style='padding:10px 0;font-weight:700;'>".htmlspecialchars($room['name'])." · ".number_format($room['price_night'])."đ/đêm</td>
      </tr>" : "")."
      <tr style='border-bottom:1px solid #f0ece8;'>
        <td style='padding:10px 0;color:#888;'>".($isRoom ? 'Nhận phòng' : 'Ngày')."</td>
        <td style='padding:10px 0;font-weight:700;'>{$date}</td>
      </tr>
      ".($isRoom && $date_out ? "
      <tr style='border-bottom:1px solid #f0ece8;'>
        <td style='padding:10px 0;color:#888;'>Trả phòng</td>
        <td style='padding:10px 0;font-weight:700;'>{$date_out}".($nights ? " ({$nights} đêm)" : "")."</td>
      </tr>" : "")."
      ".(!$isRoom ? "
      <tr style='border-bottom:1px solid #f0ece8;'>
        <td style='padding:10px 0;color:#888;'>Giờ</td>
        <td style='padding:10px 0;font-weight:700;'>{$time}</td>
      </tr>" : "")."
      ".($menuRows ? "
      <tr style='border-bottom:1px solid #f0ece8;'>
        <td colspan='2' style='padding:10px 0;'>
          <div style='font-size:12px;color:#888;margin-bottom:6px;font-weight:700;'>MÓN ĐẶT TRƯỚC</div>
          <table style='width:100%;'>{$menuRows}
            <tr><td style='padding:6px 0;font-weight:700;'>Tổng</td>
            <td style='padding:6px 0;font-weight:800;color:#8B3E18;text-align:right;'>".number_format($info['menu_total'])."đ</td></tr>
          </table>
        </td>
      </tr>" : "")."
      <tr style='border-bottom:1px solid #f0ece8;'>
        <td style='padding:10px 0;color:#888;'>Số người</td>
        <td style='padding:10px 0;font-weight:700;'>{$info['guests']} người</td>
      </tr>
      <tr>
        <td style='padding:10px 0;color:#888;vertical-align:top;'>Ghi chú</td>
        <td style='padding:10px 0;'>{$note}</td>
      </tr>
    </table>

    <div style='background:#E8F5E9;border-radius:10px;padding:14px;margin-top:20px;text-align:center;'>
      <div style='font-size:13px;color:#2E7D32;font-weight:700;'>
        ✅ Vui lòng liên hệ khách để xác nhận trong vòng 2 giờ
      </div>
      <a href='tel:{$info['guest_phone']}' style='display:inline-block;margin-top:10px;
        background:#2E7D32;color:#fff;padding:10px 24px;border-radius:20px;
        text-decoration:none;font-weight:700;font-size:14px;'>
        📞 Gọi ngay cho khách
      </a>
    </div>

    <div style='margin-top:20px;padding-top:16px;border-top:1px solid #f0ece8;
      font-size:12px;color:#999;text-align:center;'>
      Email này được gửi tự động từ hệ thống Heritage Voice.<br/>
      Mọi thắc mắc: <a href='mailto:partner@heritage-voice.vn' style='color:#8B3E18;'>partner@heritage-voice.vn</a>
    </div>
  </div>
</body>
</html>";
}

// ── GỬI EMAIL XÁC NHẬN CHO KHÁCH ─────────────────────────────
function _send_guest_confirmation(array $partner, array $info, string $guestEmail): void {
    try {
        $mailerPath = dirname(__DIR__) . '/PHPMailer/src/';
        require_once $mailerPath . 'Exception.php';
        require_once $mailerPath . 'PHPMailer.php';
        require_once $mailerPath . 'SMTP.php';

        $mail = new PHPMailer\PHPMailer\PHPMailer(true);
        $mail->isSMTP();
        $mail->Host       = MAIL_HOST;
        $mail->SMTPAuth   = true;
        $mail->Username   = MAIL_USER;
        $mail->Password   = MAIL_PASS;
        $mail->SMTPSecure = 'tls';
        $mail->Port       = MAIL_PORT;
        $mail->CharSet    = 'UTF-8';

        $mail->setFrom(MAIL_FROM, MAIL_FROM_NAME);
        $mail->addAddress($guestEmail, $info['guest_name']);

        $isRoom   = ($info['booking_type'] ?? '') === 'room';
        $date     = $info['date']     ? date('d/m/Y', strtotime($info['date']))     : '—';
        $date_out = !empty($info['date_out']) ? date('d/m/Y', strtotime($info['date_out'])) : null;
        $nights   = ($info['date'] && !empty($info['date_out']))
                    ? (int)((strtotime($info['date_out']) - strtotime($info['date'])) / 86400) : null;
        $gName  = htmlspecialchars($info['guest_name']);
        $pName  = htmlspecialchars($partner['name']);
        $pAddr  = htmlspecialchars($partner['address'] ?? '');
        $pPhone = $partner['phone'] ?? '';
        $ref    = $info['ref_code'];
        $note   = htmlspecialchars($info['note'] ?: '');

        // Build menu rows
        $gMenuRows = ''; $gMenuTotal = 0;
        if (!empty($info['menu_details'])) {
            foreach ($info['menu_details'] as $m) {
                $sub = $m['price'] * $m['qty'];
                $gMenuTotal += $sub;
                $mn = htmlspecialchars($m['name']);
                $gMenuRows .= "<tr style='border-bottom:1px solid #f0ece8;'><td style='padding:6px 0;color:#555;'>{$mn} x{$m['qty']}</td><td style='padding:6px 0;font-weight:700;text-align:right;'>" . number_format($sub) . "đ</td></tr>";
            }
        }

        $mail->isHTML(true);
        $mail->Subject = "[Heritage Voice] Xác nhận đặt chỗ tại {$partner['name']} — Mã: {$info['ref_code']}";
        ob_start();
        echo '<!DOCTYPE html><html><body style="font-family:Arial,sans-serif;max-width:600px;margin:0 auto;background:#f5f2ee;padding:20px;">';
        echo '<div style="background:#8B3E18;padding:24px;border-radius:12px 12px 0 0;text-align:center;"><h2 style="color:#fff;margin:0;">🏛 Heritage Voice</h2><p style="color:rgba(255,255,255,.8);margin:6px 0 0;">Xác nhận yêu cầu đặt chỗ</p></div>';
        echo '<div style="background:#fff;border:1px solid #e0d8d0;border-top:none;padding:24px;border-radius:0 0 12px 12px;">';
        echo "<p style='font-size:15px;color:#2C1A0E;'>Xin chào <strong>{$gName}</strong>,</p>";
        echo "<p style='font-size:14px;color:#666;'>Yêu cầu đặt chỗ của bạn đã được ghi nhận:</p>";
        echo "<div style='background:#FDF6EE;border-radius:10px;padding:16px;margin:16px 0;'>";
        echo "<div style='font-size:18px;font-weight:800;color:#2C1A0E;margin-bottom:8px;'>{$pName}</div>";
        echo "<div style='font-size:14px;color:#666;'>📍 {$pAddr}</div>";
        if ($pPhone) echo "<div style='font-size:14px;color:#C0622A;margin-top:4px;'>📞 <a href='tel:{$pPhone}' style='color:#C0622A;'>{$pPhone}</a></div>";
        echo '</div>';
        echo "<table style='width:100%;border-collapse:collapse;font-size:14px;'>";
        echo "<tr style='border-bottom:1px solid #f0ece8;'><td style='padding:8px 0;color:#888;width:130px;'>Mã đặt chỗ</td><td style='padding:8px 0;font-weight:800;color:#8B3E18;letter-spacing:2px;'>{$ref}</td></tr>";
        echo "<tr style='border-bottom:1px solid #f0ece8;'><td style='padding:8px 0;color:#888;'>" . ($isRoom ? 'Nhận phòng' : 'Ngày') . "</td><td style='padding:8px 0;font-weight:700;'>{$date}</td></tr>";
        if ($isRoom && $date_out) echo "<tr style='border-bottom:1px solid #f0ece8;'><td style='padding:8px 0;color:#888;'>Trả phòng</td><td style='padding:8px 0;font-weight:700;'>{$date_out}" . ($nights ? " ({$nights} đêm)" : '') . "</td></tr>";
        if (!$isRoom) echo "<tr style='border-bottom:1px solid #f0ece8;'><td style='padding:8px 0;color:#888;'>Giờ</td><td style='padding:8px 0;font-weight:700;'>{$info['time']}</td></tr>";
        echo "<tr style='border-bottom:1px solid #f0ece8;'><td style='padding:8px 0;color:#888;'>Số người</td><td style='padding:8px 0;font-weight:700;'>{$info['guests']} người</td></tr>";
        if ($gMenuRows) {
            echo "<tr><td colspan='2' style='padding:10px 0;'><div style='font-size:12px;font-weight:700;color:#888;margin-bottom:6px;'>MÓN ĐẶT TRƯỚC</div>";
            echo "<table style='width:100%;'>{$gMenuRows}<tr><td style='padding:6px 0;font-weight:700;'>Tổng</td><td style='padding:6px 0;font-weight:800;color:#8B3E18;text-align:right;'>" . number_format($gMenuTotal) . "đ</td></tr></table></td></tr>";
        }
        if ($note) echo "<tr><td style='padding:8px 0;color:#888;vertical-align:top;'>Ghi chú</td><td style='padding:8px 0;'>{$note}</td></tr>";
        echo '</table>';
        echo "<div style='background:#FFF8E1;border-radius:10px;padding:14px;margin-top:16px;font-size:13px;color:#856404;'>⚠️ Đây là xác nhận <strong>yêu cầu</strong>. Cơ sở sẽ liên hệ với bạn để xác nhận chính thức trong vòng 2 giờ.</div>";
        echo "<div style='margin-top:20px;font-size:12px;color:#999;text-align:center;border-top:1px solid #f0ece8;padding-top:16px;'>Powered by Heritage Voice · <a href='https://tads.ctv.hanoi.vn' style='color:#8B3E18;'>tads.ctv.hanoi.vn</a></div>";
        echo '</div></body></html>';
        $mail->Body = ob_get_clean();

        $mail->send();
    } catch (\Exception $e) {
        error_log('[HV Guest Mail ERROR] ' . $e->getMessage());
    }
}



// ── ROOMS API ─────────────────────────────────────────────────
function partner_rooms_list(string $uuid): void {
    $ps = db()->prepare("SELECT id FROM hv_partners WHERE uuid=:u AND status='active'");
    $ps->execute([':u' => $uuid]);
    $p = $ps->fetch();
    if (!$p) json_error('Không tìm thấy đối tác', 404);

    $rows = db()->prepare("SELECT * FROM partner_rooms WHERE partner_id=:pid AND is_active=1 ORDER BY price_night ASC");
    $rows->execute([':pid' => $p['id']]);
    $data = $rows->fetchAll();
    foreach ($data as &$row) { $row['images'] = $row['images'] ? json_decode($row['images'], true) : []; }
    json_ok($data);
}

function partner_rooms_save(string $uuid): void {
    require_auth();
    $ps = db()->prepare("SELECT id FROM hv_partners WHERE uuid=:u");
    $ps->execute([':u' => $uuid]);
    $p = $ps->fetch();
    if (!$p) json_error('Không tìm thấy đối tác', 404);

    $b = body();
    $items = $b['rooms'] ?? [];
    db()->prepare("UPDATE partner_rooms SET is_active=0 WHERE partner_id=:pid")->execute([':pid'=>$p['id']]);
    foreach ($items as $r) {
        if (empty($r['name'])) continue;
        $imgs = $r['images'] ?? null;
        if (is_array($imgs)) $imgs = json_encode(array_values(array_filter($imgs)));
        db()->prepare("
            INSERT INTO partner_rooms (partner_id, name, description, price_night, capacity, quantity, amenities, images, is_active)
            VALUES (:pid,:name,:desc,:price,:cap,:qty,:amen,:imgs,1)
            ON DUPLICATE KEY UPDATE name=VALUES(name),description=VALUES(description),
            price_night=VALUES(price_night),capacity=VALUES(capacity),
            quantity=VALUES(quantity),amenities=VALUES(amenities),images=VALUES(images),is_active=1
        ")->execute([
            ':pid'  => $p['id'], ':name' => $r['name'],
            ':desc' => $r['description'] ?? null, ':price' => (int)($r['price_night']??0),
            ':cap'  => (int)($r['capacity']??2), ':qty' => (int)($r['quantity']??1),
            ':amen' => $r['amenities'] ?? null, ':imgs' => $imgs,
        ]);
    }
    json_ok(null, 'Đã lưu danh sách phòng');
}

// ── MENU API ──────────────────────────────────────────────────
function partner_menu_list(string $uuid): void {
    $ps = db()->prepare("SELECT id FROM hv_partners WHERE uuid=:u AND status='active'");
    $ps->execute([':u' => $uuid]);
    $p = $ps->fetch();
    if (!$p) json_error('Không tìm thấy đối tác', 404);

    $rows = db()->prepare("SELECT * FROM partner_menu_items WHERE partner_id=:pid AND is_active=1 ORDER BY category, name");
    $rows->execute([':pid' => $p['id']]);
    $data = $rows->fetchAll();
    foreach ($data as &$row) {
        $row['images'] = $row['images'] ? json_decode($row['images'], true) : [];
    }
    json_ok($data);
}

function partner_menu_save(string $uuid): void {
    require_auth();
    $ps = db()->prepare("SELECT id FROM hv_partners WHERE uuid=:u");
    $ps->execute([':u' => $uuid]);
    $p = $ps->fetch();
    if (!$p) json_error('Không tìm thấy đối tác', 404);

    $b = body();
    $items = $b['items'] ?? [];
    db()->prepare("UPDATE partner_menu_items SET is_active=0 WHERE partner_id=:pid")->execute([':pid'=>$p['id']]);
    foreach ($items as $m) {
        if (empty($m['name'])) continue;
        $mimgs = $m['images'] ?? null;
        if (is_array($mimgs)) $mimgs = json_encode(array_values(array_filter($mimgs)));
        db()->prepare("
            INSERT INTO partner_menu_items (partner_id, category, name, description, price, images, is_active)
            VALUES (:pid,:cat,:name,:desc,:price,:imgs,1)
            ON DUPLICATE KEY UPDATE category=VALUES(category),name=VALUES(name),
            description=VALUES(description),price=VALUES(price),images=VALUES(images),is_active=1
        ")->execute([
            ':pid'  => $p['id'], ':cat' => $m['category'] ?? 'Thực đơn',
            ':name' => $m['name'], ':desc' => $m['description'] ?? null,
            ':price' => (int)($m['price']??0), ':imgs' => $mimgs,
        ]);
    }
    json_ok(null, 'Đã lưu thực đơn');
}

function booking_save_proof(): void {
    $b = body();
    $ref   = trim($b['ref_code'] ?? '');
    $proof = trim($b['proof_url'] ?? '');
    if (!$ref || !$proof) json_error('Thiếu thông tin');

    db()->prepare("
        UPDATE hv_bookings SET payment_proof_url=:p, payment_status='pending_transfer', updated_at=NOW()
        WHERE ref_code=:r
    ")->execute([':p'=>$proof, ':r'=>$ref]);

    json_ok(null, 'Đã lưu ảnh xác nhận thanh toán');
}

function booking_upload_proof(): void {
    try {
    rate_limit('proof_upload', 5, 60);

    if (empty($_FILES['image'])) json_error('Không có file');
    $file = $_FILES['image'];
    if ($file['error'] !== UPLOAD_ERR_OK) json_error('Lỗi upload');

    $maxSize = 5 * 1024 * 1024; // 5MB
    if ($file['size'] > $maxSize) json_error('File quá lớn, tối đa 5MB');

    $mime = mime_content_type($file['tmp_name']);
    if (!in_array($mime, ['image/jpeg','image/png','image/webp','image/gif'])) json_error('Chỉ chấp nhận ảnh');

    $ref = trim($_POST['ref_code'] ?? '');
    if (!$ref) json_error('Thiếu mã đặt chỗ');

    // Kiểm tra booking tồn tại
    $bs = db()->prepare("SELECT b.id, p.uuid as puuid FROM hv_bookings b JOIN hv_partners p ON p.id=b.partner_id WHERE b.ref_code=:r");
    $bs->execute([':r'=>$ref]);
    $brow = $bs->fetch();
    if (!$brow) json_error('Mã đặt chỗ không hợp lệ', 404);
    $puuid = $brow['puuid'] ?? 'unknown';

    // Lưu vào thư mục proof
    $dir = dirname(__DIR__) . '/uploads/partners/' . $puuid . '/proofs/';
    if (!is_dir($dir)) mkdir($dir, 0755, true);

    $ext      = $mime === 'image/png' ? 'png' : 'jpg';
    $filename = 'proof_' . $ref . '_' . time() . '.' . $ext;
    $savePath = $dir . $filename;

    // Resize và lưu
    if ($mime === 'image/png')  $img = imagecreatefrompng($file['tmp_name']);
    elseif ($mime === 'image/webp') $img = imagecreatefromwebp($file['tmp_name']);
    else $img = imagecreatefromjpeg($file['tmp_name']);

    if (!$img) json_error('Không thể xử lý ảnh');

    $w = imagesx($img); $h = imagesy($img);
    $maxW = 1200;
    if ($w > $maxW) {
        $newH = (int)($h * $maxW / $w);
        $resized = imagecreatetruecolor($maxW, $newH);
        imagecopyresampled($resized, $img, 0,0,0,0, $maxW, $newH, $w, $h);
        $img = $resized;
    }
    imagejpeg($img, $savePath, 85);
    imagedestroy($img);

    $baseUrl = 'https://tads.ctv.hanoi.vn';
    $fileUrl = $baseUrl . '/uploads/partners/' . $puuid . '/proofs/' . $filename;

    // Cập nhật proof_url vào booking
    db()->prepare("UPDATE hv_bookings SET payment_proof_url=:p, payment_status='pending_transfer', updated_at=NOW() WHERE ref_code=:r")
        ->execute([':p'=>$fileUrl, ':r'=>$ref]);

    json_ok(['url'=>$fileUrl], 'Đã tải ảnh lên');
    } catch (Throwable $e) {
        json_error($e->getMessage(), 500);
    }
}
