<?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();
}

$action = $_GET['action'] ?? 'lista';

// ══════════════════════════════════════════════════════════════════════════════
// ACCIÓN: DETALLE de una nota específica
// ══════════════════════════════════════════════════════════════════════════════
if ($action === 'detalle') {
    $idtx = (int)($_GET['idtransacciones'] ?? 0);
    if (!$idtx) {
        echo json_encode(['error' => 'idtransacciones requerido']);
        exit();
    }

    // Datos de la transacción principal (tipo 11)
    $stmtTx = $db->prepare("
        SELECT
            t.idtransacciones,
            t.fechat,
            t.horat,
            t.observaciones,
            t.inversionista_id_inver AS id_inver,
            CONCAT(TRIM(i.nombre),' ',TRIM(i.appat),' ',TRIM(COALESCE(i.apmat,''))) AS nombre_dist,
            i.referencia,
            i.rfc
        FROM transacciones t
        JOIN inversionista i ON i.id_inver = t.inversionista_id_inver
        WHERE t.idtransacciones = ?
          AND t.tipostr_idtipostr = 11
        LIMIT 1
    ");
    $stmtTx->execute([$idtx]);
    $nota = $stmtTx->fetch(PDO::FETCH_ASSOC);
    if (!$nota) {
        echo json_encode(['error' => 'Nota no encontrada']);
        exit();
    }

    // Líneas de la nota (nsalida).
    // Si productos_idprod > 1000 → datos de promod (id_promo, promodesc, precio, puntos)
    // Si productos_idprod <= 1000 → datos de productos (id_prod, nombreProd, precio, puntos)
    $stmtNs = $db->prepare("
        SELECT
            ns.id,
            ns.productos_idprod,
            CASE
                WHEN ns.productos_idprod >= 1000
                    THEN COALESCE(pm.promodesc, CONCAT('Promo #', ns.productos_idprod))
                ELSE COALESCE(p.nombreProd, CONCAT('Prod #', ns.productos_idprod))
            END AS nombre,
            CASE
                WHEN ns.productos_idprod >= 1000 THEN COALESCE(pm.puntos, 0)
                ELSE COALESCE(p.puntos, 0)
            END AS puntos,
            CASE
                WHEN ns.productos_idprod >= 1000 THEN COALESCE(pm.precio, 0)
                ELSE COALESCE(p.precio, 0)
            END AS precio,
            CASE WHEN ns.productos_idprod >= 1000 THEN 1 ELSE 0 END AS es_promo,
            ns.cant,
            COALESCE(ns.asignar, 0) AS asignar,
            (ns.cant - COALESCE(ns.asignar, 0)) AS pendiente
        FROM nsalida ns
        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 ns.transacciones_idtransacciones = ?
          AND ns.productos_idprod != 587
        ORDER BY ns.id
    ");
    $stmtNs->execute([$idtx]);
    $items = $stmtNs->fetchAll(PDO::FETCH_ASSOC);

    // Calcular puntos totales de la nota y asignados
    $puntos_nota      = 0;
    $puntos_asignados = 0;
    foreach ($items as $it) {
        $puntos_nota      += $it['puntos'] * $it['cant'];
        $puntos_asignados += $it['puntos'] * $it['asignar'];
    }
    $puntos_pendientes = $puntos_nota - $puntos_asignados;
    $tiene_error       = ($puntos_asignados > $puntos_nota);
    $nota['puntos_nota']       = $puntos_nota;
    $nota['puntos_asignados']  = $puntos_asignados;
    $nota['puntos_pendientes'] = $puntos_pendientes;
    $nota['tiene_error']       = $tiene_error;

    // Asignaciones realizadas vinculadas a esta nota vía tabla asignaciones
    // asignaciones.nsalida = idtransacciones de la nota de venta (tipo 11)
    // asignaciones.idtransacciones = idtransacciones de la asignación (tipo 12)
    $asignaciones = [];
    $total_puntos_asignados = 0;
    $stmtAsig = $db->prepare("
        SELECT
            t.idtransacciones AS id_asig,
            t.fechat AS fecha_asig,
            TRIM(CONCAT(TRIM(i2.nombre),' ',TRIM(i2.appat),' ',TRIM(COALESCE(i2.apmat,'')))) AS nombre_dest,
            i2.referencia AS ref_dest,
            COALESCE(d.puntos, 0) AS puntos_asig
        FROM transacciones t
        JOIN asignaciones a ON t.idtransacciones = a.idtransacciones
        JOIN inversionista i2 ON t.inversionista_id_inver = i2.id_inver
        JOIN depositos d ON d.transacciones_idtransacciones = t.idtransacciones
        WHERE a.nsalida = ?
        ORDER BY t.idtransacciones
    ");
    $stmtAsig->execute([$idtx]);
    $asignaciones = $stmtAsig->fetchAll(PDO::FETCH_ASSOC);
    foreach ($asignaciones as $asig) {
        $total_puntos_asignados += (float)$asig['puntos_asig'];
    }

    echo json_encode([
        'ok'                     => true,
        'nota'                   => $nota,
        'items'                  => $items,
        'asignaciones'           => $asignaciones,
        'total_puntos_asignados' => $total_puntos_asignados
    ]);
    exit();
}

// ══════════════════════════════════════════════════════════════════════════════
// ACCIÓN: LISTA de notas del período
// ══════════════════════════════════════════════════════════════════════════════
$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));

// Para los puntos de la lista usamos la misma lógica condicional:
// id_prod <= 1000 → productos.puntos ; id_prod > 1000 → promod.puntos
$sql = "
    SELECT
        t.idtransacciones,
        t.fechat,
        t.horat,
        t.observaciones,
        t.inversionista_id_inver AS id_inver,
        CONCAT(TRIM(i.nombre),' ',TRIM(i.appat),' ',TRIM(COALESCE(i.apmat,''))) AS nombre_dist,
        i.referencia,
        i.rfc,
        COALESCE(SUM(ns.cant), 0) AS total_cant,
        COALESCE(SUM(COALESCE(ns.asignar,0)), 0) AS total_asignado,
        COALESCE(SUM(ns.cant - COALESCE(ns.asignar,0)), 0) AS pendiente_asignar,
        COUNT(ns.id) AS num_productos,
        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(
            COALESCE(ns.asignar,0) * CASE
                WHEN ns.productos_idprod >= 1000 THEN COALESCE(pm.puntos, 0)
                ELSE COALESCE(p.puntos, 0)
            END
        ), 0) AS puntos_asignados,
        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_pendientes_nsalida,
        COALESCE((
            SELECT SUM(d.puntos)
            FROM asignaciones a2
            JOIN depositos d ON d.transacciones_idtransacciones = a2.idtransacciones
            WHERE a2.nsalida = t.idtransacciones
        ), 0) AS total_depositos_puntos
    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, t.horat, t.observaciones,
             t.inversionista_id_inver, i.nombre, i.appat, i.apmat, i.referencia, i.rfc
    ORDER BY t.fechat DESC, t.idtransacciones DESC
";
$stmt = $db->prepare($sql);
$stmt->execute([$fechaInicio, $fechaFin]);
$notas = $stmt->fetchAll(PDO::FETCH_ASSOC);

// Calcular campos derivados para el frontend
$pendientes  = 0;
$completadas = 0;
foreach ($notas as &$nota) {
    $nota['fecha']             = $nota['fechat'];
    $nota['cantidad_pagada']   = (float)($nota['puntos_nota'] ?? 0);
    $nota['ya_asignado']       = (int)($nota['total_asignado'] ?? 0);
    $nota['total_nsalida']     = (int)($nota['num_productos'] ?? 0);
    $nota['pendiente_asignar'] = (int)($nota['pendiente_asignar'] ?? 0);
    $nota['tiene_pendiente']   = ($nota['pendiente_asignar'] > 0);
    $nota['tiene_error']       = ((float)$nota['puntos_asignados'] > (float)$nota['puntos_nota']);
    if ($nota['tiene_pendiente']) $pendientes++;
    else $completadas++;
}
unset($nota);

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