<?php

/**
 * ClientesRepartidor.php - Endpoints de clientes para repartidores
 * Este archivo maneja operaciones de clientes específicas para repartidores móviles
 */

// 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;
    }
}

// === BUSCAR CLIENTES (para repartidores) ===
if ($tipo === 'buscarClientesRepartidor') {
    error_log("=== BUSCAR CLIENTES REPARTIDOR ===");

    // Obtener token del repartidor
    $authHeader = $_SERVER['HTTP_AUTHORIZATION'] ?? '';
    if (empty($authHeader)) {
        $headers = getallheaders();
        $authHeader = $headers['Authorization'] ?? '';
    }

    if (empty($authHeader)) {
        sendResponse(false, "Token de autenticación requerido");
    }

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

    // Verificar token y obtener repartidor_id
    require_once __DIR__ . '/../../modelos/Auth.php';
    $auth = new Auth($conn);
    $payload = $auth->verificarJWT($token);

    if (!$payload) {
        sendResponse(false, "Token inválido o expirado");
    }

    $repartidorId = $payload['repartidor_id'] ?? null;
    if (!$repartidorId) {
        sendResponse(false, "Token no válido para repartidor");
    }

    // Obtener parámetros de búsqueda
    $busqueda = isset($datapost['busqueda']) ? trim($datapost['busqueda']) : '';
    $limite = isset($datapost['limite']) ? (int)$datapost['limite'] : 20;

    if (empty($busqueda)) {
        sendResponse(false, "Parámetro de búsqueda requerido");
    }

    if (strlen($busqueda) < 2) {
        sendResponse(false, "La búsqueda debe tener al menos 2 caracteres");
    }

    try {
        error_log("Buscando clientes con: '$busqueda', límite: $limite");

        // Preparar parámetros de búsqueda
        $busquedaLike = "%{$busqueda}%";
        $busquedaInicio = "{$busqueda}%";

        // Buscar clientes por nombre, nombre comercial, código, teléfono
        $query = "SELECT
                    c.id,
                    c.codigo,
                    c.nombre,
                    c.apellidos,
                    c.nombre_comercial,
                    c.telefono,
                    c.telefono_secundario,
                    c.direccion,
                    c.latitud,
                    c.longitud,
                    c.activo,
                    qr.codigo as codigo_qr,
                    qr.id as codigo_qr_id
                  FROM clientes c
                  LEFT JOIN codigos_qr qr ON c.id = qr.cliente_id AND qr.estado = 'asignado'
                  WHERE c.activo = 1
                    AND (
                        c.nombre LIKE ?
                        OR c.apellidos LIKE ?
                        OR c.nombre_comercial LIKE ?
                        OR c.codigo LIKE ?
                        OR c.telefono LIKE ?
                        OR c.telefono_secundario LIKE ?
                    )
                  ORDER BY
                    CASE
                        WHEN c.codigo = ? THEN 1
                        WHEN c.nombre_comercial LIKE ? THEN 2
                        WHEN c.nombre LIKE ? THEN 3
                        ELSE 4
                    END,
                    c.nombre_comercial ASC
                  LIMIT ?";

        $stmt = $conn->prepare($query);

        // Bindear parámetros en orden
        $stmt->execute([
            $busquedaLike,        // 1 - c.nombre LIKE
            $busquedaLike,        // 2 - c.apellidos LIKE
            $busquedaLike,        // 3 - c.nombre_comercial LIKE
            $busquedaLike,        // 4 - c.codigo LIKE
            $busquedaLike,        // 5 - c.telefono LIKE
            $busquedaLike,        // 6 - c.telefono_secundario LIKE
            $busqueda,            // 7 - c.codigo = (exacto)
            $busquedaInicio,      // 8 - c.nombre_comercial LIKE (inicio)
            $busquedaInicio,      // 9 - c.nombre LIKE (inicio)
            $limite               // 10 - LIMIT
        ]);

        $clientes = $stmt->fetchAll(PDO::FETCH_ASSOC);

        error_log("Clientes encontrados: " . count($clientes));

        sendResponse(true, "Clientes encontrados", $clientes);

    } catch (Exception $e) {
        error_log("Error buscando clientes: " . $e->getMessage());
        error_log("Stack trace: " . $e->getTraceAsString());
        sendResponse(false, "Error al buscar clientes: " . $e->getMessage());
    }
}

// === OBTENER TODOS LOS CLIENTES (para sincronización offline) ===
if ($tipo === 'getTodosClientesRepartidor') {
    error_log("=== OBTENER TODOS LOS CLIENTES REPARTIDOR ===");

    // Obtener token del repartidor
    $authHeader = $_SERVER['HTTP_AUTHORIZATION'] ?? '';
    if (empty($authHeader)) {
        $headers = getallheaders();
        $authHeader = $headers['Authorization'] ?? '';
    }

    if (empty($authHeader)) {
        sendResponse(false, "Token de autenticación requerido");
    }

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

    require_once __DIR__ . '/../../modelos/Auth.php';
    $auth = new Auth($conn);
    $payload = $auth->verificarJWT($token);

    if (!$payload) {
        sendResponse(false, "Token inválido o expirado");
    }

    $repartidorId = $payload['repartidor_id'] ?? null;
    if (!$repartidorId) {
        sendResponse(false, "Token no válido para repartidor");
    }

    try {
        $query = "SELECT
                    c.id,
                    c.codigo,
                    c.nombre,
                    c.apellidos,
                    c.nombre_comercial,
                    c.telefono,
                    c.telefono_secundario,
                    c.direccion,
                    c.latitud,
                    c.longitud,
                    c.activo,
                    qr.codigo as codigo_qr,
                    qr.id as codigo_qr_id
                  FROM clientes c
                  LEFT JOIN codigos_qr qr ON c.id = qr.cliente_id AND qr.estado = 'asignado'
                  WHERE c.activo = 1
                  ORDER BY c.nombre_comercial ASC";

        $stmt = $conn->prepare($query);
        $stmt->execute();
        $clientes = $stmt->fetchAll(PDO::FETCH_ASSOC);

        error_log("Total de clientes descargados: " . count($clientes));

        sendResponse(true, "Clientes obtenidos", $clientes);

    } catch (Exception $e) {
        error_log("Error obteniendo todos los clientes: " . $e->getMessage());
        sendResponse(false, "Error al obtener clientes: " . $e->getMessage());
    }
}

// === OBTENER CLIENTE POR ID (para repartidores) ===
if ($tipo === 'getClienteRepartidor') {
    error_log("=== OBTENER CLIENTE REPARTIDOR ===");

    // Obtener token del repartidor
    $authHeader = $_SERVER['HTTP_AUTHORIZATION'] ?? '';
    if (empty($authHeader)) {
        $headers = getallheaders();
        $authHeader = $headers['Authorization'] ?? '';
    }

    if (empty($authHeader)) {
        sendResponse(false, "Token de autenticación requerido");
    }

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

    // Verificar token y obtener repartidor_id
    require_once __DIR__ . '/../../modelos/Auth.php';
    $auth = new Auth($conn);
    $payload = $auth->verificarJWT($token);

    if (!$payload) {
        sendResponse(false, "Token inválido o expirado");
    }

    $repartidorId = $payload['repartidor_id'] ?? null;
    if (!$repartidorId) {
        sendResponse(false, "Token no válido para repartidor");
    }

    // Obtener parámetro
    $clienteId = isset($datapost['cliente_id']) ? (int)$datapost['cliente_id'] : 0;

    if ($clienteId <= 0) {
        sendResponse(false, "ID de cliente requerido");
    }

    try {
        error_log("Obteniendo cliente ID: $clienteId");

        $query = "SELECT
                    c.id,
                    c.codigo,
                    c.nombre,
                    c.apellidos,
                    c.nombre_comercial,
                    c.telefono,
                    c.telefono_secundario,
                    c.direccion,
                    c.latitud,
                    c.longitud,
                    c.activo,
                    qr.codigo as codigo_qr,
                    qr.id as codigo_qr_id
                  FROM clientes c
                  LEFT JOIN codigos_qr qr ON c.id = qr.cliente_id AND qr.estado = 'asignado'
                  WHERE c.id = :cliente_id
                    AND c.activo = 1";

        $stmt = $conn->prepare($query);
        $stmt->bindParam(':cliente_id', $clienteId, PDO::PARAM_INT);
        $stmt->execute();

        $cliente = $stmt->fetch(PDO::FETCH_ASSOC);

        if (!$cliente) {
            sendResponse(false, "Cliente no encontrado o inactivo");
        }

        error_log("Cliente encontrado: " . $cliente['nombre_comercial']);

        sendResponse(true, "Cliente obtenido", $cliente);

    } catch (Exception $e) {
        error_log("Error obteniendo cliente: " . $e->getMessage());
        error_log("Stack trace: " . $e->getTraceAsString());
        sendResponse(false, "Error al obtener cliente: " . $e->getMessage());
    }
}
