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

describe('Relatório: Produtos Críticos', () => {
  const pageUrl = 'http://localhost:8003/relatorios/produtos-criticos';

  function stubThresholds() {
    cy.intercept('GET', '/estoque/thresholds/report*', (req) => {
      const url = new URL(req.url);
      const page = parseInt(url.searchParams.get('page') || '1');
      const crit = url.searchParams.get('crit') || 'baixo_estoque';
      const base = {
        ok: true,
        page,
        total: 4,
        total_pages: 2,
      };
      const p1 = {
        ...base,
        data: [
          { codigo: 'P1', descricao: 'Produto 1', level: 0, min: 5, out_qty: 0 }, // Ruptura
          { codigo: 'P2', descricao: 'Produto 2', level: 3, min: 5, out_qty: 2 }, // Abaixo min
        ],
      };
      const p2 = {
        ...base,
        data: [
          { codigo: 'P3', descricao: 'Produto 3', level: 20, min: 5, out_qty: 1 }, // OK
          { codigo: 'P4', descricao: 'Produto 4', level: 10, min: 5, out_qty: (crit==='alta_demanda'?7:1) }, // Alta demanda em crit alta_demanda
        ],
      };
      req.reply(page === 1 ? p1 : p2);
    }).as('thresholds');
  }

  function stubAutocomplete() {
    cy.intercept('GET', '/api/produtos*', {
      ok: true,
      data: [
        { codigo: 'PRO-123', nome: 'Produto Autocomplete 123', estoque: 10 },
        { codigo: 'ABC-1', nome: 'Abcd 1', estoque: 0 },
      ],
    }).as('autocomplete');
  }

  beforeEach(() => {
    // Limpar localStorage para estado limpo
    cy.clearLocalStorage('prodCrit.config');
    stubThresholds();
    stubAutocomplete();
  });

  it('carrega a página e renderiza tabela com paginação', () => {
    cy.visit(pageUrl);
    cy.get('h1').contains('Produtos Críticos');
    cy.get('#critTable');
    cy.wait('@thresholds');
    cy.get('#pageInfo').should('contain', 'Página 1 de 2');
    cy.get('#nextPage').should('not.be.disabled');
  });

  it('ordena por Descrição e alterna indicador ▲/▼', () => {
    cy.visit(pageUrl);
    cy.wait('@thresholds');
    cy.get('th[data-sort="descricao"]').click();
    cy.get('#s_descricao').should('contain', '▲');
    cy.get('th[data-sort="descricao"]').click();
    cy.get('#s_descricao').should('contain', '▼');
  });

  it('paginação avança para página 2 e atualiza info', () => {
    cy.visit(pageUrl);
    cy.wait('@thresholds');
    cy.get('#nextPage').click();
    cy.wait('@thresholds');
    cy.get('#pageInfo').should('contain', 'Página 2');
    cy.get('#prevPage').should('not.be.disabled');
  });

  it('limpar filtros reseta valores padrão', () => {
    cy.visit(pageUrl);
    cy.get('#crit').select('alta_demanda');
    cy.get('#days').select('30');
    cy.get('#q').type('PRO');
    cy.get('#clearFilters').click();
    cy.get('#crit').should('have.value', 'baixo_estoque');
    cy.get('#days').should('have.value', '14');
    cy.get('#q').should('have.value', '');
  });

  it('exibe janela ativa para Alta demanda (dias e período)', () => {
    cy.visit(pageUrl);
    cy.get('#crit').select('alta_demanda');
    cy.get('#applyCrit').click();
    cy.get('#winInfo').should('contain', 'Últimos');
    cy.get('#start').type('2025-11-01');
    cy.get('#end').type('2025-11-08');
    cy.get('#applyCrit').click();
    cy.get('#winInfo').should('contain', 'Período');
  });

  it('autocomplete apresenta sugestões com 3+ caracteres e seleciona código', () => {
    cy.visit(pageUrl);
    cy.get('#q').type('PRO');
    cy.wait('@autocomplete');
    cy.get('#qSuggestions').should('be.visible');
    cy.get('#qSuggestions .list-item').first().click();
    cy.get('#q').should('have.value', 'PRO-123');
  });

  it('badges de situação aparecem conforme dados', () => {
    cy.visit(pageUrl);
    cy.wait('@thresholds');
    cy.get('#critRows').should('contain', 'Ruptura');
    cy.get('#critRows').should('contain', 'Abaixo do mínimo');
    cy.get('#crit').select('alta_demanda');
    cy.get('#applyCrit').click();
    cy.wait('@thresholds');
    cy.get('#critRows').should('contain', 'Alta demanda');
  });

  it('exporta CSV (gera link de download)', () => {
    cy.visit(pageUrl);
    cy.get('#exportCsv').click();
    // Verifica se âncora de download foi criada
    cy.get('a#csvDl').should('exist');
  });

  it('coloriza linhas por situação e apresenta resumo de contagem', () => {
    cy.visit(pageUrl);
    cy.wait('@thresholds');
    // Página 1 stub: Ruptura e Abaixo do mínimo
    cy.get('#sitSummary').should('contain', 'Ruptura 1');
    cy.get('#sitSummary').should('contain', 'Abaixo do mínimo 1');
    // Verifica cor de pelo menos uma linha (ruptura - vermelho)
    cy.get('#critRows tr').first().should('have.css', 'background-color').and('match', /rgb\(254,\s*226,\s*226\)/);
    // Mudar para alta demanda e aplicar; resumo deve atualizar
    cy.get('#crit').select('alta_demanda');
    cy.get('#applyCrit').click();
    cy.wait('@thresholds');
    cy.get('#sitSummary').should('contain', 'Alta demanda');
  });

  it('exporta Excel (gera link .xls)', () => {
    cy.visit(pageUrl);
    cy.get('#exportXls').click();
    cy.get('a#xlsDl').should('exist');
    cy.get('a#xlsDl').should('have.attr', 'download').and('contain', '.xls');
  });
});