from fastapi import APIRouter, Depends, status, Request, Query, BackgroundTasks,UploadFile, File
from sqlalchemy.orm import Session
from utils.get_db import get_db
from schema.ticket_schema import TicketCreateRequestSchema, TicketResponseSchema, TicketUpdateRequestSchema
from services.tickets_service import (
    create_ticket_for_project,
    get_tickets_by_project_id,
    get_all_organization_tickets_from_db,
    update_ticket_by_id,
    delete_ticket_by_id,
    get_ticket_by_number,
    upload_tickets
)
from uuid import UUID
from typing import List, Optional
from fastapi.security import HTTPBearer
from models.project_model import Project
from models.ticket_model import Ticket

security = HTTPBearer()
ticket_router = APIRouter()


@ticket_router.get("/dashboard/stats", status_code=status.HTTP_200_OK, dependencies=[Depends(security)])
def get_dashboard_stats(request: Request, db: Session = Depends(get_db)):
    try:
        user = request.state.user
        if not user or not user.org_id:
            return {
                "open_issues": 0,
                "completed": 0,
                "in_progress": 0
            }
        
        # Query all tickets belonging to projects in user's organization
        tickets = db.query(Ticket).join(Project).filter(Project.org_id == user.org_id).all()
        
        open_issues = sum(1 for t in tickets if t.status not in ["DONE"])
        completed = sum(1 for t in tickets if t.status == "DONE")
        in_progress = sum(1 for t in tickets if t.status == "IN_PROGRESS")
        
        return {
            "open_issues": open_issues,
            "completed": completed,
            "in_progress": in_progress
        }
    except Exception as e:
        print(f"Error fetching dashboard stats: {str(e)}")
        return {
            "open_issues": 0,
            "completed": 0,
            "in_progress": 0
        }


@ticket_router.get("/organization/all", response_model=List[TicketResponseSchema], status_code=status.HTTP_200_OK, dependencies=[Depends(security)])
def get_all_organization_tickets(
    request: Request,
    limit: int = 20,
    offset: int = 0,
    assignee_id: Optional[List[str]] = Query(None),
    reporter_id: Optional[List[str]] = Query(None),
    priority: Optional[List[str]] = Query(None),
    type: Optional[List[str]] = Query(None),
    status: Optional[List[str]] = Query(None),
    label_id: Optional[List[str]] = Query(None),
    release_name: Optional[List[str]] = Query(None),
    created_after: Optional[str] = Query(None),
    created_before: Optional[str] = Query(None),
    q: Optional[str] = Query(None),
    sort_by: Optional[str] = Query("newest"),
    db: Session = Depends(get_db)
):
    return get_all_organization_tickets_from_db(
        request=request,
        db=db,
        limit=limit,
        offset=offset,
        assignee_id=assignee_id,
        reporter_id=reporter_id,
        priority=priority,
        type=type,
        status=status,
        label_id=label_id,
        release_name=release_name,
        created_after=created_after,
        created_before=created_before,
        q=q,
        sort_by=sort_by
    )




@ticket_router.post("/create-ticket", response_model=TicketResponseSchema, status_code=status.HTTP_201_CREATED, dependencies=[Depends(security)])
def create_ticket(request: Request, payload: TicketCreateRequestSchema, background_tasks: BackgroundTasks, db: Session = Depends(get_db)):
    return create_ticket_for_project(request, payload, background_tasks, db)


@ticket_router.get("/project/{project_id}", response_model=List[TicketResponseSchema], status_code=status.HTTP_200_OK, dependencies=[Depends(security)])
def get_project_tickets(
    project_id: UUID,
    request: Request,
    limit: int = 20,
    offset: int = 0,
    assignee_id: Optional[List[str]] = Query(None),
    reporter_id: Optional[List[str]] = Query(None),
    priority: Optional[List[str]] = Query(None),
    type: Optional[List[str]] = Query(None),
    status: Optional[List[str]] = Query(None),
    label_id: Optional[List[str]] = Query(None),
    release_name: Optional[List[str]] = Query(None),
    created_after: Optional[str] = Query(None),
    created_before: Optional[str] = Query(None),
    q: Optional[str] = Query(None),
    sort_by: Optional[str] = Query("newest"),
    db: Session = Depends(get_db)
):
    return get_tickets_by_project_id(
        project_id=project_id,
        request=request,
        db=db,
        limit=limit,
        offset=offset,
        assignee_id=assignee_id,
        reporter_id=reporter_id,
        priority=priority,
        type=type,
        status=status,
        label_id=label_id,
        release_name=release_name,
        created_after=created_after,
        created_before=created_before,
        q=q,
        sort_by=sort_by
    )


@ticket_router.patch("/{ticket_id}", response_model=TicketResponseSchema, status_code=status.HTTP_200_OK, dependencies=[Depends(security)])
def update_ticket(ticket_id: UUID, request: Request, payload: TicketUpdateRequestSchema, background_tasks: BackgroundTasks, db: Session = Depends(get_db)):
    return update_ticket_by_id(ticket_id, request, payload, background_tasks, db)


@ticket_router.delete("/{ticket_id}", response_model=TicketResponseSchema, status_code=status.HTTP_200_OK, dependencies=[Depends(security)])
def delete_ticket(ticket_id: UUID, request: Request, background_tasks: BackgroundTasks, db: Session = Depends(get_db)):
    return delete_ticket_by_id(ticket_id, request, background_tasks, db)


@ticket_router.get("/by-number/{ticket_number}", response_model=TicketResponseSchema, status_code=status.HTTP_200_OK, dependencies=[Depends(security)])
def get_ticket_number(ticket_number: str, request: Request, db: Session = Depends(get_db)):
    return get_ticket_by_number(ticket_number, request, db)

@ticket_router.post("/import-tickets", status_code=status.HTTP_201_CREATED)
async def upload_tickets_from_csv(request: Request,background_tasks: BackgroundTasks,file: UploadFile=File(...),  db: Session = Depends(get_db)):
    return await upload_tickets(request, background_tasks,db, file)

