from sqlalchemy.orm import Session
from ..models.Funcionario import Funcionario as ModelFuncionario
from ..schemas.Schemas import FuncionarioComIdDoUsuario
from fastapi import HTTPException


def get_funcionarios(session: Session):
    return session.query(ModelFuncionario).all()

def add_funcionario(funcionario: FuncionarioComIdDoUsuario, session: Session):
    novo_funcionario = ModelFuncionario(
        usuario_id=funcionario.usuario_id,
        nome=funcionario.nome,
        cpf=funcionario.cpf,
        rg=funcionario.rg,
        email=funcionario.email,
        telefone=funcionario.telefone,
        cep=funcionario.cep,
        logradouro=funcionario.logradouro,
        bairro=funcionario.bairro,
        cidade=funcionario.cidade,
        estado=funcionario.estado,
        numero=funcionario.numero,
        complemento=funcionario.complemento,
        data_nascimento=funcionario.data_nascimento,
        data_admissao=funcionario.data_admissao,
        nome_pai=funcionario.nome_pai,
        nome_mae=funcionario.nome_mae,
        funcao=funcionario.funcao,
        salario_base=funcionario.salario_base,
        banco=funcionario.banco,
        agencia=funcionario.agencia,
        conta=funcionario.conta,
        titular=funcionario.titular,
        pix=funcionario.pix
    )
    session.add(novo_funcionario)
    session.commit()
    session.refresh(novo_funcionario)
    return novo_funcionario

def put_funcionario(id: int, funcionario_atualizado: FuncionarioComIdDoUsuario, session: Session):
    db_funcionario = session.query(ModelFuncionario).filter_by(id=id).first()
    if not db_funcionario:
        raise HTTPException(
            status_code=404,
            detail="Funcionário não encontrado."
        )
    
    funcionario_data = funcionario_atualizado.dict(exclude_unset=True)
    for key, value in funcionario_data.items():
        setattr(db_funcionario, key, value)

    session.add(db_funcionario)
    session.commit()
    session.refresh(db_funcionario)
    return db_funcionario

def delete_funcionario(id: int, session: Session):
    db_funcionario = session.query(ModelFuncionario).filter_by(id=id).first()
    if not db_funcionario:
        raise HTTPException(
            status_code=404,
            detail="Funcionário não encontrado."
        )
    session.delete(db_funcionario)
    session.commit()
    return {
        "detail": "Funcionário removido com sucesso."
    }    
