<?php

/**
 * Repartidores.php - Manejo de repartidores/vendedores
 */

// Incluir modelos necesarios
require_once __DIR__ . '/../../modelos/Repartidor.php';
require_once __DIR__ . '/../../modelos/Usuario.php';
require_once __DIR__ . '/../../modelos/Auth.php';

// Función para enviar respuesta JSON (si no está definida)
if (!function_exists('sendResponse')) {
    function sendResponse($success, $message = '', $data = null)
    {
        echo json_encode([
            "success" => $success,
            "message" => $message,
            "data" => $data
        ]);
        exit;
    }
}

// Función para validar token (si no está definida)
if (!function_exists('validateToken')) {
    function validateToken($conn, $authHeader)
    {
        error_log("Validando token en Repartidores.php...");

        if (empty($authHeader)) {
            error_log("Header Authorization vacío");
            return null;
        }

        $token = str_replace('Bearer ', '', $authHeader);

        // Usar el modelo Auth para verificar el JWT
        $auth = new Auth($conn);
        $userData = $auth->obtenerUsuarioDeToken($token);

        if ($userData) {
            error_log("Usuario validado: " . $userData['username']);
            return $userData;
        }

        return null;
    }
}

// Instanciar modelos
$repartidor = new Repartidor($conn);
$usuario = new Usuario($conn);

// Verificar autenticación
$authHeader = $_SERVER['HTTP_AUTHORIZATION'] ?? '';
if (empty($authHeader)) {
    $authHeader = getallheaders()['Authorization'] ?? '';
}

// Validar token
$user = validateToken($conn, $authHeader);

// Operaciones que NO requieren autenticación (para app móvil)
$operacionesPublicas = ['loginRepartidor'];

if (!$user && !in_array($tipo, $operacionesPublicas)) {
    sendResponse(false, "No autorizado " . json_encode($authHeader) . " " . json_encode($user));
}

// === OBTENER TODOS LOS REPARTIDORES ===
if ($tipo === 'getRepartidores') {
    error_log("=== OBTENIENDO REPARTIDORES ===");

    // Verificar permisos
    if (!$usuario->verificarPermiso($user['sub'], 'repartidores', 'leer')) {
        sendResponse(false, "Sin permisos para ver repartidores");
    }

    try {
        $filtros = [];
        if (isset($datapost['search'])) $filtros['search'] = $datapost['search'];
        if (isset($datapost['estado'])) $filtros['estado'] = $datapost['estado'];
        if (isset($datapost['zona'])) $filtros['zona'] = $datapost['zona'];
        if (isset($datapost['vehiculo'])) $filtros['vehiculo'] = $datapost['vehiculo'];

        $repartidores = $repartidor->obtenerTodos($filtros);
        sendResponse(true, "Repartidores obtenidos", $repartidores);
    } catch (Exception $e) {
        error_log("Error obteniendo repartidores: " . $e->getMessage());
        sendResponse(false, "Error al obtener repartidores");
    }
}

// === OBTENER UN REPARTIDOR ===
if ($tipo === 'getRepartidor') {
    error_log("=== OBTENIENDO REPARTIDOR ===");

    $id = isset($datapost['id']) ? $datapost['id'] : null;

    if (!$id) {
        sendResponse(false, "ID de repartidor requerido");
    }

    // Verificar permisos
    if (!$usuario->verificarPermiso($user['sub'], 'repartidores', 'leer')) {
        sendResponse(false, "Sin permisos para ver repartidor");
    }

    try {
        $data = $repartidor->obtenerPorId($id);
        if ($data) {
            sendResponse(true, "Repartidor obtenido", $data);
        } else {
            sendResponse(false, "Repartidor no encontrado");
        }
    } catch (Exception $e) {
        error_log("Error obteniendo repartidor: " . $e->getMessage());
        sendResponse(false, "Error al obtener repartidor");
    }
}

// === CREAR REPARTIDOR ===
if ($tipo === 'createRepartidor') {
    error_log("=== CREANDO REPARTIDOR ===");

    // Verificar permisos
    if (!$usuario->verificarPermiso($user['sub'], 'repartidores', 'crear')) {
        sendResponse(false, "Sin permisos para crear repartidores");
    }

    // Validar campos requeridos
    $camposRequeridos = ['nombre', 'apellidos', 'telefono', 'email', 'password'];
    foreach ($camposRequeridos as $campo) {
        if (empty($datapost[$campo])) {
            sendResponse(false, "Campo requerido: $campo");
        }
    }

    // Validar email único
    if ($repartidor->emailExiste($datapost['email'])) {
        sendResponse(false, "El email ya está registrado");
    }

    try {
        $resultado = $repartidor->crear($datapost);
        sendResponse(true, "Repartidor creado exitosamente", $resultado);
    } catch (Exception $e) {
        error_log("Error creando repartidor: " . $e->getMessage());
        sendResponse(false, "Error al crear repartidor: " . $e->getMessage());
    }
}

// === ACTUALIZAR REPARTIDOR ===
if ($tipo === 'updateRepartidor') {
    error_log("=== ACTUALIZANDO REPARTIDOR ===");

    $id = isset($datapost['id']) ? $datapost['id'] : null;

    if (!$id) {
        sendResponse(false, "ID de repartidor requerido");
    }

    // Verificar permisos
    if (!$usuario->verificarPermiso($user['sub'], 'repartidores', 'editar')) {
        // sendResponse(false, "Sin permisos para editar repartidores");
    }

    // Validar email único (si se está actualizando)
    if (!empty($datapost['email']) && $repartidor->emailExiste($datapost['email'], $id)) {
        sendResponse(false, "El email ya está registrado por otro repartidor");
    }

    try {
        $resultado = $repartidor->actualizar($id, $datapost);
        if ($resultado) {
            sendResponse(true, "Repartidor actualizado exitosamente");
        } else {
            sendResponse(false, "Error al actualizar repartidor");
        }
    } catch (Exception $e) {
        error_log("Error actualizando repartidor: " . $e->getMessage());
        sendResponse(false, "Error al actualizar repartidor: " . $e->getMessage());
    }
}


// === ELIMINAR REPARTIDOR ===
if ($tipo === 'deleteRepartidor') {
    error_log("=== ELIMINANDO REPARTIDOR ===");

    $id = isset($datapost['id']) ? $datapost['id'] : null;

    if (!$id) {
        sendResponse(false, "ID de repartidor requerido");
    }

    // Verificar permisos
    if (!$usuario->verificarPermiso($user['sub'], 'repartidores', 'eliminar')) {
        sendResponse(false, "Sin permisos para eliminar repartidores");
    }

    try {
        $resultado = $repartidor->eliminar($id);
        if ($resultado) {
            sendResponse(true, "Repartidor eliminado exitosamente");
        } else {
            sendResponse(false, "Error al eliminar repartidor");
        }
    } catch (Exception $e) {
        error_log("Error eliminando repartidor: " . $e->getMessage());
        sendResponse(false, "Error al eliminar repartidor: " . $e->getMessage());
    }
}

// === OBTENER ESTADÍSTICAS ===
if ($tipo === 'getEstadisticasRepartidores') {
    error_log("=== OBTENIENDO ESTADÍSTICAS DE REPARTIDORES ===");

    // Verificar permisos
    if (!$usuario->verificarPermiso($user['sub'], 'repartidores', 'leer')) {
        sendResponse(false, "Sin permisos para ver estadísticas");
    }

    try {
        $estadisticas = $repartidor->obtenerEstadisticas();
        sendResponse(true, "Estadísticas obtenidas", $estadisticas);
    } catch (Exception $e) {
        error_log("Error obteniendo estadísticas: " . $e->getMessage());
        sendResponse(false, "Error al obtener estadísticas");
    }
}

// === LOGIN PARA APP MÓVIL ===
if ($tipo === 'loginRepartidor') {
    error_log("=== LOGIN REPARTIDOR APP MÓVIL ===");

    $email = isset($datapost['email']) ? $datapost['email'] : null;
    $password = isset($datapost['password']) ? $datapost['password'] : null;

    if (!$email || !$password) {
        sendResponse(false, "Email y contraseña requeridos");
    }

    try {
        $repartidorData = $repartidor->validarLogin($email, $password);

        if ($repartidorData) {
            // Generar token JWT para la sesión móvil
            $auth = new Auth($conn);
            $payload = [
                'sub' => 'repartidor_' . $repartidorData['id'],
                'repartidor_id' => $repartidorData['id'],
                'email' => $repartidorData['email'],
                'nombre' => $repartidorData['nombre'] . ' ' . $repartidorData['apellidos'],
                'codigo' => $repartidorData['codigo'],
                'tipo_usuario' => 'repartidor',
                'iat' => time(),
                'exp' => time() + (7 * 24 * 60 * 60) // Token válido por 7 días
            ];

            $token = $auth->generarJWT($payload);

            // Guardar sesión en repartidores_sesiones
            try {
                // Obtener información del dispositivo si está disponible
                $deviceInfo = $datapost['device_info'] ?? null;
                $appVersion = $datapost['app_version'] ?? null;

                // Si no viene device_info, crear uno básico
                if (!$deviceInfo) {
                    $deviceInfo = json_encode([
                        'user_agent' => $_SERVER['HTTP_USER_AGENT'] ?? 'Unknown',
                        'ip' => $_SERVER['REMOTE_ADDR'] ?? 'Unknown'
                    ]);
                }

                // Cerrar sesiones anteriores del mismo repartidor (opcional)
                $queryClose = "UPDATE repartidores_sesiones
                               SET estado = 'cerrada', fin_sesion = NOW()
                               WHERE repartidor_id = :repartidor_id
                               AND estado = 'activa'";
                $stmtClose = $conn->prepare($queryClose);
                $stmtClose->bindParam(':repartidor_id', $repartidorData['id']);
                $stmtClose->execute();

                // Insertar nueva sesión
                $querySession = "INSERT INTO repartidores_sesiones
                                (repartidor_id, session_token, device_info, app_version, estado)
                                VALUES (:repartidor_id, :session_token, :device_info, :app_version, 'activa')";
                $stmtSession = $conn->prepare($querySession);
                $stmtSession->bindParam(':repartidor_id', $repartidorData['id']);
                $stmtSession->bindParam(':session_token', $token);
                $stmtSession->bindParam(':device_info', $deviceInfo);
                $stmtSession->bindParam(':app_version', $appVersion);
                $stmtSession->execute();

                error_log("Sesión guardada para repartidor ID: " . $repartidorData['id']);
            } catch (Exception $e) {
                error_log("Error guardando sesión: " . $e->getMessage());
                // No fallar el login si hay error guardando la sesión
            }

            sendResponse(true, "Login exitoso", [
                'repartidor' => $repartidorData,
                'token' => $token,
                'expires_in' => 7 * 24 * 60 * 60 // 7 días en segundos
            ]);
        } else {
            sendResponse(false, "Credenciales inválidas o cuenta inactiva");
        }
    } catch (Exception $e) {
        error_log("Error en login de repartidor: " . $e->getMessage());
        sendResponse(false, "Error en el sistema de login");
    }
}

// === GENERAR CÓDIGO ÚNICO ===
if ($tipo === 'generarCodigoRepartidor') {
    error_log("=== GENERANDO CÓDIGO DE REPARTIDOR ===");

    // Verificar permisos
    if (!$usuario->verificarPermiso($user['sub'], 'repartidores', 'crear')) {
        sendResponse(false, "Sin permisos para generar códigos");
    }

    try {
        // Usar método privado a través de reflexión o crear instancia temporal
        $tempRepartidor = new Repartidor($conn);

        // Como el método es privado, vamos a duplicar la lógica aquí
        $query = "SELECT MAX(CAST(SUBSTRING(codigo, 5) AS UNSIGNED)) as max_num FROM repartidores WHERE codigo LIKE 'REP-%'";
        $stmt = $conn->prepare($query);
        $stmt->execute();
        $result = $stmt->fetch(PDO::FETCH_ASSOC);

        $nextNum = ($result['max_num'] ?? 0) + 1;
        $codigo = 'REP-' . str_pad($nextNum, 3, '0', STR_PAD_LEFT);

        sendResponse(true, "Código generado", ['codigo' => $codigo]);
    } catch (Exception $e) {
        error_log("Error generando código: " . $e->getMessage());
        sendResponse(false, "Error al generar código");
    }
}

// Si llegamos aquí, la operación no fue reconocida
sendResponse(false, "Operación no válida: $tipo");
