from uuid import UUID
from fastapi import APIRouter, Depends,  status, Request, HTTPException
from sqlalchemy.orm import Session
from utils.get_db import get_db
from services.organization_service import (
    get_all_organization,
    create_new_organization,
    delete_organization,
    update_org_details,
    get_org_by_slug,
    check_slug_availability,
    get_organizations_by_owner,
    search_organization,
    get_organization_monthly_growth
)
from schema.organization_schema import (
    ListOfAllOrganizations, 
    OrganizationCreateRequest, 
    OrganizationCreateResponse,
    OrganizationListResponse
)
from fastapi.security import HTTPBearer
from utils.role_verification import verify_super_admin

security = HTTPBearer()

organization_router = APIRouter()

@organization_router.get("",status_code=status.HTTP_200_OK, response_model=ListOfAllOrganizations, dependencies=[Depends(security), Depends(verify_super_admin)])
def get_organizations(request:Request, db: Session = Depends(get_db), page: int = 1, limit: int = 10, status: str = None, search: str = None):
    return get_all_organization(db,request, page, limit, status, search)

@organization_router.post("/add-new-organization",status_code=status.HTTP_201_CREATED,response_model=OrganizationCreateResponse)
def create_organizations(request:OrganizationCreateRequest, db: Session = Depends(get_db)):
    return create_new_organization(request,db)

@organization_router.put("/update-org-details/{org_slug}",status_code=status.HTTP_200_OK,response_model=OrganizationCreateResponse)
def update_organizations(org_slug:str,request:OrganizationCreateRequest, db: Session = Depends(get_db)):
    return update_org_details(request,db,org_slug)

@organization_router.delete("/delete-org/{org_slug}/{org_id}",status_code=status.HTTP_200_OK,response_model=OrganizationCreateResponse)
def delete_organizations(org_slug:str,org_id:UUID, db: Session = Depends(get_db)):
    return delete_organization(db,org_slug,org_id)

@organization_router.get("/get-org/{org_slug}", status_code=status.HTTP_200_OK, response_model=OrganizationListResponse)
def get_organization(org_slug: str, db: Session = Depends(get_db)):
    return get_org_by_slug(db, org_slug)

@organization_router.get("/check-slug/{slug}", status_code=status.HTTP_200_OK)
def check_slug(slug: str, db: Session = Depends(get_db)):
    return check_slug_availability(db, slug)

@organization_router.get("/owner/{owner_id}", status_code=status.HTTP_200_OK, response_model=ListOfAllOrganizations)
def get_user_orgs(request: Request, owner_id: UUID, db: Session = Depends(get_db), page: int = 1, limit: int = 10):
    return get_organizations_by_owner(db, request, owner_id, page, limit)

@organization_router.get("/search-org", status_code=status.HTTP_200_OK, response_model=ListOfAllOrganizations)
def search_orgs(request: Request, query: str, db: Session = Depends(get_db), page: int = 1, limit: int = 10):
    return search_organization(db, request, query, page, limit)

@organization_router.get("/analytics/monthly-growth", status_code=status.HTTP_200_OK, dependencies=[Depends(security), Depends(verify_super_admin)])
def get_monthly_growth(request: Request, db: Session = Depends(get_db)):
    return get_organization_monthly_growth(db)