from fastapi import APIRouter, HTTPException, status, Depends
from sqlalchemy.orm import Session
from typing import List
from app.schemas import ContactPerson, ContactPersonCreate, ContactPersonUpdate
from app.models import ContactPerson as ContactPersonModel
from app.dependencies import get_db

router = APIRouter()


# Existing routes
@router.get("/", response_model=List[ContactPerson])
async def get_contacts(db: Session = Depends(get_db)):
    return db.query(ContactPersonModel).all()


@router.post("/", response_model=ContactPerson, status_code=status.HTTP_201_CREATED)
async def create_contact(contact: ContactPersonCreate, db: Session = Depends(get_db)):
    if (
        db.query(ContactPersonModel)
        .filter(ContactPersonModel.email == contact.email)
        .first()
    ):
        raise HTTPException(
            status_code=status.HTTP_400_BAD_REQUEST,
            detail="This contact already exists.",
        )

    db_contact = ContactPersonModel(
        firstname=contact.firstname,
        lastname=contact.lastname,
        phone_number=contact.phone_number,
        email=contact.email,
    )
    db.add(db_contact)
    db.commit()
    db.refresh(db_contact)
    return db_contact


# New routes
@router.put("/{contact_id}", response_model=ContactPerson)
async def update_contact(
    contact_id: int, contact: ContactPersonUpdate, db: Session = Depends(get_db)
):
    db_contact = (
        db.query(ContactPersonModel).filter(ContactPersonModel.id == contact_id).first()
    )
    if not db_contact:
        raise HTTPException(
            status_code=status.HTTP_404_NOT_FOUND, detail="Contact not found."
        )
    for key, value in contact.dict(exclude_unset=True).items():
        setattr(db_contact, key, value)
    db.commit()
    db.refresh(db_contact)
    return db_contact


@router.delete("/{contact_id}", status_code=status.HTTP_204_NO_CONTENT)
async def delete_contact(contact_id: int, db: Session = Depends(get_db)):
    db_contact = (
        db.query(ContactPersonModel).filter(ContactPersonModel.id == contact_id).first()
    )
    if not db_contact:
        raise HTTPException(
            status_code=status.HTTP_404_NOT_FOUND, detail="Contact not found."
        )
    db.delete(db_contact)
    db.commit()
    return
