<?php

/**
 * MotivosStock.php - Manejo de motivos de stock
 */

// Incluir modelos necesarios
require_once '../../modelos/MotivoStock.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 MotivosStock.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);
$motivoStock = new MotivoStock($conn);

// === OBTENER TODOS LOS MOTIVOS ===
if ($tipo === 'getMotivosStock') {
    error_log("=== OBTENIENDO MOTIVOS DE STOCK ===");

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

    try {
        $filtros = [];
        if (isset($datapost['search'])) $filtros['search'] = $datapost['search'];
        if (isset($datapost['tipo_movimiento'])) $filtros['tipo_movimiento'] = $datapost['tipo_movimiento'];
        if (isset($datapost['activo'])) $filtros['activo'] = $datapost['activo'];

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

// === OBTENER UN MOTIVO ===
if ($tipo === 'getMotivoStock') {
    error_log("=== OBTENIENDO MOTIVO DE STOCK ===");

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

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

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

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

// === CREAR MOTIVO ===
if ($tipo === 'createMotivoStock') {
    error_log("=== CREANDO MOTIVO DE STOCK ===");

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

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

    try {
        $datos = [
            'nombre' => $datapost['nombre'],
            'descripcion' => $datapost['descripcion'] ?? '',
            'tipo_movimiento' => $datapost['tipo_movimiento'],
            'activo' => intval($datapost['activo'] ?? 1)
        ];

        $motivoId = $motivoStock->crear($datos);

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

// === ACTUALIZAR MOTIVO ===
if ($tipo === 'updateMotivoStock') {
    error_log("=== ACTUALIZANDO MOTIVO DE STOCK ===");

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

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

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

    try {
        $datos = [];
        $allowedFields = ['nombre', 'descripcion', 'tipo_movimiento', 'activo'];

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

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

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

// === ELIMINAR MOTIVO ===
if ($tipo === 'deleteMotivoStock') {
    error_log("=== ELIMINANDO MOTIVO DE STOCK ===");

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

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

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

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

// === OBTENER MOTIVOS POR TIPO ===
if ($tipo === 'getMotivosPorTipo') {
    error_log("=== OBTENIENDO MOTIVOS POR TIPO ===");

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

    if (!$tipoMovimiento) {
        sendResponse(false, "Tipo de movimiento requerido");
    }

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

    try {
        $motivos = $motivoStock->obtenerPorTipo($tipoMovimiento);
        sendResponse(true, "Motivos obtenidos", $motivos);
    } catch (Exception $e) {
        error_log("Error obteniendo motivos por tipo: " . $e->getMessage());
        sendResponse(false, "Error al obtener motivos");
    }
}

// === ESTABLECER MOTIVO PREDETERMINADO ===
if ($tipo === 'setDefaultMotivoStock') {
    error_log("=== ESTABLECIENDO MOTIVO PREDETERMINADO ===");

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

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

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

    try {
        if ($motivoStock->establecerPredeterminado($id)) {
            sendResponse(true, "Motivo predeterminado establecido");
        } else {
            sendResponse(false, "Error al establecer predeterminado");
        }
    } catch (Exception $e) {
        error_log("Error estableciendo predeterminado: " . $e->getMessage());
        sendResponse(false, $e->getMessage());
    }
}

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

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

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