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

$currentUser = requireAuth();
$db = getDB();
$action = $_GET['action'] ?? 'list';
$id = intval($_GET['id'] ?? 0);

header('Content-Type: application/json');

switch ($action) {

    case 'list':
        $where = "1=1"; $params = [];
        if (!empty($_GET['booking_id'])) { $where .= " AND p.booking_id = ?"; $params[] = intval($_GET['booking_id']); }
        if (!empty($_GET['status'])) { $where .= " AND p.status = ?"; $params[] = $_GET['status']; }
        $stmt = $db->prepare("
            SELECT p.*, b.booking_ref, b.destination, c.name AS customer_name, u.name AS recorded_by_name
            FROM payments p
            LEFT JOIN bookings b ON p.booking_id = b.id
            LEFT JOIN customers c ON b.customer_id = c.id
            LEFT JOIN users u ON p.recorded_by = u.id
            WHERE $where
            ORDER BY p.created_at DESC
        ");
        $stmt->execute($params);
        jsonResponse(['success' => true, 'data' => $stmt->fetchAll()]);
        break;

    case 'stats':
        $totalPaid = $db->query("SELECT COALESCE(SUM(amount),0) as total FROM payments WHERE status='completed'")->fetch()['total'];
        $thisMonth = $db->query("SELECT COALESCE(SUM(amount),0) as total FROM payments WHERE status='completed' AND MONTH(paid_date)=MONTH(NOW()) AND YEAR(paid_date)=YEAR(NOW())")->fetch()['total'];
        $outstanding = $db->query("SELECT COALESCE(SUM(b.total_amount - COALESCE(paid.amt,0)),0) as total FROM bookings b LEFT JOIN (SELECT booking_id, SUM(amount) as amt FROM payments WHERE status='completed' GROUP BY booking_id) paid ON paid.booking_id = b.id WHERE b.status != 'cancelled'")->fetch()['total'];
        jsonResponse(['success' => true, 'data' => ['total_paid' => $totalPaid, 'this_month' => $thisMonth, 'outstanding' => max(0, $outstanding)]]);
        break;

    case 'create':
        $input = getInput();
        $bookingId = intval($input['booking_id'] ?? 0);
        $amount = floatval($input['amount'] ?? 0);
        $stmt = $db->prepare("
            INSERT INTO payments (booking_id, amount, method, transaction_ref, paid_date, status, notes, recorded_by)
            VALUES (?, ?, ?, ?, ?, ?, ?, ?)
        ");
        $stmt->execute([
            $bookingId,
            $amount,
            $input['method'] ?? 'card',
            trim($input['transaction_ref'] ?? ''),
            $input['paid_date'] ?: date('Y-m-d'),
            $input['status'] ?? 'completed',
            trim($input['notes'] ?? ''),
            $currentUser['id']
        ]);
        $newId = $db->lastInsertId();
        // Update booking paid_amount
        $db->prepare("UPDATE bookings SET paid_amount = (SELECT COALESCE(SUM(amount),0) FROM payments WHERE booking_id=? AND status='completed') WHERE id=?")->execute([$bookingId, $bookingId]);
        logActivity($currentUser['id'], 'payment_recorded', 'payment', $newId, "Payment £$amount for booking ID: $bookingId");
        jsonResponse(['success' => true, 'id' => $newId, 'message' => 'Payment recorded']);
        break;

    case 'update_status':
        $input = getInput();
        $allowed = ['pending','completed','refunded','failed'];
        $status = $input['status'] ?? '';
        if (!in_array($status, $allowed)) jsonResponse(['success' => false, 'error' => 'Invalid status']);
        $db->prepare("UPDATE payments SET status=? WHERE id=?")->execute([$status, $id]);
        // Re-calculate booking paid
        $payment = $db->prepare("SELECT booking_id FROM payments WHERE id=?")->execute([$id]);
        $pay = $db->query("SELECT booking_id FROM payments WHERE id=$id")->fetch();
        if ($pay) {
            $db->prepare("UPDATE bookings SET paid_amount = (SELECT COALESCE(SUM(amount),0) FROM payments WHERE booking_id=? AND status='completed') WHERE id=?")->execute([$pay['booking_id'], $pay['booking_id']]);
        }
        jsonResponse(['success' => true, 'message' => 'Payment status updated']);
        break;

    case 'delete':
        $pay = $db->query("SELECT booking_id FROM payments WHERE id=$id")->fetch();
        $db->prepare("DELETE FROM payments WHERE id=?")->execute([$id]);
        if ($pay) {
            $db->prepare("UPDATE bookings SET paid_amount = (SELECT COALESCE(SUM(amount),0) FROM payments WHERE booking_id=? AND status='completed') WHERE id=?")->execute([$pay['booking_id'], $pay['booking_id']]);
        }
        jsonResponse(['success' => true, 'message' => 'Payment deleted']);
        break;

    default:
        jsonResponse(['success' => false, 'error' => 'Unknown action'], 400);
}
