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

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

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

function generateQuoteRef(PDO $db): string {
    $year = date('Y');
    $count = $db->query("SELECT COUNT(*) as c FROM quotations WHERE YEAR(created_at) = $year")->fetch()['c'];
    return 'TC-Q-' . $year . '-' . str_pad($count + 1, 4, '0', STR_PAD_LEFT);
}

switch ($action) {

    case 'list':
        $stmt = $db->prepare("
            SELECT q.*, l.name AS lead_name, c.name AS customer_name, u.name AS created_by_name
            FROM quotations q
            LEFT JOIN leads l ON q.lead_id = l.id
            LEFT JOIN customers c ON q.customer_id = c.id
            LEFT JOIN users u ON q.created_by = u.id
            ORDER BY q.created_at DESC
        ");
        $stmt->execute();
        $rows = $stmt->fetchAll();
        foreach ($rows as &$r) {
            if ($r['items']) $r['items'] = json_decode($r['items'], true);
        }
        jsonResponse(['success' => true, 'data' => $rows]);
        break;

    case 'get':
        $stmt = $db->prepare("SELECT q.*, l.name AS lead_name, c.name AS customer_name FROM quotations q LEFT JOIN leads l ON q.lead_id = l.id LEFT JOIN customers c ON q.customer_id = c.id WHERE q.id = ?");
        $stmt->execute([$id]);
        $q = $stmt->fetch();
        if (!$q) jsonResponse(['success' => false, 'error' => 'Not found'], 404);
        if ($q['items']) $q['items'] = json_decode($q['items'], true);
        jsonResponse(['success' => true, 'data' => $q]);
        break;

    case 'create':
        $input = getInput();
        $items = $input['items'] ?? [];
        $subtotal = floatval($input['subtotal'] ?? 0);
        $markup = floatval($input['markup_percent'] ?? 10);
        $markupAmt = $subtotal * ($markup / 100);
        $taxPct = floatval($input['tax_percent'] ?? 0);
        $taxAmt = ($subtotal + $markupAmt) * ($taxPct / 100);
        $discount = floatval($input['discount'] ?? 0);
        $total = $subtotal + $markupAmt + $taxAmt - $discount;
        $ref = generateQuoteRef($db);

        $stmt = $db->prepare("
            INSERT INTO quotations (lead_id, customer_id, quote_ref, items, subtotal, markup_percent, markup_amount, tax_percent, tax_amount, discount, total, currency, valid_until, status, notes, created_by)
            VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
        ");
        $stmt->execute([
            intval($input['lead_id'] ?? 0) ?: null,
            intval($input['customer_id'] ?? 0) ?: null,
            $ref,
            json_encode($items),
            $subtotal, $markup, $markupAmt, $taxPct, $taxAmt, $discount, $total,
            $input['currency'] ?? 'GBP',
            $input['valid_until'] ?: null,
            $input['status'] ?? 'draft',
            trim($input['notes'] ?? ''),
            $currentUser['id']
        ]);
        $newId = $db->lastInsertId();
        logActivity($currentUser['id'], 'created', 'quotation', $newId, "Quote: $ref");
        jsonResponse(['success' => true, 'id' => $newId, 'ref' => $ref, 'total' => $total]);
        break;

    case 'update':
        $input = getInput();
        $items = $input['items'] ?? [];
        $subtotal = floatval($input['subtotal'] ?? 0);
        $markup = floatval($input['markup_percent'] ?? 10);
        $markupAmt = $subtotal * ($markup / 100);
        $taxPct = floatval($input['tax_percent'] ?? 0);
        $taxAmt = ($subtotal + $markupAmt) * ($taxPct / 100);
        $discount = floatval($input['discount'] ?? 0);
        $total = $subtotal + $markupAmt + $taxAmt - $discount;

        $stmt = $db->prepare("
            UPDATE quotations SET lead_id=?, customer_id=?, items=?, subtotal=?, markup_percent=?, markup_amount=?, tax_percent=?, tax_amount=?, discount=?, total=?, currency=?, valid_until=?, status=?, notes=?
            WHERE id=?
        ");
        $stmt->execute([
            intval($input['lead_id'] ?? 0) ?: null,
            intval($input['customer_id'] ?? 0) ?: null,
            json_encode($items),
            $subtotal, $markup, $markupAmt, $taxPct, $taxAmt, $discount, $total,
            $input['currency'] ?? 'GBP',
            $input['valid_until'] ?: null,
            $input['status'] ?? 'draft',
            trim($input['notes'] ?? ''),
            $id
        ]);
        logActivity($currentUser['id'], 'updated', 'quotation', $id, "Updated quotation ID: $id");
        jsonResponse(['success' => true, 'total' => $total, 'message' => 'Quote updated']);
        break;

    case 'update_status':
        $input = getInput();
        $allowed = ['draft','sent','accepted','rejected','expired'];
        $status = $input['status'] ?? '';
        if (!in_array($status, $allowed)) jsonResponse(['success' => false, 'error' => 'Invalid status']);
        $db->prepare("UPDATE quotations SET status=? WHERE id=?")->execute([$status, $id]);
        jsonResponse(['success' => true, 'message' => 'Status updated']);
        break;

    case 'delete':
        $db->prepare("DELETE FROM quotations WHERE id=?")->execute([$id]);
        jsonResponse(['success' => true, 'message' => 'Quotation deleted']);
        break;

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