<?php
namespace Modules\Vendas\Controllers;

use Gestoreasy\Core\Http\Request;
use Gestoreasy\Core\Http\Response;
use Gestoreasy\Core\Tenant\ConnectionManager;
use Gestoreasy\Core\Audit\AuditLogger;

class SalesPaymentsController {
    // Listar pagamentos de um pedido e retornar totais
    public function listByOrder(Request $r): Response {
        $pdo = ConnectionManager::forTenant();
        $params = $r->get('params', []);
        $orderId = (int)($params[0] ?? 0);
        if ($orderId <= 0) return new Response(422, ['error' => ['code' => 'invalid_id', 'message' => 'ID inválido']]);
        // Verificar pedido
        $chk = $pdo->prepare('SELECT id, valor_total FROM sales_orders WHERE id = ? LIMIT 1');
        $chk->execute([$orderId]);
        $order = $chk->fetch();
        if (!$order) return new Response(404, ['error' => ['code' => 'order_not_found', 'message' => 'Pedido não encontrado']]);
        // Buscar pagamentos
        $ps = $pdo->prepare('SELECT id, metodo, valor, troco, created_at FROM sales_payments WHERE order_id = ? ORDER BY id ASC');
        $ps->execute([$orderId]);
        $rows = $ps->fetchAll();
        $totalPaid = 0.0; $totalTroco = 0.0;
        if (is_array($rows)) {
            foreach ($rows as $p) { $totalPaid += (float)($p['valor'] ?? 0); $totalTroco += (float)($p['troco'] ?? 0); }
        }
        $remaining = max(0.0, (float)$order['valor_total'] - $totalPaid + $totalTroco);
        AuditLogger::logRead('sales_payments', null, ['endpoint' => 'vendas.pagamentos.list', 'order_id' => $orderId]);
        return Response::json(['data' => $rows, 'summary' => [
            'order_id' => $orderId,
            'valor_total' => (float)$order['valor_total'],
            'total_pago' => $totalPaid,
            'total_troco' => $totalTroco,
            'restante' => $remaining
        ]]);
    }

    // Criar pagamento para um pedido
    public function createForOrder(Request $r): Response {
        $pdo = ConnectionManager::forTenant();
        $params = $r->get('params', []);
        $orderId = (int)($params[0] ?? 0);
        if ($orderId <= 0) return new Response(422, ['error' => ['code' => 'invalid_id', 'message' => 'ID inválido']]);
        $data = $r->body ?? [];
        $metodo = trim((string)($data['metodo'] ?? ''));
        $valor = (float)($data['valor'] ?? 0);
        $troco = isset($data['troco']) ? (float)$data['troco'] : null;
        if ($metodo === '') return new Response(422, ['error' => ['code' => 'method_required', 'message' => 'Método de pagamento é obrigatório']]);
        if ($valor <= 0) return new Response(422, ['error' => ['code' => 'invalid_value', 'message' => 'Valor deve ser > 0']]);
        // Verificar pedido existente
        $chk = $pdo->prepare('SELECT id, valor_total, status FROM sales_orders WHERE id = ? LIMIT 1');
        $chk->execute([$orderId]);
        $order = $chk->fetch();
        if (!$order) return new Response(404, ['error' => ['code' => 'order_not_found', 'message' => 'Pedido não encontrado']]);
        if (($order['status'] ?? '') === 'cancelado') return new Response(409, ['error' => ['code' => 'order_cancelled', 'message' => 'Não é possível registrar pagamento para pedido cancelado']]);
        // Inserir pagamento
        $ins = $pdo->prepare('INSERT INTO sales_payments (order_id, metodo, valor, troco) VALUES (?,?,?,?)');
        $ins->execute([$orderId, $metodo, $valor, $troco]);
        $newId = (int)$pdo->lastInsertId();
        AuditLogger::logCreate('sales_payments', $newId, ['order_id' => $orderId, 'metodo' => $metodo, 'valor' => $valor, 'troco' => $troco], ['endpoint' => 'vendas.pagamentos.create']);
        return Response::json(['ok' => true, 'id' => $newId], 201);
    }

    // Excluir um pagamento
    public function delete(Request $r): Response {
        $pdo = ConnectionManager::forTenant();
        $params = $r->get('params', []);
        $id = (int)($params[0] ?? 0);
        if ($id <= 0) return new Response(422, ['error' => ['code' => 'invalid_id', 'message' => 'ID inválido']]);
        $beforeStmt = $pdo->prepare('SELECT id, order_id, metodo, valor, troco FROM sales_payments WHERE id = ? LIMIT 1');
        $beforeStmt->execute([$id]);
        $before = $beforeStmt->fetch();
        if (!$before) return new Response(404, ['error' => ['code' => 'not_found', 'message' => 'Pagamento não encontrado']]);
        $del = $pdo->prepare('DELETE FROM sales_payments WHERE id = ?');
        $del->execute([$id]);
        AuditLogger::logDelete('sales_payments', $id, $before ?: [], ['endpoint' => 'vendas.pagamentos.delete']);
        return Response::json(['ok' => true]);
    }
}