"""
Roteador de Autenticação para o Barbeiro / Proprietário.
Telas de login (/entrar), logout (/sair) e validação de credenciais.
"""
from fastapi import APIRouter, Request, HTTPException, Response
from fastapi.responses import RedirectResponse
from fastapi.templating import Jinja2Templates
from pydantic import BaseModel
import os
from app.database import get_db

TEMPLATES_DIR = os.path.join(os.path.dirname(os.path.dirname(__file__)), "templates")
templates = Jinja2Templates(directory=TEMPLATES_DIR)

import re
import unicodedata
from typing import Optional

router = APIRouter(tags=["Autenticação"])

def generate_slug(text: str) -> str:
    text = unicodedata.normalize("NFKD", text).encode("ascii", "ignore").decode("ascii")
    text = re.sub(r"[^\w\s-]", "", text.lower()).strip()
    return re.sub(r"[-\s]+", "-", text)

class LoginRequest(BaseModel):
    identifier: str # Email ou WhatsApp
    password: str

class RegisterRequest(BaseModel):
    name: str # Nome da Barbearia
    owner_name: Optional[str] = None # Nome do Barbeiro Dono
    phone: str # WhatsApp
    email: str # Email
    password: str # Senha
    slug: Optional[str] = None
    plan_tier: str = "basico" # basico, intermediario, profissional

@router.get("/entrar")
@router.get("/login")
def login_page(request: Request):
    return templates.TemplateResponse(
        request=request,
        name="auth/login.html",
        context={}
    )

@router.get("/cadastro")
@router.get("/cadastrar")
def register_page(request: Request, plano: str = "basico"):
    return templates.TemplateResponse(
        request=request,
        name="auth/register.html",
        context={"selected_plan": plano}
    )

@router.get("/sair")
@router.get("/logout")
def logout(response: Response):
    resp = RedirectResponse(url="/entrar", status_code=302)
    resp.delete_cookie(key="barber_active_shop_id")
    return resp

@router.post("/api/auth/login")
def api_login(data: LoginRequest, response: Response):
    clean_id = data.identifier.strip().lower()
    clean_digits = "".join(filter(str.isdigit, data.identifier))

    with get_db() as conn:
        cursor = conn.cursor()
        cursor.execute("""
        SELECT * FROM barbershops 
        WHERE (LOWER(email) = ? OR phone = ? OR phone = ?) AND password = ?
        LIMIT 1
        """, (clean_id, data.identifier, clean_digits, data.password))
        shop = cursor.fetchone()

        if not shop:
            raise HTTPException(status_code=401, detail="Email, WhatsApp ou senha incorretos.")

        if shop["is_active"] != 1:
            raise HTTPException(status_code=403, detail="Sua assinatura está suspensa. Entre em contato com o suporte do NaRégua.")

        # Definir cookie de sessão
        response.set_cookie(
            key="barber_active_shop_id",
            value=str(shop["id"]),
            max_age=60 * 60 * 24 * 30, # 30 dias
            httponly=True,
            samesite="lax"
        )

        return {"success": True, "shop_id": shop["id"], "shop_name": shop["name"]}

@router.post("/api/auth/register")
def api_register(data: RegisterRequest, response: Response):
    name = data.name.strip()
    if not name:
        raise HTTPException(status_code=400, detail="Informe o nome da barbearia.")
    
    clean_email = data.email.strip().lower()
    clean_phone = "".join(filter(str.isdigit, data.phone))
    if len(clean_phone) < 10:
        clean_phone = data.phone.strip()

    # Gerar slug único
    base_slug = generate_slug(data.slug if data.slug else name)
    if not base_slug:
        base_slug = "barbearia"

    plan = data.plan_tier if data.plan_tier in ("basico", "intermediario", "profissional") else "basico"
    tier_limits = {"basico": 1, "intermediario": 5, "profissional": 999}
    max_barbers = tier_limits.get(plan, 1)

    with get_db() as conn:
        cursor = conn.cursor()

        # Verificar se email já existe
        cursor.execute("SELECT id FROM barbershops WHERE LOWER(email) = ? LIMIT 1", (clean_email,))
        if cursor.fetchone():
            raise HTTPException(status_code=400, detail="Este e-mail já está cadastrado. Faça login na sua conta existente.")

        # Garantir slug único
        slug = base_slug
        counter = 1
        while True:
            cursor.execute("SELECT id FROM barbershops WHERE slug = ? LIMIT 1", (slug,))
            if not cursor.fetchone():
                break
            counter += 1
            slug = f"{base_slug}-{counter}"

        # Inserir Barbearia
        cursor.execute("""
        INSERT INTO barbershops (name, slug, phone, email, password, plan_tier, max_barbers, opening_time, closing_time, slot_interval, pix_key, pix_deposit_amount)
        VALUES (?, ?, ?, ?, ?, ?, ?, '09:00', '19:00', 30, ?, 0.0)
        """, (name, slug, clean_phone, clean_email, data.password, plan, max_barbers, clean_phone))
        shop_id = cursor.lastrowid

        # Inserir Barbeiro Dono
        owner_name = data.owner_name.strip() if data.owner_name else name
        nickname = owner_name.split()[0] if owner_name else "Barbeiro"
        cursor.execute("""
        INSERT INTO barbers (barbershop_id, name, nickname, phone, avatar_color, commission_rate)
        VALUES (?, ?, ?, ?, '#d97706', ?)
        """, (shop_id, owner_name, nickname, clean_phone, 1.0 if plan == "basico" else 0.50))

        # Inserir Serviços Iniciais de Demonstração
        cursor.execute("INSERT INTO services (barbershop_id, name, description, price, duration_minutes) VALUES (?, 'Corte Degradê / Social', 'Corte moderno com máquina e tesoura', 40.00, 35)", (shop_id,))
        cursor.execute("INSERT INTO services (barbershop_id, name, description, price, duration_minutes) VALUES (?, 'Barba Alinhada & Toalha Quente', 'Alinhamento com navalha e toalha quente', 30.00, 25)", (shop_id,))
        cursor.execute("INSERT INTO services (barbershop_id, name, description, price, duration_minutes) VALUES (?, 'Combo Cabelo + Barba', 'Corte e barba alinhados', 65.00, 50)", (shop_id,))

        # Se for plano com produtos, adicionar 1 produto starter
        if plan in ("intermediario", "profissional"):
            cursor.execute("INSERT INTO products (barbershop_id, name, price, cost_price, stock_quantity) VALUES (?, 'Pomada Efeito Matte 150g', 45.00, 18.00, 10)", (shop_id,))

        # Definir cookie de sessão automática
        response.set_cookie(
            key="barber_active_shop_id",
            value=str(shop_id),
            max_age=60 * 60 * 24 * 30,
            httponly=True,
            samesite="lax"
        )

        return {
            "success": True,
            "shop_id": shop_id,
            "shop_name": name,
            "slug": slug,
            "redirect_url": f"/admin?shop_id={shop_id}"
        }

