from sqlalchemy.orm import Session
from numpy import concatenate
from ..models.PessoaFisica import PessoaFisica as ModelPessoaFisica
from ..models.PessoaJuridica import PessoaJuridica as ModelPessoaJuridica
from ..schemas.Schemas import ClienteRecebidoPeloBodyComIdUsuario
from ..models.PessoaFisica import PessoaFisica
from fastapi import HTTPException


def get_pessoas_fisicas(session: Session):
    return session.query(ModelPessoaFisica).all()

def get_pessoas_juridicas(session: Session):
    return session.query(ModelPessoaJuridica).all()

def get_clientes(session: Session):
    pessoas_fisicas = get_pessoas_fisicas(session)
    pessoas_juridicas = get_pessoas_juridicas(session)
    return concatenate([pessoas_juridicas, pessoas_fisicas]).tolist()

def get_cliente_pelo_cpf(session: Session, cpf: str) -> PessoaFisica | None:
    return session.query(ModelPessoaFisica).filter_by(cpf=cpf).first()

def add_cliente_pessoa_fisica(novo_cliente: ClienteRecebidoPeloBodyComIdUsuario, session: Session):
    nova_pessoa_fisica = ModelPessoaFisica(
        usuario_id=novo_cliente.usuario_id,
        nome_completo=novo_cliente.nome_completo,
        cpf=novo_cliente.cpf,
        cep=novo_cliente.cep,
        logradouro=novo_cliente.logradouro,
        bairro=novo_cliente.bairro,
        cidade=novo_cliente.cidade,
        estado=novo_cliente.estado,
        numero=novo_cliente.numero,
        complemento=novo_cliente.complemento,
        licenca_operacional=novo_cliente.licenca_operacional,
        email=novo_cliente.email,
        telefone=novo_cliente.telefone
    )
    session.add(nova_pessoa_fisica)
    session.commit()
    session.refresh(nova_pessoa_fisica)
    return nova_pessoa_fisica

def add_cliente_pessoa_juridica(novo_cliente: ClienteRecebidoPeloBodyComIdUsuario, session: Session):
    nova_pessoa_juridica = ModelPessoaJuridica(
        usuario_id=novo_cliente.usuario_id,
        razao_social=novo_cliente.razao_social,
        cnpj=novo_cliente.cnpj,
        contato=novo_cliente.contato,
        responsavel=novo_cliente.responsavel,
        cep=novo_cliente.cep,
        logradouro=novo_cliente.logradouro,
        bairro=novo_cliente.bairro,
        cidade=novo_cliente.cidade,
        estado=novo_cliente.estado,
        numero=novo_cliente.numero,
        complemento=novo_cliente.complemento,
        licenca_operacional=novo_cliente.licenca_operacional,
        email=novo_cliente.email,
        telefone=novo_cliente.telefone
    )
    session.add(nova_pessoa_juridica)
    session.commit()
    session.refresh(nova_pessoa_juridica)
    return nova_pessoa_juridica

def put_cliente_pessoa_fisica(cliente_atualizado: ClienteRecebidoPeloBodyComIdUsuario, id: int, session: Session):
    db_pessoa_fisica = session.query(ModelPessoaFisica).filter_by(id=id).first()
    if not db_pessoa_fisica:
        raise HTTPException(
            status_code=404,
            detail="Pessoa física não encontrada."
        )
    pessoa_fisica_data = cliente_atualizado.dict(exclude_unset=True)
    for key, value in pessoa_fisica_data.items():
        setattr(db_pessoa_fisica, key, value)

    session.add(db_pessoa_fisica)
    session.commit()
    session.refresh(db_pessoa_fisica)
    return db_pessoa_fisica


def put_cliente_pessoa_juridica(cliente_atualizado: ClienteRecebidoPeloBodyComIdUsuario, id: int, session: Session):
    db_pessoa_juridica = session.query(ModelPessoaJuridica).filter_by(id=id).first()
    if not db_pessoa_juridica:
        raise HTTPException(
            status_code=404,
            detail="Pessoa física não encontrada."
        )
    pessoa_fisica_data = cliente_atualizado.dict(exclude_unset=True)
    for key, value in pessoa_fisica_data.items():
        setattr(db_pessoa_juridica, key, value)

    session.add(db_pessoa_juridica)
    session.commit()
    session.refresh(db_pessoa_juridica)
    return db_pessoa_juridica

def delete_cliente(id: int, session: Session):
    db_cliente = session.query(ModelPessoaFisica).filter_by(id=id).first()
    if not db_cliente:
        db_cliente = session.query(ModelPessoaJuridica).filter_by(id=id).first()
        if not db_cliente:
            raise HTTPException(
                status_code=404,
                detail="Cliente não encontrado."
            )
    session.delete(db_cliente)
    session.commit()
    return {
        "detail": "Cliente removido com sucesso."
    }
