<?php
ob_start();
require_once __DIR__ . '/../core/auth.php';
require_once __DIR__ . '/../core/response.php';
cors();
$user = Auth::requireToken();
$db   = DB::get();
$act  = $_GET['action'] ?? $_POST['action'] ?? 'list';

try {
    switch ($act) {

        case 'list':
            $q      = '%' . $db->esc($_GET['q'] ?? '') . '%';
            $status = $db->esc($_GET['status'] ?? '');
            $where  = $status ? "AND i.status = '$status'" : '';
            // Include amount_paid from income table per invoice
            $rows = $db->select(
                "SELECT i.*, c.clients_name,
                        COALESCE((SELECT SUM(inc.amount) FROM income inc WHERE inc.invoices_id = i.record_id), 0) AS amount_paid
                 FROM invoices i
                 LEFT JOIN clients c ON c.record_id = i.clients_id
                 WHERE (CAST(i.invoice_no AS CHAR) LIKE ? OR c.clients_name LIKE ?) $where
                 ORDER BY i.invoice_no DESC",
                'ss', $q, $q
            );
            json_ok($rows);

        case 'get':
            $id  = (int)($_GET['id'] ?? 0);
            $row = $db->selectOne(
                "SELECT i.*, c.clients_name, c.email, c.cell, c.address, c.vat,
                        COALESCE((SELECT SUM(inc.amount) FROM income inc WHERE inc.invoices_id = i.record_id), 0) AS amount_paid
                 FROM invoices i
                 LEFT JOIN clients c ON c.record_id = i.clients_id
                 WHERE i.record_id = ?", 'i', $id
            );
            if (!$row) json_err('Not found', 404);
            // Get payment history from income table
            $payments = $db->select(
                "SELECT inc.*, a.accounts_name
                 FROM income inc
                 LEFT JOIN accounts a ON a.record_id = inc.accounts_id
                 WHERE inc.invoices_id = ?
                 ORDER BY inc.record_id ASC", 'i', $id
            );
            $company = $db->selectOne("SELECT * FROM company WHERE record_id = 1");
            json_ok(['invoice' => $row, 'company' => $company, 'payments' => $payments]);

        case 'add':
            $clientId = (int)($_POST['clients_id'] ?? 0);
            $quotesId = (int)($_POST['quotes_id'] ?? 0);
            $content  = trim($_POST['invoice_content'] ?? '');
            $total    = (float)($_POST['total'] ?? 0);
            $desc     = trim($_POST['description'] ?? '');
            $dateSent = trim($_POST['date_sent'] ?? '');
            $dateDue  = trim($_POST['date_due'] ?? '');
            $status   = trim($_POST['status'] ?? 'DRAFT');
            if (!$clientId) json_err('Client required');

            $maxInv    = $db->selectOne("SELECT COALESCE(MAX(invoice_no), 0) AS mx FROM invoices");
            $invoiceNo = (int)$maxInv['mx'] + 1;
            $db->execute("UPDATE company SET invoice_no = ? WHERE record_id = 1", 'i', $invoiceNo);
            $dateCreated = date('Y-m-d');

            $id = $db->execute(
                "INSERT INTO invoices (invoice_no, invoices_name, quotes_id, invoice_content, total, clients_id, status, date_created, date_sent, date_due, description)
                 VALUES (?,?,?,?,?,?,?,?,?,?,?)",
                'iiisdisssss', $invoiceNo, $invoiceNo, $quotesId, $content, $total, $clientId, $status, $dateCreated, $dateSent, $dateDue, $desc
            );
            Auth::log((int)$user['user_id'], "CREATED INVOICE #$invoiceNo", 'invoices', $id);
            json_ok(['id' => $id, 'invoice_no' => $invoiceNo], 'Invoice created');

        case 'update':
            $id       = (int)($_POST['id'] ?? 0);
            $clientId = (int)($_POST['clients_id'] ?? 0);
            $content  = trim($_POST['invoice_content'] ?? '');
            $total    = (float)($_POST['total'] ?? 0);
            $desc     = trim($_POST['description'] ?? '');
            $dateSent = trim($_POST['date_sent'] ?? '');
            $dateDue  = trim($_POST['date_due'] ?? '');
            $status   = trim($_POST['status'] ?? 'DRAFT');
            if (!$id) json_err('ID required');
            $db->execute(
                "UPDATE invoices SET clients_id=?, invoice_content=?, total=?, status=?, date_sent=?, date_due=?, description=? WHERE record_id=?",
                'isdssssi', $clientId, $content, $total, $status, $dateSent, $dateDue, $desc, $id
            );
            Auth::log((int)$user['user_id'], "UPDATED INVOICE #$id", 'invoices', $id);
            json_ok(null, 'Invoice updated');

        // Add a payment against an invoice (writes to income table)
        case 'add_payment':
            $id      = (int)($_POST['invoice_id'] ?? 0);
            $amount  = (float)($_POST['amount'] ?? 0);
            $date    = trim($_POST['date'] ?? date('Y-m-d'));
            $acctId  = (int)($_POST['accounts_id'] ?? 0);
            $note    = trim($_POST['note'] ?? '');
            if (!$id || $amount <= 0) json_err('Invoice ID and amount required');

            // Default to first INCOME account if none provided
            if (!$acctId) {
                $acct   = $db->selectOne("SELECT record_id FROM accounts WHERE accounts_name LIKE '%CUSTOMER PAYMENT%' LIMIT 1");
                $acctId = $acct['record_id'] ?? 2;
            }

            $db->execute(
                "INSERT INTO income (accounts_id, amount, date_created, invoices_id) VALUES (?,?,?,?)",
                'idsi', $acctId, $amount, $date, $id
            );

            // Recalculate status based on total paid vs invoice total
            $invoice    = $db->selectOne("SELECT total FROM invoices WHERE record_id = ?", 'i', $id);
            $totalPaid  = $db->selectOne(
                "SELECT COALESCE(SUM(amount),0) AS paid FROM income WHERE invoices_id = ?", 'i', $id
            );
            $paid = (float)$totalPaid['paid'];
            $inv  = (float)$invoice['total'];

            if ($paid <= 0)          $newStatus = 'APPROVED';
            elseif ($paid < $inv)    $newStatus = 'PARTIALLY PAID';
            else                     $newStatus = 'PAID';

            $db->execute("UPDATE invoices SET status=? WHERE record_id=?", 'si', $newStatus, $id);
            Auth::log((int)$user['user_id'], "PAYMENT R$amount ON INVOICE #$id — STATUS: $newStatus", 'invoices', $id);
            json_ok(['status' => $newStatus, 'amount_paid' => $paid], 'Payment recorded');

        // Delete a payment from the income table and recalculate invoice status
        case 'delete_payment':
            $payId     = (int)($_POST['payment_id'] ?? 0);
            $invoiceId = (int)($_POST['invoice_id'] ?? 0);
            if (!$payId || !$invoiceId) json_err('Payment ID and Invoice ID required');

            $db->execute("DELETE FROM income WHERE record_id = ?", 'i', $payId);

            // Recalculate status
            $invoice   = $db->selectOne("SELECT total FROM invoices WHERE record_id = ?", 'i', $invoiceId);
            $totalPaid = $db->selectOne("SELECT COALESCE(SUM(amount),0) AS paid FROM income WHERE invoices_id = ?", 'i', $invoiceId);
            $paid = (float)$totalPaid['paid'];
            $inv  = (float)$invoice['total'];

            if ($paid <= 0)        $newStatus = 'APPROVED';
            elseif ($paid < $inv)  $newStatus = 'PARTIALLY PAID';
            else                   $newStatus = 'PAID';

            $db->execute("UPDATE invoices SET status=? WHERE record_id=?", 'si', $newStatus, $invoiceId);
            Auth::log((int)$user['user_id'], "DELETED PAYMENT #$payId FROM INVOICE #$invoiceId — STATUS: $newStatus", 'invoices', $invoiceId);
            json_ok(['status' => $newStatus], 'Payment deleted');


    }
} catch (Exception $e) {
    json_err($e->getMessage(), 500);
}