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

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

try {
    switch ($action) {
        case 'libro_diario':
            $fecha_desde = $_GET['fecha_desde'] ?? date('Y-m-01');
            $fecha_hasta = $_GET['fecha_hasta'] ?? date('Y-m-d');
            $suc_id = intval($_GET['sucursal_id'] ?? 0);
            $where = ["a.fecha BETWEEN ? AND ?"];
            $params = [$fecha_desde, $fecha_hasta];
            if ($suc_id > 0) {
                $where[] = "a.sucursal_id = ?";
                $params[] = $suc_id;
            }
            $w = implode(' AND ', $where);
            $s = $pdo->prepare("SELECT a.id, a.fecha, a.concepto, a.tipo_comprobante,
                    d.id as detalle_id, d.cuenta_id, p.codigo as cuenta_codigo,
                    p.nombre as cuenta_nombre, d.descripcion, d.debe, d.haber
                FROM asientos_contables a
                JOIN asientos_detalle d ON d.asiento_id=a.id
                JOIN plan_cuentas p ON p.id=d.cuenta_id
                WHERE $w
                ORDER BY a.fecha, a.id, d.id");
            $s->execute($params);
            $rows = $s->fetchAll();
            // Group by asiento
            $asientos = [];
            $total_debe = 0; $total_haber = 0;
            foreach ($rows as $r) {
                $aid = $r['id'];
                if (!isset($asientos[$aid])) {
                    $asientos[$aid] = [
                        'id'=>$r['id'],'fecha'=>$r['fecha'],'concepto'=>$r['concepto'],
                        'tipo_comprobante'=>$r['tipo_comprobante'],'detalle'=>[],'total_debe'=>0,'total_haber'=>0
                    ];
                }
                $asientos[$aid]['detalle'][] = $r;
                $asientos[$aid]['total_debe'] += floatval($r['debe']);
                $asientos[$aid]['total_haber'] += floatval($r['haber']);
                $total_debe += floatval($r['debe']);
                $total_haber += floatval($r['haber']);
            }
            json_success([
                'asientos'=>array_values($asientos),
                'resumen'=>['total_asientos'=>count($asientos),'total_debe'=>$total_debe,'total_haber'=>$total_haber]
            ]);
            break;

        case 'libro_mayor':
            $cuenta_id = intval($_GET['cuenta_id']??0);
            $fecha_desde = $_GET['fecha_desde'] ?? date('Y-01-01');
            $fecha_hasta = $_GET['fecha_hasta'] ?? date('Y-m-d');
            $suc_id = intval($_GET['sucursal_id'] ?? 0);
            if (!$cuenta_id) json_error('Seleccione una cuenta');

            $cuenta = $pdo->prepare("SELECT * FROM plan_cuentas WHERE id=?");
            $cuenta->execute([$cuenta_id]);
            $cuenta = $cuenta->fetch();
            if (!$cuenta) json_error('Cuenta no encontrada');

            // Saldo inicial (sum of all before fecha_desde)
            $si_sql = "SELECT COALESCE(SUM(debe),0) as debe, COALESCE(SUM(haber),0) as haber
                FROM asientos_detalle d JOIN asientos_contables a ON a.id=d.asiento_id
                WHERE d.cuenta_id=? AND a.fecha < ?";
            $si_params = [$cuenta_id, $fecha_desde];
            if ($suc_id > 0) {
                $si_sql .= " AND a.sucursal_id = ?";
                $si_params[] = $suc_id;
            }
            $si = $pdo->prepare($si_sql);
            $si->execute($si_params);
            $saldo_ini = $si->fetch();
            $saldo_inicial = floatval($saldo_ini['debe']) - floatval($saldo_ini['haber']);
            if ($cuenta['naturaleza'] === 'acreedora') $saldo_inicial = -$saldo_inicial;

            // Movements
            $ms_sql = "SELECT a.fecha, a.concepto, a.tipo_comprobante, a.id as asiento_id,
                    d.debe, d.haber, d.descripcion
                FROM asientos_detalle d
                JOIN asientos_contables a ON a.id=d.asiento_id
                WHERE d.cuenta_id=? AND a.fecha BETWEEN ? AND ?";
            $ms_params = [$cuenta_id, $fecha_desde, $fecha_hasta];
            if ($suc_id > 0) {
                $ms_sql .= " AND a.sucursal_id = ?";
                $ms_params[] = $suc_id;
            }
            $ms_sql .= " ORDER BY a.fecha, a.id";
            $ms = $pdo->prepare($ms_sql);
            $ms->execute($ms_params);
            $movimientos = $ms->fetchAll();
            $total_debe = 0; $total_haber = 0;
            $saldo = $saldo_inicial;
            foreach ($movimientos as &$m) {
                $total_debe += floatval($m['debe']);
                $total_haber += floatval($m['haber']);
                $saldo += floatval($m['debe']) - floatval($m['haber']);
                $m['saldo'] = $saldo;
            }

            json_success([
                'cuenta'=>$cuenta,
                'saldo_inicial'=>$saldo_inicial,
                'movimientos'=>$movimientos,
                'total_debe'=>$total_debe,
                'total_haber'=>$total_haber,
                'saldo_final'=>$saldo_inicial + $total_debe - $total_haber
            ]);
            break;

        case 'balance_comprobacion':
            $fecha_desde = $_GET['fecha_desde'] ?? date('Y-01-01');
            $fecha_hasta = $_GET['fecha_hasta'] ?? date('Y-m-d');
            $suc_id = intval($_GET['sucursal_id'] ?? 0);
            $suc_sql = "";
            if ($suc_id > 0) {
                $suc_sql = " AND a.sucursal_id = " . intval($suc_id);
            }
            $sql = "SELECT p.*,
                    COALESCE(si.debe_inicial,0) as debe_inicial, COALESCE(si.haber_inicial,0) as haber_inicial,
                    COALESCE(mv.debe_mov,0) as debe_mov, COALESCE(mv.haber_mov,0) as haber_mov
                FROM plan_cuentas p
                LEFT JOIN (
                    SELECT d.cuenta_id,
                        SUM(d.debe) as debe_inicial, SUM(d.haber) as haber_inicial
                    FROM asientos_detalle d JOIN asientos_contables a ON a.id=d.asiento_id
                    WHERE a.fecha < ? $suc_sql
                    GROUP BY d.cuenta_id
                ) si ON si.cuenta_id=p.id
                LEFT JOIN (
                    SELECT d.cuenta_id,
                        SUM(d.debe) as debe_mov, SUM(d.haber) as haber_mov
                    FROM asientos_detalle d JOIN asientos_contables a ON a.id=d.asiento_id
                    WHERE a.fecha BETWEEN ? AND ? $suc_sql
                    GROUP BY d.cuenta_id
                ) mv ON mv.cuenta_id=p.id
                WHERE p.activo=1 ORDER BY p.codigo";
            $cuentas = $pdo->prepare($sql);
            $cuentas->execute([$fecha_desde, $fecha_desde, $fecha_hasta]);
            $rows = $cuentas->fetchAll();
            $total_debe_inicial = 0; $total_haber_inicial = 0;
            $total_debe_mov = 0; $total_haber_mov = 0;
            $total_debe_saldo = 0; $total_haber_saldo = 0;
            foreach ($rows as &$r) {
                $saldo_deudor = floatval($r['debe_inicial']) - floatval($r['haber_inicial']);
                $saldo_mov = floatval($r['debe_mov']) - floatval($r['haber_mov']);
                $saldo_total = $saldo_deudor + $saldo_mov;
                $r['saldo_deudor'] = $saldo_total > 0 ? $saldo_total : 0;
                $r['saldo_acreedor'] = $saldo_total < 0 ? -$saldo_total : 0;
                $total_debe_inicial += floatval($r['debe_inicial']);
                $total_haber_inicial += floatval($r['haber_inicial']);
                $total_debe_mov += floatval($r['debe_mov']);
                $total_haber_mov += floatval($r['haber_mov']);
                $total_debe_saldo += $r['saldo_deudor'];
                $total_haber_saldo += $r['saldo_acreedor'];
            }
            json_success([
                'cuentas'=>$rows,
                'totales'=>[
                    'debe_inicial'=>$total_debe_inicial,'haber_inicial'=>$total_haber_inicial,
                    'debe_mov'=>$total_debe_mov,'haber_mov'=>$total_haber_mov,
                    'saldo_deudor'=>$total_debe_saldo,'saldo_acreedor'=>$total_haber_saldo
                ]
            ]);
            break;

        case 'estado_resultados':
            $fecha_desde = $_GET['fecha_desde'] ?? date('Y-01-01');
            $fecha_hasta = $_GET['fecha_hasta'] ?? date('Y-m-d');
            $suc_id = intval($_GET['sucursal_id'] ?? 0);
            $suc_sql = "";
            $params = [$fecha_desde, $fecha_hasta];
            if ($suc_id > 0) {
                $suc_sql = " AND a.sucursal_id = ?";
                $params[] = $suc_id;
            }

            // Ingresos
            $ing = $pdo->prepare("SELECT SUM(d.haber - d.debe) as total FROM asientos_detalle d
                JOIN asientos_contables a ON a.id=d.asiento_id
                JOIN plan_cuentas p ON p.id=d.cuenta_id
                WHERE p.tipo='ingreso' AND a.fecha BETWEEN ? AND ? $suc_sql");
            $ing->execute($params);
            $ingresos = floatval($ing->fetchColumn());
            // Costos
            $cos = $pdo->prepare("SELECT SUM(d.debe - d.haber) as total FROM asientos_detalle d
                JOIN asientos_contables a ON a.id=d.asiento_id
                JOIN plan_cuentas p ON p.id=d.cuenta_id
                WHERE p.tipo='costo' AND a.fecha BETWEEN ? AND ? $suc_sql");
            $cos->execute($params);
            $costos = floatval($cos->fetchColumn());
            // Gastos
            $gas = $pdo->prepare("SELECT SUM(d.debe - d.haber) as total FROM asientos_detalle d
                JOIN asientos_contables a ON a.id=d.asiento_id
                JOIN plan_cuentas p ON p.id=d.cuenta_id
                WHERE p.tipo='gasto' AND a.fecha BETWEEN ? AND ? $suc_sql");
            $gas->execute($params);
            $gastos = floatval($gas->fetchColumn());
            $utilidad_bruta = $ingresos - $costos;
            $utilidad_neta = $utilidad_bruta - $gastos;

            // Detalle de ingresos
            $det_ing = $pdo->prepare("SELECT p.codigo, p.nombre, SUM(d.haber - d.debe) as monto
                FROM asientos_detalle d JOIN asientos_contables a ON a.id=d.asiento_id
                JOIN plan_cuentas p ON p.id=d.cuenta_id
                WHERE p.tipo='ingreso' AND a.fecha BETWEEN ? AND ? $suc_sql AND p.acepta_movimiento=1
                GROUP BY p.id ORDER BY p.codigo");
            $det_ing->execute($params);

            $det_gas = $pdo->prepare("SELECT p.codigo, p.nombre, SUM(d.debe - d.haber) as monto
                FROM asientos_detalle d JOIN asientos_contables a ON a.id=d.asiento_id
                JOIN plan_cuentas p ON p.id=d.cuenta_id
                WHERE p.tipo IN ('costo','gasto') AND a.fecha BETWEEN ? AND ? $suc_sql AND p.acepta_movimiento=1
                GROUP BY p.id ORDER BY p.codigo");
            $det_gas->execute($params);

            json_success([
                'ingresos'=>$ingresos,
                'costos'=>$costos,
                'gastos'=>$gastos,
                'utilidad_bruta'=>$utilidad_bruta,
                'utilidad_neta'=>$utilidad_neta,
                'detalle_ingresos'=>$det_ing->fetchAll(),
                'detalle_gastos'=>$det_gas->fetchAll()
            ]);
            break;

        default:
            json_error('Accion no valida');
    }
} catch (Exception $e) {
    json_error('Error: '.$e->getMessage());
}
