"""
Testes E2E para acesso_vendedor.html
"""
import pytest
from playwright.sync_api import Page, expect
import os

BASE_URL = "http://localhost:8765"
SCREENSHOTS = r"D:\Evolução categorias\.worktrees\comissao\test_screenshots"
os.makedirs(SCREENSHOTS, exist_ok=True)

def ss(page, name):
    page.screenshot(path=os.path.join(SCREENSHOTS, name), full_page=False)

def aguardar_pronto(page: Page):
    """Aguarda os cards de vendedor serem renderizados."""
    page.wait_for_selector("#vendedores-grid .vcard", timeout=12000)

def click_key(page: Page, digit):
    """Clica numa tecla do teclado numérico visível."""
    keys = page.locator(".overlay.show .key").all()
    for k in keys:
        txt = k.inner_text().strip()
        if txt == str(digit):
            k.click()
            return
    raise Exception(f"Tecla '{digit}' não encontrada no modal aberto")

def digitar_pin(page: Page, pin: str):
    for d in pin:
        click_key(page, d)
        page.wait_for_timeout(80)
    # Clica OK
    ok = page.locator(".overlay.show .key.key-ok")
    ok.click()

# ─────────────────────────────────────────────────────────────────
class TestAcessoVendedor:

    def test_01_carregamento(self, page: Page):
        page.goto(BASE_URL + "/acesso_vendedor.html")
        aguardar_pronto(page)
        expect(page.locator(".logo")).to_be_visible()
        expect(page.locator(".logo")).to_contain_text("DEVSYS")
        cards = page.locator(".vcard")
        assert cards.count() >= 2, f"Esperado >= 2 cards, encontrou {cards.count()}"
        ss(page, "01_selecao.png")

    def test_02_modal_master_abre(self, page: Page):
        page.goto(BASE_URL + "/acesso_vendedor.html")
        aguardar_pronto(page)
        page.locator(".vcard.master").click()
        page.wait_for_selector("#overlay-login.show", timeout=4000)
        expect(page.locator("#login-nome")).to_contain_text("MASTER")
        ss(page, "02_modal_master.png")

    def test_03_senha_errada(self, page: Page):
        page.goto(BASE_URL + "/acesso_vendedor.html")
        aguardar_pronto(page)
        page.locator(".vcard.master").click()
        page.wait_for_selector("#overlay-login.show", timeout=4000)
        digitar_pin(page, "1234")
        page.wait_for_timeout(500)
        erro = page.locator("#login-error").inner_text()
        assert "incorreta" in erro.lower(), f"Erro esperado, obteve: '{erro}'"
        ss(page, "03_senha_errada.png")
        page.keyboard.press("Escape")

    def test_04_master_1530_abre_dashboard(self, page: Page):
        page.goto(BASE_URL + "/acesso_vendedor.html")
        aguardar_pronto(page)
        page.locator(".vcard.master").click()
        page.wait_for_selector("#overlay-login.show", timeout=4000)
        digitar_pin(page, "1530")
        page.wait_for_selector("#tela-dashboard", state="visible", timeout=8000)
        expect(page.locator("#dash-vname")).to_contain_text("TODOS OS VENDEDORES")
        kpis = page.locator(".kpi")
        assert kpis.count() >= 3, f"Esperado >= 3 KPIs, encontrou {kpis.count()}"
        ss(page, "04_dashboard_master.png")

    def test_05_voltar_selecao(self, page: Page):
        page.goto(BASE_URL + "/acesso_vendedor.html")
        aguardar_pronto(page)
        page.locator(".vcard.master").click()
        page.wait_for_selector("#overlay-login.show", timeout=4000)
        digitar_pin(page, "1530")
        page.wait_for_selector("#tela-dashboard", state="visible", timeout=8000)
        page.locator(".dash-back").click()
        page.wait_for_selector("#tela-selecao", state="visible", timeout=3000)
        ss(page, "05_voltou_selecao.png")

    def test_06_login_vendedor_individual(self, page: Page):
        page.goto(BASE_URL + "/acesso_vendedor.html")
        aguardar_pronto(page)
        primeiro = page.locator(".vcard:not(.master)").first
        nome_esperado = primeiro.locator(".vcard-nome").inner_text().strip()
        primeiro.click()
        page.wait_for_selector("#overlay-login.show", timeout=4000)
        expect(page.locator("#login-nome")).to_contain_text(nome_esperado)
        digitar_pin(page, "1530")
        page.wait_for_selector("#tela-dashboard", state="visible", timeout=8000)
        expect(page.locator("#dash-vname")).to_contain_text(nome_esperado)
        ss(page, "06_dashboard_vendedor.png")

    def test_07_gerenciar_pins_auth(self, page: Page):
        page.goto(BASE_URL + "/acesso_vendedor.html")
        aguardar_pronto(page)
        page.locator("button", has_text="Gerenciar PINs").click()
        page.wait_for_selector("#overlay-auth-master.show", timeout=4000)
        # PIN errado
        digitar_pin(page, "0000")
        page.wait_for_timeout(400)
        erro = page.locator("#master-error").inner_text()
        assert "incorreta" in erro.lower(), f"Esperado erro, obteve: '{erro}'"
        # PIN correto
        digitar_pin(page, "1530")
        page.wait_for_selector("#overlay-pins.show", timeout=4000)
        rows = page.locator(".pin-row")
        assert rows.count() >= 1
        ss(page, "07_gerenciar_pins.png")

    def test_08_salvar_pin_individual(self, page: Page):
        page.goto(BASE_URL + "/acesso_vendedor.html")
        aguardar_pronto(page)
        page.locator("button", has_text="Gerenciar PINs").click()
        page.wait_for_selector("#overlay-auth-master.show", timeout=4000)
        digitar_pin(page, "1530")
        page.wait_for_selector("#overlay-pins.show", timeout=4000)
        first_input = page.locator(".pin-input").first
        first_input.fill("2468")
        page.locator(".btn-set-pin").first.click()
        page.wait_for_timeout(700)
        status = page.locator(".pin-row-status").first.inner_text()
        assert "definido" in status.lower(), f"Status inesperado: '{status}'"
        ss(page, "08_pin_salvo.png")
        page.locator("#overlay-pins .modal-close").click()

    def test_09_login_com_pin_individual(self, page: Page):
        page.goto(BASE_URL + "/acesso_vendedor.html")
        aguardar_pronto(page)
        # Define PIN para o primeiro vendedor
        page.locator("button", has_text="Gerenciar PINs").click()
        page.wait_for_selector("#overlay-auth-master.show", timeout=4000)
        digitar_pin(page, "1530")
        page.wait_for_selector("#overlay-pins.show", timeout=4000)
        nome_vendedor = page.locator(".pin-row-nome").first.inner_text().strip()
        page.locator(".pin-input").first.fill("2468")
        page.locator(".btn-set-pin").first.click()
        page.wait_for_timeout(500)
        page.locator("#overlay-pins .modal-close").click()
        page.wait_for_timeout(300)
        # Loga com PIN individual
        page.locator(f"#vcard-{nome_vendedor}").click()
        page.wait_for_selector("#overlay-login.show", timeout=4000)
        digitar_pin(page, "2468")
        page.wait_for_selector("#tela-dashboard", state="visible", timeout=8000)
        expect(page.locator("#dash-vname")).to_contain_text(nome_vendedor)
        ss(page, "09_login_pin_individual.png")
