<?php

/**
 * Clientes.php - Manejo de clientes
 */

// Incluir modelos necesarios
require_once '../../modelos/Cliente.php';
require_once '../../modelos/Usuario.php';
require_once '../../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 Clientes.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;
    }
}

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



// Validar token
$user = validateToken($conn, $authHeader);
if (!$user) {
    sendResponse(false, "No autorizado " . json_encode($authHeader) . " " . json_encode($user));
}

$usuario = new Usuario($conn);
$cliente = new Cliente($conn);

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

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

    try {
        $filtros = [];
        if (isset($datapost['search'])) $filtros['search'] = $datapost['search'];
        if (isset($datapost['activo'])) $filtros['activo'] = $datapost['activo'];
        if (isset($datapost['tiene_rutas'])) $filtros['tiene_rutas'] = $datapost['tiene_rutas'];
        if (isset($datapost['tiene_qr'])) $filtros['tiene_qr'] = $datapost['tiene_qr'];
        if (isset($datapost['limit'])) $filtros['limit'] = $datapost['limit'];
        if (isset($datapost['offset'])) $filtros['offset'] = $datapost['offset'];

        $clientes = $cliente->obtenerTodos($filtros);

        // Si se usa paginación, también devolver el total
        if (isset($datapost['limit'])) {
            $total = $cliente->contarTodos($filtros);
            sendResponse(true, "Clientes obtenidos", [
                'clientes' => $clientes,
                'total' => $total,
                'limit' => intval($datapost['limit']),
                'offset' => intval($datapost['offset'] ?? 0)
            ]);
        } else {
            sendResponse(true, "Clientes obtenidos", $clientes);
        }
    } catch (Exception $e) {
        error_log("Error obteniendo clientes: " . $e->getMessage());
        sendResponse(false, "Error al obtener clientes");
    }
}

// === OBTENER UN CLIENTE ===
if ($tipo === 'getCliente') {
    error_log("=== OBTENIENDO CLIENTE ===");

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

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

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

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

// === CREAR CLIENTE ===
if ($tipo === 'createCliente') {
    error_log("=== CREANDO CLIENTE ===");

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

    // Validar datos requeridos
    $requiredFields = ['nombre', 'nombre_comercial'];
    foreach ($requiredFields as $field) {
        if (empty($datapost[$field])) {
            sendResponse(false, "Campo requerido: $field");
        }
    }

    try {
        // Generar código automático si no se proporciona
        $codigo = !empty($datapost['codigo']) ? $datapost['codigo'] : $cliente->generarCodigoAutomatico();

        $datos = [
            'codigo' => $codigo,
            'nombre' => $datapost['nombre'],
            'apellidos' => $datapost['apellidos'] ?? null,
            'nombre_comercial' => $datapost['nombre_comercial'],
            'telefono' => $datapost['telefono'] ?? null,
            'telefono_secundario' => $datapost['telefono_secundario'] ?? null,
            'direccion' => $datapost['direccion'] ?? null,
            'codigo_postal' => $datapost['codigo_postal'] ?? null,
            'pais' => $datapost['pais'] ?? 'México',
            'latitud' => $datapost['latitud'] ?? null,
            'longitud' => $datapost['longitud'] ?? null,
            'activo' => intval($datapost['activo'] ?? 1),
            'tiene_credito' => intval($datapost['tiene_credito'] ?? 0),
            'mobiliario' => $datapost['mobiliario'] ?? null
        ];

        $clienteId = $cliente->crear($datos);

        if ($clienteId) {
            sendResponse(true, "Cliente creado exitosamente", ['id' => $clienteId, 'codigo' => $codigo]);
        } else {
            sendResponse(false, "Error al crear cliente");
        }
    } catch (Exception $e) {
        error_log("Error creando cliente: " . $e->getMessage());
        sendResponse(false, $e->getMessage());
    }
}

// === ACTUALIZAR CLIENTE ===
if ($tipo === 'updateCliente') {
    error_log("=== ACTUALIZANDO CLIENTE ===");

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

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

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

    try {
        $datos = [];
        $allowedFields = [
            'codigo',
            'nombre',
            'apellidos',
            'nombre_comercial',
            'telefono',
            'telefono_secundario',
            'direccion',
            'codigo_postal',
            'pais',
            'latitud',
            'longitud',
            'activo',
            'tiene_credito',
            'mobiliario'
        ];

        foreach ($allowedFields as $field) {
            if (isset($datapost[$field])) {
                $datos[$field] = $datapost[$field];
            }
        }

        if (empty($datos)) {
            sendResponse(false, "No hay datos para actualizar");
        }

        if ($cliente->actualizar($id, $datos)) {
            sendResponse(true, "Cliente actualizado exitosamente");
        } else {
            sendResponse(false, "Error al actualizar cliente");
        }
    } catch (Exception $e) {
        error_log("Error actualizando cliente: " . $e->getMessage());
        sendResponse(false, $e->getMessage());
    }
}

// === ELIMINAR CLIENTE ===
if ($tipo === 'deleteCliente') {
    error_log("=== ELIMINANDO CLIENTE ===");

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

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

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

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

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

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

    try {
        $estadisticas = $cliente->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");
    }
}

// === OBTENER HISTORIAL DE CLIENTE ===
if ($tipo === 'getHistorialCliente') {
    error_log("=== OBTENIENDO HISTORIAL DE CLIENTE ===");

    $clienteId = isset($datapost['cliente_id']) ? $datapost['cliente_id'] : null;
    $limit = isset($datapost['limit']) ? intval($datapost['limit']) : 50;

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

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

    try {
        $historial = $cliente->obtenerHistorial($clienteId, $limit);
        sendResponse(true, "Historial obtenido", $historial);
    } catch (Exception $e) {
        error_log("Error obteniendo historial: " . $e->getMessage());
        sendResponse(false, "Error al obtener historial");
    }
}

// === GENERAR CÓDIGO AUTOMÁTICO ===
if ($tipo === 'generarCodigoCliente') {
    error_log("=== GENERANDO CÓDIGO AUTOMÁTICO ===");

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

    try {
        $codigo = $cliente->generarCodigoAutomatico();
        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");
    }
}

// === AGREGAR NOTA AL HISTORIAL ===
if ($tipo === 'addNotaCliente') {
    error_log("=== AGREGANDO NOTA A CLIENTE ===");

    $clienteId = isset($datapost['cliente_id']) ? $datapost['cliente_id'] : null;
    $nota = isset($datapost['nota']) ? $datapost['nota'] : null;

    if (!$clienteId || !$nota) {
        sendResponse(false, "ID de cliente y nota requeridos");
    }

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

    try {
        $resultado = $cliente->registrarHistorial($clienteId, $user['sub'], 'nota', $nota);
        if ($resultado) {
            sendResponse(true, "Nota agregada exitosamente");
        } else {
            sendResponse(false, "Error al agregar nota");
        }
    } catch (Exception $e) {
        error_log("Error agregando nota: " . $e->getMessage());
        sendResponse(false, "Error al agregar nota");
    }
}
