from uuid import UUID

from fastapi import APIRouter, Depends, Header, HTTPException, Response, status
from sqlalchemy.orm import Session

from app.api.deps import get_current_user
from app.db.session import get_db
from app.models.user import User
from app.schemas.workspace import (
    BusinessMembershipResponse,
    BusinessOnboardingRequest,
    MyBusinessesResponse,
    WorkspaceResponse,
)
from app.services.workspace import (
    OnboardingAlreadyCompleted,
    create_workspace,
    create_additional_workspace,
    get_my_workspaces,
    get_workspace,
)


router = APIRouter(tags=["Workspace"])


def get_verified_current_user(
    current_user: User = Depends(get_current_user),
) -> User:
    if not current_user.is_email_verified:
        raise HTTPException(
            status_code=status.HTTP_403_FORBIDDEN,
            detail="Please verify your email before accessing a workspace.",
        )
    return current_user


@router.post(
    "/api/businesses/onboarding",
    response_model=WorkspaceResponse,
    status_code=status.HTTP_201_CREATED,
)
def onboard_business(
    payload: BusinessOnboardingRequest,
    current_user: User = Depends(get_verified_current_user),
    db: Session = Depends(get_db),
):
    try:
        business, membership, branches = create_workspace(
            db, current_user, payload
        )
    except OnboardingAlreadyCompleted:
        raise HTTPException(
            status_code=status.HTTP_409_CONFLICT,
            detail="Business onboarding has already been completed.",
        )

    return _workspace_response(business, membership, branches)


@router.post("/api/businesses", response_model=WorkspaceResponse, status_code=status.HTTP_201_CREATED)
def create_additional_business(
    payload: BusinessOnboardingRequest,
    response: Response,
    idempotency_key: str = Header(..., alias="Idempotency-Key", min_length=1, max_length=128),
    current_user: User = Depends(get_verified_current_user),
    db: Session = Depends(get_db),
):
    business, membership, branches, created = create_additional_workspace(
        db, current_user, payload, idempotency_key
    )
    if not created:
        response.status_code = status.HTTP_200_OK
    return _workspace_response(business, membership, branches)


@router.get("/api/businesses/{business_id}/workspace", response_model=WorkspaceResponse)
def business_workspace(
    business_id: UUID,
    current_user: User = Depends(get_verified_current_user),
    db: Session = Depends(get_db),
):
    workspace = get_workspace(db, current_user, business_id)
    if workspace is None:
        raise HTTPException(
            status_code=status.HTTP_404_NOT_FOUND,
            detail="No business workspace found for this user.",
        )
    return _workspace_response(*workspace)


@router.get("/api/businesses/my-businesses", response_model=MyBusinessesResponse)
def my_businesses(
    current_user: User = Depends(get_verified_current_user),
    db: Session = Depends(get_db),
):
    return MyBusinessesResponse(
        businesses=[_business_membership_response(*workspace) for workspace in get_my_workspaces(db, current_user)]
    )


def _workspace_response(business, membership, branches):
    return WorkspaceResponse(
        business=business,
        membership=membership,
        accessible_branches=branches,
        role=membership.role,
    )


def _business_membership_response(business, membership, branches):
    main_branch = next((branch for branch in branches if branch.is_main), None)
    return BusinessMembershipResponse(
        business=business,
        membership=membership,
        accessible_branches=branches,
        main_branch=main_branch,
    )
