/**
 * User Selection Logic - Sistema Sufarma
 * Maneja la selección de usuario antes de procesar el pago
 */

class UserSelection {
    constructor() {
        this.users = [];
        this.selectedUserId = null;
        this.resolveCallback = null;
        this.rejectCallback = null;
        this.init();
    }

    init() {
        window.userSelection = this;
        this.loadUsers();
        this.setupEventListeners();
    }

    async loadUsers() {
        try {
            const response = await fetch('api/ventas/obtener_usuarios.php');
            const data = await response.json();

            if (data.success) {
                this.users = data.usuarios;
                this.populateUserSelect();
            } else {
                console.error('Error al cargar usuarios:', data.error);
            }
        } catch (error) {
            console.error('Error de conexión al cargar usuarios:', error);
        }
    }

    populateUserSelect() {
        const select = document.getElementById('userSelect');
        if (!select) return;

        // Limpiar opciones existentes excepto la primera
        select.innerHTML = '<option value="">-- Seleccione un usuario --</option>';

        // Agregar usuarios
        this.users.forEach(user => {
            const option = document.createElement('option');
            option.value = user.id;
            option.textContent = `${user.nombre} (${user.codigo_usuario})`;
            select.appendChild(option);
        });
    }

    setupEventListeners() {
        const modal = document.getElementById('userModal');
        const form = document.getElementById('userSelectionForm');
        const closeBtn = document.getElementById('userModalClose');
        const cancelBtn = document.getElementById('userCancelBtn');
        const userSelect = document.getElementById('userSelect');
        const userCode = document.getElementById('userCode');

        // Cerrar modal
        if (closeBtn) {
            closeBtn.addEventListener('click', () => this.closeModal());
        }

        if (cancelBtn) {
            cancelBtn.addEventListener('click', () => this.closeModal());
        }

        // Limpiar el otro campo cuando se selecciona uno
        if (userSelect) {
            userSelect.addEventListener('change', () => {
                if (userSelect.value) {
                    userCode.value = '';
                }
            });
        }

        if (userCode) {
            userCode.addEventListener('input', () => {
                if (userCode.value) {
                    userSelect.value = '';
                }
            });
        }

        // Enviar formulario
        if (form) {
            form.addEventListener('submit', (e) => {
                e.preventDefault();
                this.handleSubmit();
            });
        }
    }

    /**
     * Mostrar modal y retornar una promesa con el usuario seleccionado
     */
    async selectUser() {
        return new Promise((resolve, reject) => {
            this.resolveCallback = resolve;
            this.rejectCallback = reject;
            this.showModal();
        });
    }

    showModal() {
        const modal = document.getElementById('userModal');
        const errorMessage = document.getElementById('userErrorMessage');

        // Limpiar formulario
        document.getElementById('userSelect').value = '';
        document.getElementById('userCode').value = '';
        errorMessage.classList.remove('show');
        errorMessage.textContent = '';

        // Mostrar modal
        modal.style.display = 'flex';

        // Focus en el campo de código
        setTimeout(() => {
            document.getElementById('userCode').focus();
        }, 100);
    }

    closeModal() {
        const modal = document.getElementById('userModal');
        modal.style.display = 'none';

        // Rechazar la promesa si se cancela
        if (this.rejectCallback) {
            this.rejectCallback(new Error('Usuario canceló la selección'));
            this.rejectCallback = null;
            this.resolveCallback = null;
        }
    }

    async handleSubmit() {
        const userSelect = document.getElementById('userSelect');
        const userCode = document.getElementById('userCode');
        const errorMessage = document.getElementById('userErrorMessage');

        // Limpiar error previo
        errorMessage.classList.remove('show');
        errorMessage.textContent = '';

        let userId = null;

        // Verificar si se seleccionó del dropdown
        if (userSelect.value) {
            userId = parseInt(userSelect.value);
        }
        // Verificar si se ingresó un código
        else if (userCode.value.trim()) {
            const code = userCode.value.trim();
            userId = await this.validateUserCode(code);

            if (!userId) {
                this.showError('Código de usuario inválido');
                return;
            }
        }
        else {
            this.showError('Debe seleccionar un usuario o ingresar un código');
            return;
        }

        // Confirmar selección
        this.selectedUserId = userId;

        // Cerrar modal
        const modal = document.getElementById('userModal');
        modal.style.display = 'none';

        // Resolver la promesa
        if (this.resolveCallback) {
            this.resolveCallback(userId);
            this.resolveCallback = null;
            this.rejectCallback = null;
        }
    }

    /**
     * Validar código de usuario contra la base de datos
     */
    async validateUserCode(code) {
        try {
            const response = await fetch('api/ventas/validar_usuario.php', {
                method: 'POST',
                headers: { 'Content-Type': 'application/json' },
                body: JSON.stringify({ codigo_usuario: code })
            });

            const data = await response.json();

            if (data.success && data.usuario_id) {
                return data.usuario_id;
            }
            return null;
        } catch (error) {
            console.error('Error validando código de usuario:', error);
            return null;
        }
    }

    showError(message) {
        const errorMessage = document.getElementById('userErrorMessage');
        errorMessage.textContent = message;
        errorMessage.classList.add('show');
    }
}

// Inicializar
const userSelection = new UserSelection();
