<?php
header('Content-Type: application/json; charset=utf-8');
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: GET, POST, OPTIONS');
header('Access-Control-Allow-Headers: Content-Type, Authorization');

if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') {
    http_response_code(200);
    exit();
}

require_once dirname(__FILE__) . '/../../config.php';

// ── Validar token Bearer ──────────────────────────────────────────────────────
$token = null;
$authHeader = $_SERVER['HTTP_AUTHORIZATION'] ?? '';
if (preg_match('/Bearer\s+(.+)/i', $authHeader, $m)) {
    $token = $m[1];
}
if (!$token) {
    http_response_code(401);
    echo json_encode(['error' => 'No autorizado']);
    exit();
}

$db = getDB();

$stmtSess = $db->prepare(
    "SELECT idusuarios_sist FROM admin_sessions WHERE token = ? AND expira > NOW() LIMIT 1"
);
$stmtSess->execute([$token]);
$sess = $stmtSess->fetch(PDO::FETCH_ASSOC);
if (!$sess) {
    http_response_code(401);
    echo json_encode(['error' => 'Sesión inválida o expirada']);
    exit();
}

$mes  = isset($_GET['mes'])  ? (int)$_GET['mes']  : (int)date('n');
$anio = isset($_GET['anio']) ? (int)$_GET['anio'] : (int)date('Y');
$fechaInicio = sprintf('%04d-%02d-01', $anio, $mes);
$fechaFin    = date('Y-m-t', strtotime($fechaInicio));

// ── 1. Obtener todas las notas del período (tipo 11) con pts. nota desde nsalida ──
$sqlNotas = "
    SELECT
        t.idtransacciones,
        t.fechat,
        TRIM(CONCAT(TRIM(i.nombre),' ',TRIM(i.appat),' ',TRIM(COALESCE(i.apmat,'')))) AS nombre_dist,
        i.referencia,
        COALESCE(SUM(
            ns.cant * CASE
                WHEN ns.productos_idprod >= 1000 THEN COALESCE(pm.puntos, 0)
                ELSE COALESCE(p.puntos, 0)
            END
        ), 0) AS puntos_nota,
        COALESCE(SUM(
            (ns.cant - COALESCE(ns.asignar, 0)) * CASE
                WHEN ns.productos_idprod >= 1000 THEN COALESCE(pm.puntos, 0)
                ELSE COALESCE(p.puntos, 0)
            END
        ), 0) AS puntos_por_asignar_nsalida
    FROM transacciones t
    JOIN inversionista i ON i.id_inver = t.inversionista_id_inver
    LEFT JOIN nsalida ns ON ns.transacciones_idtransacciones = t.idtransacciones
                         AND ns.productos_idprod != 587
    LEFT JOIN productos p  ON p.id_prod  = ns.productos_idprod AND ns.productos_idprod < 1000
    LEFT JOIN promod   pm  ON pm.id_promo = ns.productos_idprod AND ns.productos_idprod >= 1000
    WHERE t.tipostr_idtipostr = 11
      AND t.fechat BETWEEN ? AND ?
    GROUP BY t.idtransacciones, t.fechat, i.nombre, i.appat, i.apmat, i.referencia
    ORDER BY t.fechat ASC, t.idtransacciones ASC
";
$stmtNotas = $db->prepare($sqlNotas);
$stmtNotas->execute([$fechaInicio, $fechaFin]);
$notas = $stmtNotas->fetchAll(PDO::FETCH_ASSOC);

// ── 2. Para cada nota, obtener pts. asignados reales desde depositos ──
$sqlAsig = "
    SELECT COALESCE(SUM(d.puntos), 0) AS total_asignado
    FROM transacciones t
    JOIN asignaciones a ON t.idtransacciones = a.idtransacciones
    JOIN depositos d ON d.transacciones_idtransacciones = t.idtransacciones
    WHERE a.nsalida = ?
";
$stmtAsig = $db->prepare($sqlAsig);

$ok_count  = 0;
$err_count = 0;

foreach ($notas as &$nota) {
    $idtx = (int)$nota['idtransacciones'];

    $stmtAsig->execute([$idtx]);
    $rowAsig = $stmtAsig->fetch(PDO::FETCH_ASSOC);
    $pts_asignados = (float)($rowAsig['total_asignado'] ?? 0);

    $pts_nota        = (float)$nota['puntos_nota'];
    $pts_por_asignar = (float)$nota['puntos_por_asignar_nsalida'];

    // Status: pts_nota - pts_asignados - pts_por_asignar = 0 → OK, sino ERROR
    $diferencia = $pts_nota - $pts_asignados - $pts_por_asignar;
    $status_ok  = (abs($diferencia) < 0.001); // tolerancia de redondeo

    $nota['puntos_asignados']  = $pts_asignados;
    $nota['puntos_por_asignar'] = $pts_por_asignar;
    $nota['diferencia']        = $diferencia;
    $nota['status_ok']         = $status_ok;

    // Limpiar campo intermedio
    unset($nota['puntos_por_asignar_nsalida']);

    if ($status_ok) $ok_count++;
    else $err_count++;
}
unset($nota);

echo json_encode([
    'ok'      => true,
    'periodo' => ['mes' => $mes, 'anio' => $anio, 'inicio' => $fechaInicio, 'fin' => $fechaFin],
    'total'   => count($notas),
    'resumen' => [
        'ok'    => $ok_count,
        'error' => $err_count,
    ],
    'notas'   => $notas,
], JSON_PRETTY_PRINT);
