/// <reference types="cypress" />

// Testes amplos e automatizados para a página /login
// Cobrem: renderização, validações básicas, erro de rede, falha de credenciais,
// sucesso com resposta mockada e persistência de token/cookie.

describe('Login — fluxo completo', () => {
  beforeEach(() => {
    // Garantir página limpa e servidor acessível
    cy.clearCookies();
    cy.clearLocalStorage();
    cy.visit('/login');
    cy.get('main .logo-wrap .logo-img').should('be.visible');
    cy.get('#loginForm').should('be.visible');
    cy.get('#email').should('be.visible');
    cy.get('#password').should('be.visible');
    cy.get('#loginBtn').should('be.visible').and('contain.text', 'Entrar');
  });

  it('renderiza /login com elementos essenciais', () => {
    cy.contains('Sistema de gestão empresarial').should('be.visible');
    cy.get('#alert').should('not.be.visible');
  });

  it('exibe mensagem de erro quando há falha de rede', () => {
    // Simular erro de conexão
    cy.intercept('POST', '/api/auth/login', { forceNetworkError: true }).as('loginNetErr');
    cy.get('#email').type('user@example.com');
    cy.get('#password').type('senha-errada', { log: false });
    cy.get('#loginBtn').click();
    cy.wait('@loginNetErr');
    cy.get('#alert').should('be.visible').and('contain.text', 'Erro de conexão');
    // Botão deve voltar ao estado normal
    cy.get('#loginBtn').should('not.be.disabled').and('contain.text', 'Entrar');
  });

  it('exibe erro ao fazer login com credenciais inválidas (401)', () => {
    // Mockar resposta 401 do backend
    cy.intercept('POST', '/api/auth/login', {
      statusCode: 401,
      headers: { 'content-type': 'application/json' },
      body: { error: 'Credenciais inválidas' }
    }).as('login401');
    cy.get('#email').type('nao@existe.com');
    cy.get('#password').type('xxx', { log: false });
    cy.get('#loginBtn').click();
    cy.wait('@login401').its('response.statusCode').should('eq', 401);
    cy.get('#alert').should('be.visible').and('contain.text', 'Credenciais inválidas');
    // Não deve haver token/cookie
    cy.getCookie('auth_token').should('not.exist');
    cy.window().then((win) => {
      expect(win.localStorage.getItem('auth_token')).to.be.null;
    });
  });

  it('realiza login com sucesso quando backend responde 200 com access_token', () => {
    // Mockar resposta 200 do backend
    const fakeToken = 'ey.fake.jwt.token';
    cy.intercept('POST', '/api/auth/login', (req) => {
      req.reply({
        statusCode: 200,
        headers: { 'content-type': 'application/json' },
        body: { access_token: fakeToken, refresh_token: 'refresh.token' }
      });
    }).as('login200');

    cy.get('#email').type('admin@local');
    cy.get('#password').type('admin123', { log: false });
    cy.get('#loginBtn').click();
    cy.wait('@login200').its('response.statusCode').should('eq', 200);

    // Deve setar localStorage e cookie, e redirecionar para /dashboard
    cy.window().then((win) => {
      const lsToken = win.localStorage.getItem('auth_token');
      expect(lsToken).to.eq(fakeToken);
    });
    cy.getCookie('auth_token').should('exist').then((c) => {
      expect(c.value).to.eq(fakeToken);
    });

    // A página tenta redirecionar. Validar pathname.
    cy.location('pathname', { timeout: 10000 }).should('eq', '/dashboard');
  });

  it('mantém usabilidade no campo senha (Enter foca o botão)', () => {
    cy.get('#password').type('1234{enter}');
    cy.focused().should('have.id', 'loginBtn');
  });
});