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

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

header('Content-Type: application/json');
header('Access-Control-Allow-Origin: *');

switch ($action) {

    case 'list':
        $where = "1=1";
        $params = [];

        if (!empty($_GET['status'])) {
            $where .= " AND l.status = ?";
            $params[] = $_GET['status'];
        }
        if (!empty($_GET['assigned_to'])) {
            $where .= " AND l.assigned_to = ?";
            $params[] = intval($_GET['assigned_to']);
        }
        if (!empty($_GET['source_id'])) {
            $where .= " AND l.source_id = ?";
            $params[] = intval($_GET['source_id']);
        }
        if (!empty($_GET['search'])) {
            $where .= " AND (l.name LIKE ? OR l.phone LIKE ? OR l.email LIKE ? OR l.destination LIKE ?)";
            $s = '%' . $_GET['search'] . '%';
            $params = array_merge($params, [$s, $s, $s, $s]);
        }

        $sort = in_array($_GET['sort'] ?? '', ['name','created_at','travel_date','budget']) ? $_GET['sort'] : 'l.created_at';
        $dir = ($_GET['dir'] ?? 'desc') === 'asc' ? 'ASC' : 'DESC';

        $stmt = $db->prepare("
            SELECT l.*, 
                   ls.name AS source_name, ls.color AS source_color,
                   u.name AS agent_name
            FROM leads l
            LEFT JOIN lead_sources ls ON l.source_id = ls.id
            LEFT JOIN users u ON l.assigned_to = u.id
            WHERE $where
            ORDER BY $sort $dir
        ");
        $stmt->execute($params);
        jsonResponse(['success' => true, 'data' => $stmt->fetchAll()]);
        break;

    case 'get':
        $stmt = $db->prepare("
            SELECT l.*, ls.name AS source_name, ls.color AS source_color, u.name AS agent_name
            FROM leads l
            LEFT JOIN lead_sources ls ON l.source_id = ls.id
            LEFT JOIN users u ON l.assigned_to = u.id
            WHERE l.id = ?
        ");
        $stmt->execute([$id]);
        $lead = $stmt->fetch();
        if (!$lead) jsonResponse(['success' => false, 'error' => 'Lead not found'], 404);
        jsonResponse(['success' => true, 'data' => $lead]);
        break;

    case 'create':
        $input = getInput();
        $stmt = $db->prepare("
            INSERT INTO leads (name, phone, email, destination, travel_date, return_date, num_passengers, budget, source_id, status, assigned_to, priority, notes, follow_up_date)
            VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
        ");
        $stmt->execute([
            trim($input['name'] ?? ''),
            trim($input['phone'] ?? ''),
            trim($input['email'] ?? ''),
            trim($input['destination'] ?? ''),
            $input['travel_date'] ?: null,
            $input['return_date'] ?: null,
            intval($input['num_passengers'] ?? 1),
            floatval($input['budget'] ?? 0),
            intval($input['source_id'] ?? 0) ?: null,
            $input['status'] ?? 'new',
            intval($input['assigned_to'] ?? 0) ?: null,
            $input['priority'] ?? 'medium',
            trim($input['notes'] ?? ''),
            $input['follow_up_date'] ?: null,
        ]);
        $newId = $db->lastInsertId();
        logActivity($currentUser['id'], 'created', 'lead', $newId, "Created lead: " . ($input['name'] ?? ''));
        jsonResponse(['success' => true, 'id' => $newId, 'message' => 'Lead created successfully']);
        break;

    case 'update':
        $input = getInput();
        $stmt = $db->prepare("
            UPDATE leads SET name=?, phone=?, email=?, destination=?, travel_date=?, return_date=?, num_passengers=?,
            budget=?, source_id=?, status=?, assigned_to=?, priority=?, notes=?, follow_up_date=?
            WHERE id=?
        ");
        $stmt->execute([
            trim($input['name'] ?? ''),
            trim($input['phone'] ?? ''),
            trim($input['email'] ?? ''),
            trim($input['destination'] ?? ''),
            $input['travel_date'] ?: null,
            $input['return_date'] ?: null,
            intval($input['num_passengers'] ?? 1),
            floatval($input['budget'] ?? 0),
            intval($input['source_id'] ?? 0) ?: null,
            $input['status'] ?? 'new',
            intval($input['assigned_to'] ?? 0) ?: null,
            $input['priority'] ?? 'medium',
            trim($input['notes'] ?? ''),
            $input['follow_up_date'] ?: null,
            $id
        ]);
        logActivity($currentUser['id'], 'updated', 'lead', $id, "Updated lead: " . ($input['name'] ?? ''));
        jsonResponse(['success' => true, 'message' => 'Lead updated successfully']);
        break;

    case 'update_status':
        $input = getInput();
        $status = $input['status'] ?? '';
        $allowed = ['new','contacted','quoted','booked','closed','lost'];
        if (!in_array($status, $allowed)) jsonResponse(['success' => false, 'error' => 'Invalid status']);
        $db->prepare("UPDATE leads SET status=? WHERE id=?")->execute([$status, $id]);
        logActivity($currentUser['id'], 'status_change', 'lead', $id, "Lead status changed to: $status");
        jsonResponse(['success' => true, 'message' => 'Status updated']);
        break;

    case 'delete':
        $db->prepare("DELETE FROM leads WHERE id=?")->execute([$id]);
        logActivity($currentUser['id'], 'deleted', 'lead', $id, "Deleted lead ID: $id");
        jsonResponse(['success' => true, 'message' => 'Lead deleted']);
        break;

    case 'stats':
        $stats = [];
        $rows = $db->query("SELECT status, COUNT(*) as count FROM leads GROUP BY status")->fetchAll();
        foreach ($rows as $r) $stats[$r['status']] = $r['count'];
        $total = $db->query("SELECT COUNT(*) as c FROM leads")->fetch()['c'];
        $thisMonth = $db->query("SELECT COUNT(*) as c FROM leads WHERE MONTH(created_at)=MONTH(NOW()) AND YEAR(created_at)=YEAR(NOW())")->fetch()['c'];
        jsonResponse(['success' => true, 'data' => array_merge($stats, ['total' => $total, 'this_month' => $thisMonth])]);
        break;

    case 'sources':
        $sources = $db->query("SELECT * FROM lead_sources ORDER BY name")->fetchAll();
        jsonResponse(['success' => true, 'data' => $sources]);
        break;

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