<?php

/**
 * Productos.php - Manejo de productos
 */

// Incluir modelos necesarios
require_once '../../modelos/Producto.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 Productos.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);
$producto = new Producto($conn);

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

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

    try {
        $filtros = [];
        if (isset($datapost['search']) && $datapost['search'] !== '') {
            $filtros['search'] = $datapost['search'];
        }
        if (isset($datapost['categoria_id']) && $datapost['categoria_id'] !== '') {
            $filtros['categoria_id'] = $datapost['categoria_id'];
        }
        if (isset($datapost['activo']) && $datapost['activo'] !== '') {
            $filtros['activo'] = $datapost['activo'];
        }
        if (isset($datapost['stock_bajo']) && $datapost['stock_bajo']) {
            $filtros['stock_bajo'] = $datapost['stock_bajo'];
        }

        error_log("Filtros recibidos: " . json_encode($filtros));

        $productos = $producto->obtenerTodos($filtros);

        error_log("Productos encontrados: " . count($productos));

        sendResponse(true, "Productos obtenidos", $productos);
    } catch (Exception $e) {
        error_log("Error obteniendo productos: " . $e->getMessage());
        sendResponse(false, "Error al obtener productos");
    }
}

// === OBTENER UN PRODUCTO ===
if ($tipo === 'getProducto') {
    error_log("=== OBTENIENDO PRODUCTO ===");

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

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

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

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

// === CREAR PRODUCTO ===
if ($tipo === 'createProducto') {
    error_log("=== CREANDO PRODUCTO ===");

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

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

    try {
        // Valores por defecto
        $datos = [
            'codigo' => $datapost['codigo'],
            'nombre' => $datapost['nombre'],
            'categoria_id' => $datapost['categoria_id'] ?? null,
            'precio' => floatval($datapost['precio']),
            'costo' => floatval($datapost['costo'] ?? 0),
            'stock_actual' => intval($datapost['stock_actual'] ?? 0),
            'stock_minimo' => intval($datapost['stock_minimo'] ?? 0),
            'stock_maximo' => intval($datapost['stock_maximo'] ?? 100),
            'unidad_medida' => $datapost['unidad_medida'] ?? 'unidad',
            'codigo_barras' => $datapost['codigo_barras'] ?? null,
            'imagen_url' => $datapost['imagen_url'] ?? null,
            'activo' => intval($datapost['activo'] ?? 1)
        ];

        $productoId = $producto->crear($datos);

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

// === ACTUALIZAR PRODUCTO ===
if ($tipo === 'updateProducto') {
    error_log("=== ACTUALIZANDO PRODUCTO ===");

    // Re-leer el input por si $datapost no tiene todos los campos
    $rawInput = file_get_contents('php://input');
    error_log("Raw input: " . $rawInput);
    $inputData = json_decode($rawInput, true);
    error_log("Input parseado: " . json_encode($inputData));

    // Usar $inputData si $datapost no tiene los campos necesarios
    if (!isset($datapost) || !is_array($datapost)) {
        $datapost = $inputData;
    } else {
        // Mergear por si faltan campos
        $datapost = array_merge($inputData ?? [], $datapost);
    }

    error_log("Datapost final: " . json_encode($datapost));

    $id = isset($datapost['id']) ? $datapost['id'] : null;
    error_log("ID del producto: " . $id);

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

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

    try {
        $datos = [];
        $allowedFields = [
            'codigo',
            'nombre',
            'categoria_id',
            'precio',
            'costo',
            'stock_actual',
            'stock_minimo',
            'stock_maximo',
            'unidad_medida',
            'codigo_barras',
            'imagen_url',
            'activo',
            'orden'
        ];

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

        error_log("Campos en datapost: " . json_encode(array_keys($datapost)));
        error_log("Datos filtrados para actualizar: " . json_encode($datos));

        if (empty($datos)) {
            error_log("No hay datos para actualizar");
            // DEBUG: Enviar información de lo que se recibió
            sendResponse(false, "No hay datos para actualizar. Recibido: " . json_encode(array_keys($datapost ?? [])) . " - Valores: " . json_encode($datapost));
        }

        error_log("Datos a actualizar: " . json_encode($datos));

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

// === ELIMINAR PRODUCTO ===
if ($tipo === 'deleteProducto') {
    error_log("=== ELIMINANDO PRODUCTO ===");

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

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

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

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

// === OBTENER CATEGORÍAS ===
if ($tipo === 'getCategorias') {
    error_log("=== OBTENIENDO CATEGORÍAS ===");

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

    try {
        $categorias = $producto->obtenerCategorias();
        sendResponse(true, "Categorías obtenidas", $categorias);
    } catch (Exception $e) {
        error_log("Error obteniendo categorías: " . $e->getMessage());
        sendResponse(false, "Error al obtener categorías");
    }
}

// === CREAR CATEGORÍA ===
if ($tipo === 'createCategoria') {
    error_log("=== CREANDO CATEGORÍA ===");

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

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

    if (empty($nombre)) {
        sendResponse(false, "Nombre de categoría requerido");
    }

    try {
        $categoriaId = $producto->crearCategoria($nombre, $descripcion);
        if ($categoriaId) {
            sendResponse(true, "Categoría creada exitosamente", ['id' => $categoriaId]);
        } else {
            sendResponse(false, "Error al crear categoría");
        }
    } catch (Exception $e) {
        error_log("Error creando categoría: " . $e->getMessage());
        sendResponse(false, "Error al crear categoría");
    }
}

// === ACTUALIZAR STOCK ===
if ($tipo === 'updateStock') {
    error_log("=== ACTUALIZANDO STOCK ===");

    $id = isset($datapost['id']) ? $datapost['id'] : null;
    $nuevoStock = isset($datapost['stock']) ? intval($datapost['stock']) : null;
    $motivoId = isset($datapost['motivo_id']) ? $datapost['motivo_id'] : null;
    $motivoTexto = isset($datapost['motivo_texto']) ? $datapost['motivo_texto'] : null;

    if (!$id || $nuevoStock === null) {
        sendResponse(false, "ID de producto y stock requeridos");
    }

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

    try {
        if ($producto->actualizarStock($id, $nuevoStock, $motivoId, $motivoTexto, $user['sub'])) {
            sendResponse(true, "Stock actualizado exitosamente");
        } else {
            sendResponse(false, "Error al actualizar stock");
        }
    } catch (Exception $e) {
        error_log("Error actualizando stock: " . $e->getMessage());
        sendResponse(false, $e->getMessage());
    }
}

// === OBTENER MOVIMIENTOS DE STOCK ===
if ($tipo === 'getMovimientos') {
    error_log("=== OBTENIENDO MOVIMIENTOS ===");

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

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

    try {
        $movimientos = $producto->obtenerMovimientos($productoId, $limit);
        sendResponse(true, "Movimientos obtenidos", $movimientos);
    } catch (Exception $e) {
        error_log("Error obteniendo movimientos: " . $e->getMessage());
        sendResponse(false, "Error al obtener movimientos");
    }
}

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

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

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