from typing import List, Optional
from fastapi import APIRouter, Depends, status
from sqlalchemy.orm import Session
from app.core.database import get_db
from app.models.company import Company
from app.schemas.company import CompanyCreate, CompanyUpdate, CompanyOut
from app.helpers.crud import get_or_404
from datetime import datetime, timezone

router = APIRouter(prefix="/api/companies", tags=["companies"])


@router.get("", response_model=List[CompanyOut])
def list_companies(db: Session = Depends(get_db)):
    return db.query(Company).order_by(Company.name).all()


@router.post("", response_model=CompanyOut, status_code=status.HTTP_201_CREATED)
def create_company(body: CompanyCreate, db: Session = Depends(get_db)):
    company = Company(**body.model_dump())
    db.add(company)
    db.commit()
    db.refresh(company)
    return company


@router.get("/{company_id}", response_model=CompanyOut)
def get_company(company_id: str, db: Session = Depends(get_db)):
    return get_or_404(db, Company, company_id, "Company")


@router.put("/{company_id}", response_model=CompanyOut)
def update_company(
    company_id: str, body: CompanyUpdate, db: Session = Depends(get_db)
):
    company = get_or_404(db, Company, company_id, "Company")
    for field, value in body.model_dump(exclude_none=True).items():
        setattr(company, field, value)
    company.updated_at = datetime.now(timezone.utc)
    db.commit()
    db.refresh(company)
    return company


@router.delete("/{company_id}", status_code=status.HTTP_204_NO_CONTENT)
def delete_company(company_id: str, db: Session = Depends(get_db)):
    company = get_or_404(db, Company, company_id, "Company")
    db.delete(company)
    db.commit()
