<?php
/**
 * API v1 - Entry Point para App Android Ventas en Ruta
 * Autenticación via JWT (Bearer Token)
 */

header("Access-Control-Allow-Origin: *");
header("Access-Control-Allow-Methods: GET, POST, OPTIONS, PUT, DELETE");
header("Access-Control-Allow-Headers: Content-Type, Authorization");
header("Content-Type: application/json; charset=UTF-8");

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

if (!defined('BASEPATH')) define('BASEPATH', true);

// Includes
require("../connect.php");
require("./JWT.php");
include('../../../vendor/funciones.php');
include('../../../vendor/DBA.php');

// ============================================================
// Funciones de respuesta
// ============================================================

function sendResponse($success, $message = '', $data = null) {
    echo json_encode([
        "success" => $success,
        "message" => $message,
        "data" => $data
    ]);
    exit;
}

function sendPaginatedResponse($success, $message, $data, $total, $page, $limit) {
    echo json_encode([
        "success" => $success,
        "message" => $message,
        "data" => $data,
        "total" => intval($total),
        "page" => intval($page),
        "limit" => intval($limit),
        "pages" => intval(ceil($total / max($limit, 1)))
    ]);
    exit;
}

// ============================================================
// Funciones de autenticación JWT
// ============================================================

/**
 * Valida el JWT del header Authorization
 * Retorna los datos del usuario o null si es inválido
 */
function validateJWT() {
    global $conn;

    $headers = getallheaders();
    $authHeader = null;

    // Buscar header Authorization (case-insensitive)
    foreach ($headers as $key => $value) {
        if (strtolower($key) === 'authorization') {
            $authHeader = $value;
            break;
        }
    }

    if (!$authHeader || !preg_match('/^Bearer\s+(.+)$/i', $authHeader, $matches)) {
        return null;
    }

    $token = $matches[1];
    $payload = JWT::decode($token);

    if (!$payload || !isset($payload['sub'])) {
        return null;
    }

    $user_id = intval($payload['sub']);

    // Verificar que el usuario existe y está activo
    $query = "SELECT u.id, u.usuario, u.nombre, u.email, u.rol_id, r.nombre as rol_nombre
              FROM usuarios u
              LEFT JOIN roles r ON u.rol_id = r.id
              WHERE u.id = ? AND u.activo = 1";
    $stmt = $conn->prepare($query);
    $stmt->bind_param("i", $user_id);
    $stmt->execute();
    $result = $stmt->get_result();

    if (!$user = $result->fetch_assoc()) {
        return null;
    }

    // Obtener permisos
    $permisosQuery = "SELECT p.nombre
                     FROM rol_permisos rp
                     JOIN permisos p ON rp.permiso_id = p.id
                     WHERE rp.rol_id = ? AND p.activo = 1";
    $permisosStmt = $conn->prepare($permisosQuery);
    $permisosStmt->bind_param("i", $user['rol_id']);
    $permisosStmt->execute();
    $permisosResult = $permisosStmt->get_result();

    $permisos = [];
    while ($row = $permisosResult->fetch_assoc()) {
        $permisos[] = $row['nombre'];
    }

    $user['permisos'] = $permisos;

    return $user;
}

/**
 * Requiere autenticación JWT. Si falla, envía 401 y termina.
 * Retorna los datos del usuario autenticado.
 *
 * TODO: Reactivar validación JWT cuando se implemente auth en la app
 */
function requireAuth() {
    // --- AUTH DESACTIVADA TEMPORALMENTE ---
    // Para reactivar, descomentar las 5 lineas y borrar el return de abajo
    // $user = validateJWT();
    // if (!$user) {
    //     http_response_code(401);
    //     sendResponse(false, "No autorizado. Token inválido o expirado.");
    // }
    // return $user;

    return [
        'id' => 1,
        'usuario' => 'dev',
        'nombre' => 'Dev Temporal',
        'email' => '',
        'rol_id' => 1,
        'rol_nombre' => 'admin',
        'permisos' => []
    ];
}

/**
 * Verifica que el usuario tenga un permiso específico RBAC.
 */
function requirePermission($permiso) {
    $user = requireAuth();
    if (!in_array($permiso, $user['permisos'])) {
        http_response_code(403);
        sendResponse(false, "Permiso insuficiente: $permiso");
    }
    return $user;
}

// ============================================================
// Obtener tipo de operación
// ============================================================

$input = file_get_contents('php://input');
$datapost = json_decode($input, true);

$tipo = isset($_POST['tipo']) ? $_POST['tipo'] :
        (isset($_GET['tipo']) ? $_GET['tipo'] :
        (isset($datapost['tipo']) ? $datapost['tipo'] : ''));

// Limpiar input
if (isset($datapost) && is_array($datapost)) {
    array_walk_recursive($datapost, function (&$item) {
        if (is_string($item)) {
            $item = trim($item);
        }
    });
}

// ============================================================
// Router principal
// ============================================================

switch ($tipo) {
    // === Auth (no requieren JWT para login) ===
    case 'login':
    case 'logout':
    case 'me':
    case 'cambiarPassword':
        include('./Auth.php');
        break;

    // === Productos ===
    case 'getProductos':
    case 'getProducto':
    case 'buscarProductos':
    case 'getCategorias':
    case 'getAlmacenes':
    case 'getInventarioAlmacen':
    case 'getPreciosProducto':
    case 'calcularPrecio':
        include('./Productos.php');
        break;

    // === Clientes ===
    case 'getClientes':
    case 'getCliente':
    case 'crearCliente':
    case 'actualizarCliente':
    case 'getCreditoCliente':
    case 'getHistorialCliente':
    case 'getVentasCliente':
    case 'agregarDireccion':
    case 'actualizarDireccion':
    case 'agregarTelefono':
        include('./Clientes.php');
        break;

    // === Pedidos ===
    case 'getPedidos':
    case 'getPedido':
    case 'crearPedido':
    case 'actualizarPedido':
    case 'confirmarPedido':
    case 'cancelarPedido':
    case 'actualizarEstadoPedido':
    case 'registrarPagoPedido':
    case 'eliminarLineaPedido':
    case 'cobroGlobal':
        include('./Pedidos.php');
        break;

    // === Cotizaciones ===
    case 'getCotizaciones':
    case 'getCotizacion':
    case 'crearCotizacion':
    case 'actualizarCotizacion':
    case 'eliminarCotizacion':
    case 'convertirCotizacion':
    case 'compartirCotizacion':
        include('./Cotizaciones.php');
        break;

    // === Logística ===
    case 'getRutas':
    case 'getRuta':
    case 'getPedidosRuta':
    case 'actualizarEstadoEntrega':
    case 'cobrarEntrega':
    case 'calcularFlete':
        include('./Logistica.php');
        break;

    // === Info ===
    case 'ping':
        sendResponse(true, "API v1 activa", [
            'version' => '1.0.0',
            'date' => date('Y-m-d H:i:s'),
            'system' => 'POS Abarrotes API v1 - Ventas en Ruta'
        ]);
        break;

    default:
        sendResponse(false, "Operación no implementada: " . $tipo);
        break;
}
