"""
Company endpoints
"""
from fastapi import APIRouter, Depends, HTTPException, status
from sqlalchemy.orm import Session
from typing import List
from uuid import UUID

from app.db.session import get_db
from app.models.company import Company, UserCompany
from app.models.user import Country, User
from app.schemas.company import CompanyCreate, CompanyUpdate, Company, UserCompanyCreate, UserCompanyUpdate, UserCompany

router = APIRouter()


# Company endpoints
@router.post("/", response_model=Company)
def create_company(
    company: CompanyCreate,
    db: Session = Depends(get_db)
):
    # Verify country exists
    db_country = db.query(Country).filter(Country.country_id == company.country_id).first()
    if db_country is None:
        raise HTTPException(status_code=404, detail="Country not found")
    
    db_company = Company(**company.dict())
    db.add(db_company)
    db.commit()
    db.refresh(db_company)
    return db_company


@router.get("/", response_model=List[Company])
def read_companies(
    skip: int = 0,
    limit: int = 100,
    db: Session = Depends(get_db)
):
    companies = db.query(Company).offset(skip).limit(limit).all()
    return companies


@router.get("/{company_id}", response_model=Company)
def read_company(
    company_id: UUID,
    db: Session = Depends(get_db)
):
    db_company = db.query(Company).filter(Company.company_id == company_id).first()
    if db_company is None:
        raise HTTPException(status_code=404, detail="Company not found")
    return db_company


@router.put("/{company_id}", response_model=Company)
def update_company(
    company_id: UUID,
    company: CompanyUpdate,
    db: Session = Depends(get_db)
):
    db_company = db.query(Company).filter(Company.company_id == company_id).first()
    if db_company is None:
        raise HTTPException(status_code=404, detail="Company not found")
    
    update_data = company.dict(exclude_unset=True)
    for key, value in update_data.items():
        setattr(db_company, key, value)
    
    db.commit()
    db.refresh(db_company)
    return db_company


@router.delete("/{company_id}")
def delete_company(
    company_id: UUID,
    db: Session = Depends(get_db)
):
    db_company = db.query(Company).filter(Company.company_id == company_id).first()
    if db_company is None:
        raise HTTPException(status_code=404, detail="Company not found")
    
    db.delete(db_company)
    db.commit()
    return {"message": "Company deleted successfully"}


# User Company endpoints
@router.post("/user-companies/", response_model=UserCompany)
def create_user_company(
    user_company: UserCompanyCreate,
    db: Session = Depends(get_db)
):
    # Verify user exists
    db_user = db.query(User).filter(User.user_id == user_company.user_id).first()
    if db_user is None:
        raise HTTPException(status_code=404, detail="User not found")
    
    # Verify company exists
    db_company = db.query(Company).filter(Company.company_id == user_company.company_id).first()
    if db_company is None:
        raise HTTPException(status_code=404, detail="Company not found")
    
    db_user_company = UserCompany(**user_company.dict())
    db.add(db_user_company)
    db.commit()
    db.refresh(db_user_company)
    return db_user_company


@router.get("/user-companies/", response_model=List[UserCompany])
def read_user_companies(
    skip: int = 0,
    limit: int = 100,
    db: Session = Depends(get_db)
):
    user_companies = db.query(UserCompany).offset(skip).limit(limit).all()
    return user_companies


@router.get("/user-companies/{user_company_id}", response_model=UserCompany)
def read_user_company(
    user_company_id: int,
    db: Session = Depends(get_db)
):
    db_user_company = db.query(UserCompany).filter(UserCompany.user_company_id == user_company_id).first()
    if db_user_company is None:
        raise HTTPException(status_code=404, detail="User company not found")
    return db_user_company


@router.put("/user-companies/{user_company_id}", response_model=UserCompany)
def update_user_company(
    user_company_id: int,
    user_company: UserCompanyUpdate,
    db: Session = Depends(get_db)
):
    db_user_company = db.query(UserCompany).filter(UserCompany.user_company_id == user_company_id).first()
    if db_user_company is None:
        raise HTTPException(status_code=404, detail="User company not found")
    
    update_data = user_company.dict(exclude_unset=True)
    for key, value in update_data.items():
        setattr(db_user_company, key, value)
    
    db.commit()
    db.refresh(db_user_company)
    return db_user_company


@router.delete("/user-companies/{user_company_id}")
def delete_user_company(
    user_company_id: int,
    db: Session = Depends(get_db)
):
    db_user_company = db.query(UserCompany).filter(UserCompany.user_company_id == user_company_id).first()
    if db_user_company is None:
        raise HTTPException(status_code=404, detail="User company not found")
    
    db.delete(db_user_company)
    db.commit()
    return {"message": "User company deleted successfully"}