<?php
header('Content-Type: application/json; charset=utf-8');
require_once __DIR__ . '/../config/database.php';
require_once __DIR__ . '/../includes/helpers.php';

$pdo = getConnection();
$method = $_SERVER['REQUEST_METHOD'];
$action = $_GET['action'] ?? '';

try {
    switch ($action) {
        case 'listar':
            $page = max(1, intval($_GET['page']??1));
            $limit = 50;
            $offset = ($page-1)*$limit;
            $where = [];
            $params = [];
            if (!empty($_GET['fecha_desde'])) { $where[]="a.fecha>=?"; $params[]=$_GET['fecha_desde']; }
            if (!empty($_GET['fecha_hasta'])) { $where[]="a.fecha<=?"; $params[]=$_GET['fecha_hasta']; }
            if (!empty($_GET['tipo'])) { $where[]="a.tipo_comprobante=?"; $params[]=$_GET['tipo']; }
            if (!empty($_GET['sucursal_id'])) { $where[]="a.sucursal_id=?"; $params[]=intval($_GET['sucursal_id']); }
            $w = $where ? 'WHERE '.implode(' AND ', $where) : '';
            $total = $pdo->prepare("SELECT COUNT(*) FROM asientos_contables a $w");
            $total->execute($params);
            $total = intval($total->fetchColumn());
            $s = $pdo->prepare("SELECT a.*, u.nombre as usuario
                FROM asientos_contables a
                LEFT JOIN usuarios u ON u.id=a.usuario_id
                $w ORDER BY a.fecha DESC, a.id DESC LIMIT $limit OFFSET $offset");
            $s->execute($params);
            $rows = $s->fetchAll();
            foreach ($rows as &$r) {
                $st = $pdo->prepare("SELECT COUNT(*) FROM asientos_detalle WHERE asiento_id=?");
                $st->execute([$r['id']]);
                $r['lineas'] = intval($st->fetchColumn());
            }
            json_success(['data'=>$rows,'total'=>$total,'page'=>$page,'pages'=>ceil($total/$limit)]);
            break;

        case 'detalle':
            $id = intval($_GET['id']??0);
            $cab = $pdo->prepare("SELECT a.*, u.nombre as usuario FROM asientos_contables a LEFT JOIN usuarios u ON u.id=a.usuario_id WHERE a.id=?");
            $cab->execute([$id]);
            $cab = $cab->fetch();
            if (!$cab) json_error('Asiento no encontrado');
            $det = $pdo->prepare("SELECT d.*, p.codigo as cuenta_codigo, p.nombre as cuenta_nombre
                FROM asientos_detalle d JOIN plan_cuentas p ON p.id=d.cuenta_id WHERE d.asiento_id=? ORDER BY d.id");
            $det->execute([$id]);
            $cab['detalle'] = $det->fetchAll();
            json_success($cab);
            break;

        case 'crear':
            $d = json_input();
            require_fields($d, ['fecha','concepto','detalle']);
            if (count($d['detalle'])<2) json_error('Debe tener al menos 2 lineas');
            $total_debe = 0; $total_haber = 0;
            foreach ($d['detalle'] as $l) {
                $total_debe += floatval($l['debe']??0);
                $total_haber += floatval($l['haber']??0);
            }
            if (abs($total_debe - $total_haber) > 0.01) json_error('El total debe ($'.number_format($total_debe,2).') y haber ($'.number_format($total_haber,2).') no cuadran');
            $suc_id = intval($d['sucursal_id'] ?? 1) ?: 1;
            $pdo->beginTransaction();
            $s = $pdo->prepare("INSERT INTO asientos_contables (fecha,concepto,tipo_comprobante,usuario_id,sucursal_id) VALUES (?,?,'manual',?,?)");
            $s->execute([$d['fecha'],$d['concepto'],$d['usuario_id']??null,$suc_id]);
            $asiento_id = intval($pdo->lastInsertId());
            $ins = $pdo->prepare("INSERT INTO asientos_detalle (asiento_id,cuenta_id,descripcion,debe,haber) VALUES (?,?,?,?,?)");
            foreach ($d['detalle'] as $l) {
                $ins->execute([$asiento_id, intval($l['cuenta_id']), $l['descripcion']??null, floatval($l['debe']??0), floatval($l['haber']??0)]);
            }
            $pdo->commit();
            json_success(['id'=>$asiento_id], 'Asiento creado #'.$asiento_id);
            break;

        case 'eliminar':
            $id = intval($_GET['id']??0);
            $s = $pdo->prepare("SELECT tipo_comprobante FROM asientos_contables WHERE id=?");
            $s->execute([$id]);
            $a = $s->fetch();
            if (!$a) json_error('Asiento no encontrado');
            if ($a['tipo_comprobante'] !== 'manual') json_error('Solo se pueden eliminar asientos manuales');
            $pdo->prepare("DELETE FROM asientos_contables WHERE id=?")->execute([$id]);
            json_success([], 'Asiento eliminado');
            break;

        default:
            json_error('Accion no valida');
    }
} catch (Exception $e) {
    if (isset($pdo) && $pdo->inTransaction()) $pdo->rollBack();
    json_error('Error: '.$e->getMessage());
}
