const { describe, it, expect } = require('jasmine');

describe("Регистрация нового пользователя", function() {
    it("должна зарегистрировать нового пользователя и перенаправить на страницу входа", function() {
        // Симуляция ввода данных пользователем
        document.getElementById('username').value = 'testUser';
        document.getElementById('email').value = 'test@example.com';
        document.getElementById('password').value = 'password123';
        document.getElementById('confirm-password').value = 'password123';

        // Шпион на window.location.href
        spyOn(window.location, 'href', 'set');

        // Триггер отправки формы
        document.getElementById('register-form').dispatchEvent(new Event('submit'));

        // Проверка, добавлен ли пользователь в localStorage
        const users = JSON.parse(localStorage.getItem('users'));
        const user = users.find(u => u.username === 'testUser');
        expect(user).toBeDefined();
        expect(user.email).toBe('test@example.com');

        // Проверка перенаправления
        expect(window.location.href).toBe('login.html');
    });
});

describe("Вход зарегистрированного пользователя", function() {
    it("должна аутентифицировать пользователя и перенаправить на страницу профиля", function() {
        // Добавление пользователя в localStorage
        const users = [{ username: 'testUser', email: 'test@example.com', password: 'password123' }];
        localStorage.setItem('users', JSON.stringify(users));

        // Симуляция ввода данных пользователем
        document.getElementById('username').value = 'testUser';
        document.getElementById('password').value = 'password123';

        // Шпион на window.location.href
        spyOn(window.location, 'href', 'set');

        // Триггер отправки формы
        document.getElementById('login-form').dispatchEvent(new Event('submit'));

        // Проверка, установлен ли currentUser в localStorage
        const currentUser = JSON.parse(localStorage.getItem('currentUser'));
        expect(currentUser).toBeDefined();
        expect(currentUser.username).toBe('testUser');

        // Проверка перенаправления
        expect(window.location.href).toBe('profile.html');
    });
});

describe("Просмотр профиля пользователя", function() {
    it("должен отображать информацию профиля пользователя", function() {
        // Добавление пользователя в localStorage
        const user = { username: 'testUser', email: 'test@example.com' };
        localStorage.setItem('currentUser', JSON.stringify(user));

        // Загрузка логики страницы профиля
        loadProfile();

        // Проверка отображаемой информации
        expect(document.getElementById('profile-username').textContent).toBe('testUser');
        expect(document.getElementById('profile-email').textContent).toBe('test@example.com');
    });
});

describe("Редактирование профиля пользователя", function() {
    it("должен обновлять информацию профиля пользователя", function() {
        // Добавление пользователя в localStorage
        const user = { username: 'testUser', email: 'test@example.com' };
        localStorage.setItem('currentUser', JSON.stringify(user));
        localStorage.setItem('users', JSON.stringify([user]));

        // Симуляция ввода данных пользователем
        document.getElementById('username').value = 'updatedUser';

        // Триггер отправки формы
        document.getElementById('profile-form').dispatchEvent(new Event('submit'));

        // Проверка, обновлены ли данные пользователя в localStorage
        const updatedUser = JSON.parse(localStorage.getItem('currentUser'));
        expect(updatedUser.username).toBe('updatedUser');
    });
});

describe("Выход из учетной записи", function() {
    it("должен завершить сеанс пользователя и перенаправить на страницу входа", function() {
        // Добавление пользователя в localStorage
        const user = { username: 'testUser', email: 'test@example.com' };
        localStorage.setItem('currentUser', JSON.stringify(user));

        // Шпион на window.location.href
        spyOn(window.location, 'href', 'set');

        // Триггер выхода
        document.getElementById('logout').dispatchEvent(new Event('click'));

        // Проверка, удален ли currentUser из localStorage
        expect(localStorage.getItem('currentUser')).toBeNull();

        // Проверка перенаправления
        expect(window.location.href).toBe('index.html');
    });
});

describe("Регистрация с неправильными данными", function() {
    it("должен отображать сообщение об ошибке и не регистрировать пользователя", function() {
        // Симуляция ввода данных пользователем
        document.getElementById('username').value = 'testUser';
        document.getElementById('email').value = 'invalid-email';
        document.getElementById('password').value = 'password123';
        document.getElementById('confirm-password').value = 'password123';

        // Триггер отправки формы
        document.getElementById('register-form').dispatchEvent(new Event('submit'));

        // Проверка сообщения об ошибке
        const message = document.getElementById('message');
        expect(message.textContent).toBe('Недопустимый адрес электронной почты!');

        // Проверка, не добавлен ли пользователь в localStorage
        const users = JSON.parse(localStorage.getItem('users'));
        const user = users ? users.find(u => u.username === 'testUser') : null;
        expect(user).toBeUndefined();
    });
});
