<?php
/**
 * POST /api/lab/registrar_pago.php
 * Registra el pago de un domicilio por parte del cliente.
 * Soporta múltiples métodos de pago (pagos parciales).
 *
 * Body JSON:
 *   {
 *     domicilio_id: int,
 *     pago_estado:  'pagado' | 'exento' | 'pendiente',
 *     pagos: [                                             (requerido si pagado)
 *       { modo: 'efectivo'|'transferencia'|'otro', monto: float, notas: string|null },
 *       ...
 *     ],
 *     pago_notas: string|null                             (nota general, opcional)
 *   }
 */
require_once __DIR__ . '/_helpers.php';
requireMethod('POST');

try {
    $datos = inputJson();

    $domId  = (int)($datos['domicilio_id'] ?? 0);
    $estado = $datos['pago_estado'] ?? '';

    if (!$domId) jsonError('domicilio_id requerido');
    if (!in_array($estado, ['pagado', 'exento', 'pendiente'], true))
        jsonError('pago_estado inválido (pagado|exento|pendiente)');

    $pagos = [];
    if ($estado === 'pagado') {
        $raw = $datos['pagos'] ?? [];
        if (!is_array($raw) || empty($raw)) jsonError('Se requiere al menos un método de pago');
        $modosValidos = ['efectivo', 'transferencia', 'otro'];
        foreach ($raw as $i => $p) {
            $modo  = $p['modo'] ?? '';
            $monto = (float)($p['monto'] ?? 0);
            if (!in_array($modo, $modosValidos, true)) jsonError("Método de pago inválido en fila " . ($i + 1));
            if ($monto <= 0) jsonError("El monto debe ser mayor a 0 en fila " . ($i + 1));
            $pagos[] = [
                'modo'  => $modo,
                'monto' => $monto,
                'notas' => isset($p['notas']) && $p['notas'] !== '' ? trim($p['notas']) : null,
            ];
        }
    }

    $adminId = adminId();
    $dom     = new Domicilio();
    $db      = Database::getInstance();

    // Verificar que existe
    $exist = $db->fetch('SELECT id, pago_estado FROM lab_domicilios WHERE id = ?', [$domId]);
    if (!$exist) jsonError("Domicilio #$domId no encontrado");

    // ── Persistir parcialidades ──────────────────────────────────────────
    // Eliminar registros previos y reinsertar (permite editar el pago)
    $db->execute('DELETE FROM lab_domicilio_pagos WHERE domicilio_id = ?', [$domId]);

    $totalMonto    = 0;
    $primerModo    = null;
    $notasGeneral  = !empty($datos['pago_notas']) ? trim($datos['pago_notas']) : null;

    if ($estado === 'pagado') {
        foreach ($pagos as $p) {
            $db->execute(
                'INSERT INTO lab_domicilio_pagos (domicilio_id, modo, monto, notas) VALUES (?, ?, ?, ?)',
                [$domId, $p['modo'], $p['monto'], $p['notas']]
            );
            $totalMonto += $p['monto'];
            if ($primerModo === null) $primerModo = $p['modo'];
        }
    }

    // ── Actualizar campos resumen en lab_domicilios ─────────────────────
    // pago_modo guarda el primer método (o el único); pago_monto guarda el total.
    $campos = [
        'pago_estado'         => $estado,
        'pago_modo'           => ($estado === 'pagado') ? $primerModo       : null,
        'pago_monto'          => ($estado === 'pagado') ? $totalMonto        : null,
        'pago_fecha'          => ($estado === 'pagado') ? date('Y-m-d H:i:s') : null,
        'pago_notas'          => $notasGeneral,
        'pago_registrado_por' => $adminId,
    ];

    $dom->actualizar($domId, $campos, $adminId);

    jsonOk([
        'domicilio_id' => $domId,
        'pago_estado'  => $estado,
        'pago_total'   => $totalMonto,
        'pagos'        => $pagos,
    ], 'Pago registrado correctamente');

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