// change_password.js - Lógica para a página de Alteração de Senha (Aprimorado pelo Cometê)

import { DataService } from './api.js';

document.addEventListener('DOMContentLoaded', async () => {
    const changePasswordForm = document.getElementById('change-password-form');
    const currentPasswordField = document.getElementById('current-password');
    const newUsernameGroup = document.getElementById('new-username-group');
    const newUsernameField = document.getElementById('new-username');
    const newPasswordField = document.getElementById('new-password');
    const confirmPasswordField = document.getElementById('confirm-password');
    const feedbackDiv = document.getElementById('feedback');
    const changePasswordButton = document.getElementById('change-password-button');
    const buttonText = document.getElementById('button-text');
    const spinner = document.getElementById('spinner');
    const firstLoginMessage = document.getElementById('first-login-message');
    const pageTitle = document.getElementById('page-title');

    // Requisitos de senha
    const reqLength = document.getElementById('req-length');
    const reqUppercase = document.getElementById('req-uppercase');
    const reqLowercase = document.getElementById('req-lowercase');
    const reqNumber = document.getElementById('req-number');
    const reqSpecial = document.getElementById('req-special');

    let currentUser = null;
    let isFirstLogin = false;

    // --- Funções de UI e Feedback ---
    function showFeedback(message, type = 'error') {
        feedbackDiv.textContent = message;
        feedbackDiv.className = `text-center font-medium mt-4 ${type === 'error' ? 'text-red-500' : 'text-green-500'}`;
        feedbackDiv.classList.remove('hidden');
    }

    function hideFeedback() {
        feedbackDiv.classList.add('hidden');
    }

    function showLoading(isLoading) {
        changePasswordButton.disabled = isLoading;
        buttonText.classList.toggle('hidden', isLoading);
        spinner.classList.toggle('hidden', !isLoading);
        changePasswordButton.classList.toggle('opacity-75', isLoading);
        changePasswordButton.classList.toggle('cursor-not-allowed', isLoading);
    }

    function updatePasswordRequirements() {
        const newPassword = newPasswordField.value;
        reqLength.style.color = newPassword.length >= 8 ? 'green' : 'red';
        reqUppercase.style.color = /[A-Z]/.test(newPassword) ? 'green' : 'red';
        reqLowercase.style.color = /[a-z]/.test(newPassword) ? 'green' : 'red';
        reqNumber.style.color = /[0-9]/.test(newPassword) ? 'green' : 'red';
        reqSpecial.style.color = /[!@#$%^&*()]/.test(newPassword) ? 'green' : 'red';
    }

    // --- Lógica de Inicialização e Verificação de Primeiro Login ---
    const storedUser = sessionStorage.getItem('currentUser');
    if (storedUser) {
        currentUser = JSON.parse(storedUser);
        if (currentUser.isFirstLogin === true) { // A propriedade virá como boolean do backend
            isFirstLogin = true;
            firstLoginMessage.classList.remove('hidden');
            newUsernameGroup.classList.remove('hidden');
            currentPasswordField.style.display = 'none'; // Esconde o campo de senha atual
            currentPasswordField.removeAttribute('required'); // Remove a obrigatoriedade
            pageTitle.textContent = 'Defina seu Usuário e Senha'; // Atualiza o título
        } else {
            // Não é o primeiro login, apenas alteração de senha
            currentPasswordField.style.display = 'block'; // Mostra o campo de senha atual
            currentPasswordField.setAttribute('required', 'true'); // Garante obrigatoriedade
            newUsernameGroup.classList.add('hidden'); // Esconde o campo de nome de usuário
            newUsernameField.removeAttribute('required'); // Remove a obrigatoriedade
            pageTitle.textContent = 'Alterar Minha Senha';
        }
    } else {
        // Se não houver usuário logado, redireciona para o login
        window.location.href = 'login.html';
        return;
    }

    newPasswordField.addEventListener('keyup', updatePasswordRequirements);

    // --- Lógica de Submissão do Formulário ---
    changePasswordForm.addEventListener('submit', async (e) => {
        e.preventDefault();
        hideFeedback();
        showLoading(true);

        const currentPassword = currentPasswordField.value;
        const newPassword = newPasswordField.value;
        const confirmPassword = confirmPasswordField.value;
        const newUsername = newUsernameField.value.trim(); // Pega o valor do novo username

        // Validações no cliente
        if (!isFirstLogin && !currentPassword) {
            showFeedback('Por favor, insira sua senha atual.');
            showLoading(false);
            return;
        }

        if (newPassword !== confirmPassword) {
            showFeedback('A nova senha e a confirmação de senha não coincidem.');
            showLoading(false);
            return;
        }

        // Validação de complexidade da senha
        if (newPassword.length < 8 ||
            !/[A-Z]/.test(newPassword) ||
            !/[a-z]/.test(newPassword) ||
            !/[0-9]/.test(newPassword) ||
            !/[!@#$%^&*()]/.test(newPassword)) {
            showFeedback('A nova senha não atende aos requisitos de complexidade. Por favor, verifique a lista abaixo.');
            showLoading(false);
            return;
        }

        if (isFirstLogin && !newUsername) {
            showFeedback('Por favor, defina um novo nome de usuário para o seu primeiro acesso.');
            showLoading(false);
            return;
        }

        if (newPassword === currentPassword && !isFirstLogin) {
            showFeedback('A nova senha não pode ser igual à senha atual.');
            showLoading(false);
            return;
        }
        
        // Objeto payload para a API
        const payload = {
            userId: currentUser.id, // Envia o ID do usuário
            currentPassword: isFirstLogin ? 'FIRST_LOGIN_TEMPORARY_PASSWORD' : currentPassword, // Marcador ou senha atual
            newPassword: newPassword,
            isFirstLogin: isFirstLogin
        };

        if (isFirstLogin) {
            payload.newUsername = newUsername; // Adiciona o novo username ao payload apenas no primeiro login
        }

        try {
            const result = await DataService.changeUserPassword(payload, currentUser.role);

            if (result.status === 'success') {
                showFeedback(result.message || 'Senha alterada com sucesso!', 'success');
                // Atualiza o sessionStorage com o novo estado do usuário
                currentUser.isFirstLogin = false; // Marca como não sendo mais o primeiro login
                if (isFirstLogin) {
                    currentUser.username = newUsername; // Adiciona o username ao objeto do usuário
                }
                sessionStorage.setItem('currentUser', JSON.stringify(currentUser));
                
                setTimeout(() => {
                    window.location.href = 'index.html'; // Redireciona para a página principal
                }, 1500);
            } else {
                showFeedback(result.message || 'Erro ao alterar a senha.');
            }
        } catch (error) {
            console.error('Erro na alteração de senha:', error);
            showFeedback(error.message || 'Ocorreu um erro ao tentar alterar a senha. Tente novamente.');
        } finally {
            showLoading(false);
        }
    });
});