"""Jira integration router — link, search, sync, create issues."""

import logging
from typing import Optional
from uuid import UUID

from fastapi import APIRouter, Depends, Query
from sqlalchemy.orm import Session

from app.database import get_db
from app.dependencies.auth import get_current_user, require_role
from app.domain.unit_of_work import UnitOfWork
from app.models.jira_link import JiraLinkEntityType
from app.models.user import User
from app.schemas.jira_schema import (
    JiraIssueResult,
    JiraLinkCreate,
    JiraLinkOut,
)
from app.services import jira_service, audit_service

logger = logging.getLogger(__name__)

router = APIRouter(prefix="/jira", tags=["jira"])


@router.get("/search", response_model=list[JiraIssueResult])
def search_issues(
    q: str = Query(..., min_length=2),
    max_results: int = Query(10, le=50),
    user: User = Depends(get_current_user),
):
    """Search Jira issues by JQL or free text."""
    return jira_service.search_jira_issues(q, max_results)


@router.post("/links", response_model=JiraLinkOut, status_code=201)
def create_link(
    body: JiraLinkCreate,
    db: Session = Depends(get_db),
    user: User = Depends(get_current_user),
):
    """Associate an Aegis entity with a Jira issue."""
    with UnitOfWork(db) as uow:
        link = jira_service.create_link(
            db,
            entity_type=body.entity_type,
            entity_id=body.entity_id,
            jira_issue_key=body.jira_issue_key,
            sync_direction=body.sync_direction,
            created_by=user.id,
        )
        audit_service.log_action(
            db,
            user_id=user.id,
            action="JIRA_LINK_CREATED",
            entity_type="jira_link",
            entity_id=str(link.id),
            details={
                "linked_entity_type": body.entity_type.value,
                "linked_entity_id": str(body.entity_id),
                "jira_issue_key": body.jira_issue_key,
            },
        )
        uow.commit()
    db.refresh(link)

    return link


@router.get("/links", response_model=list[JiraLinkOut])
def list_links(
    entity_type: Optional[JiraLinkEntityType] = None,
    entity_id: Optional[UUID] = None,
    entity_ids: Optional[list[UUID]] = Query(default=None, description="Filter by multiple entity IDs"),
    db: Session = Depends(get_db),
    user: User = Depends(get_current_user),
):
    """List Jira links, optionally filtered by entity or a list of entity IDs."""
    return jira_service.list_links(
        db,
        entity_type=entity_type,
        entity_id=entity_id,
        entity_ids=entity_ids,
    )


@router.post("/links/{link_id}/sync")
def sync_link(
    link_id: UUID,
    db: Session = Depends(get_db),
    user: User = Depends(require_role("admin")),
):
    """Force bidirectional sync for a specific Jira link."""
    with UnitOfWork(db) as uow:
        link = jira_service.get_link_or_raise(db, link_id)
        jira_service.sync_jira_to_aegis(db, link)
        uow.commit()
    return {"message": "Sync completed", "jira_status": link.jira_status}


@router.delete("/links/{link_id}", status_code=204)
def delete_link(
    link_id: UUID,
    db: Session = Depends(get_db),
    user: User = Depends(get_current_user),
):
    """Remove a Jira link."""
    with UnitOfWork(db) as uow:
        link = jira_service.delete_link(db, link_id)
        audit_service.log_action(
            db,
            user_id=user.id,
            action="jira_link_deleted",
            entity_type="jira_link",
            entity_id=str(link_id),
            details={"jira_issue_key": link.jira_issue_key},
        )
        uow.commit()


@router.post("/create-issue")
def create_issue_from_entity(
    entity_type: JiraLinkEntityType,
    entity_id: UUID,
    db: Session = Depends(get_db),
    user: User = Depends(get_current_user),
):
    """Auto-create a Jira issue from an Aegis entity and link them."""
    with UnitOfWork(db) as uow:
        result = jira_service.create_issue_and_link(
            db,
            entity_type=entity_type,
            entity_id=entity_id,
            created_by=user.id,
        )
        uow.commit()
    return result
