from fastapi import APIRouter, Depends, status, Request, HTTPException
from sqlalchemy.orm import Session
from utils.get_db import get_db
from models.project_model import Project
from models.project_workflow_status import ProjectWorkflowStatus
from schema.workflow_status_schema import WorkflowStatusCreate, WorkflowStatusResponseSchema
from uuid import UUID
from typing import List
from fastapi.security import HTTPBearer

workflow_status_router = APIRouter()
security = HTTPBearer()

@workflow_status_router.get("/{project_id}/statuses", response_model=List[WorkflowStatusResponseSchema], status_code=status.HTTP_200_OK, dependencies=[Depends(security)])
def get_project_workflow_statuses(project_id: UUID, request: Request, db: Session = Depends(get_db)):
    try:
        user = request.state.user
        project = db.query(Project).filter(Project.id == project_id, Project.org_id == user.org_id).first()
        if not project:
            raise HTTPException(
                status_code=status.HTTP_404_NOT_FOUND,
                detail="Project not found or not in user's organization"
            )
        
        statuses = db.query(ProjectWorkflowStatus).filter(ProjectWorkflowStatus.project_id == project_id).order_by(ProjectWorkflowStatus.order.asc()).all()
        return statuses
    except HTTPException as e:
        raise e
    except Exception as e:
        raise HTTPException(
            status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
            detail=f"Failed to get workflow statuses: {str(e)}"
        )

@workflow_status_router.post("/{project_id}/statuses", response_model=List[WorkflowStatusResponseSchema], status_code=status.HTTP_200_OK, dependencies=[Depends(security)])
def save_project_workflow_statuses(project_id: UUID, payload: List[WorkflowStatusCreate], request: Request, db: Session = Depends(get_db)):
    try:
        user = request.state.user
        project = db.query(Project).filter(Project.id == project_id, Project.org_id == user.org_id).first()
        if not project:
            raise HTTPException(
                status_code=status.HTTP_404_NOT_FOUND,
                detail="Project not found or not in user's organization"
            )

        # Clear existing statuses for this project
        db.query(ProjectWorkflowStatus).filter(ProjectWorkflowStatus.project_id == project_id).delete()

        # Insert new statuses
        new_statuses = []
        for item in payload:
            status_obj = ProjectWorkflowStatus(
                project_id=project_id,
                status_key=item.status_key.upper().strip(),
                label=item.label.strip(),
                color=item.color.strip(),
                order=item.order
            )
            db.add(status_obj)
            new_statuses.append(status_obj)

        db.commit()
        
        # Reload to return with generated IDs
        return db.query(ProjectWorkflowStatus).filter(ProjectWorkflowStatus.project_id == project_id).order_by(ProjectWorkflowStatus.order.asc()).all()
    except HTTPException as e:
        raise e
    except Exception as e:
        db.rollback()
        raise HTTPException(
            status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
            detail=f"Failed to save workflow statuses: {str(e)}"
        )
