import { describe, it, expect } from 'vitest';
import { mount } from '@vue/test-utils';
import { createPinia } from 'pinia';
import { createVuetify } from 'vuetify';
import { createRouter, createMemoryHistory } from 'vue-router';
import RegisterView from '../../resources/js/views/auth/RegisterView.vue';

// Smoke-тесты RegisterView. Ключевое: проверяем что 3-й «маркетинговый» click-wrap
// из v8_login.html НЕ присутствует — он противоречит ТЗ §1.5/§4.1 (расхождение #2
// handoff vs ТЗ из реестра v1.13). Только два обязательных: оферта + ПДн.

const mountRegister = async () => {
    const router = createRouter({
        history: createMemoryHistory(),
        routes: [
            { path: '/register', name: 'register', component: RegisterView },
            { path: '/login', name: 'login', component: { template: '<div>stub</div>' } },
        ],
    });
    await router.push('/register');
    await router.isReady();
    return mount(RegisterView, {
        global: { plugins: [createPinia(), createVuetify(), router] },
    });
};

describe('RegisterView.vue', () => {
    it('монтируется и содержит заголовок «Создать аккаунт»', async () => {
        const wrapper = await mountRegister();
        expect(wrapper.exists()).toBe(true);
        expect(wrapper.text()).toContain('Создать аккаунт');
    });

    it('содержит поля email/password с правильным autocomplete', async () => {
        const wrapper = await mountRegister();
        expect(wrapper.find('input[type="email"]').attributes('autocomplete')).toBe('email');
        expect(wrapper.find('input[type="password"]').attributes('autocomplete')).toBe('new-password');
    });

    it('содержит ровно 2 click-wrap-чекбокса (оферта + ПДн), без маркетингового', async () => {
        const wrapper = await mountRegister();
        const checkboxes = wrapper.findAll('input[type="checkbox"]');
        expect(checkboxes).toHaveLength(2);
        const text = wrapper.text();
        expect(text).toContain('оферту');
        expect(text).toContain('политикой обработки персональных данных');
        expect(text).not.toContain('информационных сообщений');
        expect(text).not.toContain('маркетинг');
    });

    it('содержит ссылку на /login', async () => {
        const wrapper = await mountRegister();
        const links = wrapper.findAll('a').map((a) => a.text());
        expect(links.some((t) => t.includes('Войдите'))).toBe(true);
    });

    it('§6: частый пароль «password123» оценивается как «Слабый», а не «Средний»', async () => {
        const wrapper = await mountRegister();
        await wrapper.find('input[type="password"]').setValue('password123');
        expect(wrapper.text()).toContain('Слабый');
        expect(wrapper.text()).not.toContain('Средний');
    });

    it('§6: действительно сложный пароль остаётся «Надёжный»', async () => {
        const wrapper = await mountRegister();
        await wrapper.find('input[type="password"]').setValue('Xk9$mPq2vL');
        expect(wrapper.text()).toContain('Надёжный');
    });

    it('A9: переключатель видимости пароля имеет accessible-name и работает', async () => {
        const wrapper = await mountRegister();
        const toggle = wrapper.find('[aria-label="Показать пароль"]');
        expect(toggle.exists()).toBe(true);
        expect(toggle.attributes('role')).toBe('button');
        await toggle.trigger('click');
        expect(wrapper.find('[aria-label="Скрыть пароль"]').exists()).toBe(true);

        // keyboard activation (Enter) — toggle back
        await wrapper.find('[aria-label="Скрыть пароль"]').trigger('keydown', { key: 'Enter' });
        expect(wrapper.find('[aria-label="Показать пароль"]').exists()).toBe(true);
    });
});
