from fastapi import APIRouter, Depends
from pydantic import BaseModel
from typing import Optional
from datetime import datetime, timezone

from repositories.user_repository import UserRepository
from utils.auth_dependency import handles_authentication, user_dependency
from utils.database import db_dependency
from repositories.company_repository import CompanyRepository
from schemas.company import CompanySchema, CreateCompanyRequest
from utils.messages import Message
from utils.response import Response, ObjectResponseModel
from utils.constants import BusinessType, RegisterStep
from utils.exceptions import AlreadyExistsException

router = APIRouter(prefix="/api/company", tags=["Company Setup"])


@router.post("/create", status_code=200, response_model=ObjectResponseModel)
@handles_authentication
async def create_company(user: user_dependency, request: CreateCompanyRequest, db: db_dependency):
    company_repo = CompanyRepository(db)
    user_repo = UserRepository(db)

    existing_company = await company_repo.get_by_user_id(user.get('id'))
    if existing_company:
        raise AlreadyExistsException("Company")
    
    company_data = CompanySchema(
        name=request.name,
        user_id=user.get('id'),
        business_type=request.business_type,
        address1=request.address1,
        address2=request.address2,
        zip_code=request.zip_code,
        official_phone=request.official_phone,
        created_at=datetime.now(timezone.utc),
        updated_at=datetime.now(timezone.utc)
    )
    
    company = await company_repo.create_company(company_data)
    await user_repo.update_step(user.get('id'), RegisterStep.SETUP_PHONE)
    await user_repo.update_default_company(user.get('id'), company.id)

    return Response.post(message=Message.Success.OBJECT_CREATED % "Company", obj={'step': RegisterStep.SETUP_PHONE.value})


