from fastapi import FastAPI, Depends, HTTPException, Header
from sqlalchemy.orm import Session
from sqlalchemy import text
from passlib.hash import bcrypt

from database import SessionLocal
from models import User, Cliente
from schemas import UserCreate, UserLogin, UserResponse

app = FastAPI(title="API de Login em FastAPI")

# dependência de sessão
def get_db():
    db = SessionLocal()
    try:
        yield db
    finally:
        db.close()

# dependência de autenticação
def get_current_user(Authorization: str = Header(None), db: Session = Depends(get_db)):
    if Authorization is None:
        raise HTTPException(status_code=401, detail="Token não enviado")

    token = Authorization.replace("Bearer ", "")
    
    # Busca o cliente pelo token (token do cliente retornado no login)
    result = db.execute(
        text("SELECT * FROM dbo.Cliente WHERE Token = :token"),
        {"token": token}
    )
    row = result.fetchone()
    
    if not row:
        raise HTTPException(status_code=401, detail="Token inválido ou não encontrado")
    
    # Converte row para dicionário e depois para objeto Cliente
    cliente_dict = dict(row._mapping) if hasattr(row, '_mapping') else dict(row)
    cliente = Cliente(**cliente_dict)
    
    return cliente

# -----------------------------
# LOGIN
# -----------------------------
@app.post("/login")
def login(data: UserLogin, db: Session = Depends(get_db)):
    # Busca o usuário pelo email
    result = db.execute(
        text("SELECT * FROM dbo.Usuario WHERE Email = :email"),
        {"email": data.email}
    )
    row = result.fetchone()
    
    if not row:
        raise HTTPException(status_code=401, detail="Acesso negado")
    
    # Converte row para dicionário
    user_dict = dict(row._mapping) if hasattr(row, '_mapping') else dict(row)
    
    # Verifica senha
    senha_hash = user_dict["Senha"]
    
    if not senha_hash or data.senha != senha_hash:
        raise HTTPException(status_code=401, detail="Acesso negado")

    # Pega o IdCliente do usuário
    id_cliente = user_dict.get("IdCliente")
    
    if not id_cliente:
        raise HTTPException(status_code=401, detail="Usuário não possui cliente associado")

    # Busca o cliente pelo IdCliente
    result_cliente = db.execute(
        text("SELECT * FROM dbo.Cliente WHERE Id = :id_cliente"),
        {"id_cliente": id_cliente}
    )
    row_cliente = result_cliente.fetchone()
    
    if not row_cliente:
        raise HTTPException(status_code=401, detail="Cliente não encontrado")
    
    # Converte row do cliente para dicionário
    cliente_dict = dict(row_cliente._mapping) if hasattr(row_cliente, '_mapping') else dict(row_cliente)
    
    # Pega o token do cliente
    token_cliente = cliente_dict.get("Token")
    
    if not token_cliente:
        raise HTTPException(status_code=401, detail="Cliente não possui token")

    return {"access_token": token_cliente, "token_type": "bearer"}


# -----------------------------
# VALIDAÇÃO
# -----------------------------
@app.get("/me")
def me(current_cliente: Cliente = Depends(get_current_user)):
    return {
        "nome": current_cliente.NomeFantasia or current_cliente.RazaoSocial,
        "telefone": current_cliente.Telefone,
        "celular": current_cliente.Celular,
        "email": current_cliente.EmailOperacional,
        
        
         }


# -----------------------------
# BUSCAR POR EAN
# -----------------------------
@app.get("/ean/{ean}")
def buscar_por_ean(ean: str, current_cliente: Cliente = Depends(get_current_user)):
    # Retorna JSON com o EAN recebido
    return {
        "ean": ean,
        "nome": "Produto 1",
        "preco": 100.00,
        "status": "sucesso"
    }
