"""
Court Filing Service — Manage formal court filing of prepared cases.
Generates filing reference numbers and tracks filing status.
"""
import os
from pathlib import Path
from typing import Optional
from sqlalchemy.orm import Session

from ..models.models import Case
from ..models.fyp2_models import CourtFiling, DraftedPetition
from ..utils import utcnow

COURT_TYPES = [
    "Civil Court",
    "District Court",
    "Family Court",
    "High Court",
    "Supreme Court",
    "Consumer Court",
    "Labour Court",
]

DISTRICTS = [
    "Lahore", "Karachi", "Islamabad", "Rawalpindi", "Faisalabad",
    "Multan", "Peshawar", "Quetta", "Gujranwala", "Sialkot",
]


def generate_filing_number(db: Session, district: str) -> str:
    """
    Generate a unique court filing reference number.
    Format: CF-YYYY-{DISTRICT_CODE}-{SEQUENCE}
    Example: CF-2026-LAH-00089
    """
    year = utcnow().year
    district_code = district[:3].upper() if district else "GEN"
    seq = db.query(CourtFiling).count() + 1
    number = f"CF-{year}-{district_code}-{seq:05d}"
    # filing_number is unique in the DB — bump the sequence past any gaps/deletes
    while db.query(CourtFiling).filter(CourtFiling.filing_number == number).first():
        seq += 1
        number = f"CF-{year}-{district_code}-{seq:05d}"
    return number


def file_case_in_court(
    db: Session,
    case_id: int,
    lawyer_id: int,
    court_type: str,
    court_district: str,
    petition_id: Optional[int] = None,
    court_notes: str = "",
) -> "CourtFiling":
    """
    Record a formal court filing for a case.
    Updates the case status to 'filed'.
    """
    filing_number = generate_filing_number(db, court_district)

    filing = CourtFiling(
        case_id=case_id,
        lawyer_id=lawyer_id,
        court_type=court_type,
        court_district=court_district,
        filing_number=filing_number,
        petition_id=petition_id,
        filing_date=utcnow(),
        status="filed",
        court_notes=court_notes or None,
    )
    db.add(filing)

    # Update case status
    case = db.query(Case).filter(Case.id == case_id).first()
    if case:
        case.status = "filed"

    db.commit()
    db.refresh(filing)
    return filing


def get_filings_for_case(db: Session, case_id: int) -> list:
    """Return all court filings for a case, newest first."""
    return (
        db.query(CourtFiling)
        .filter(CourtFiling.case_id == case_id)
        .order_by(CourtFiling.filing_date.desc())
        .all()
    )


def update_filing_status(db: Session, filing_id: int, new_status: str) -> Optional["CourtFiling"]:
    """
    Update the status of a court filing.
    Valid statuses: filed, acknowledged, hearing_scheduled, decided
    """
    valid = ("filed", "acknowledged", "hearing_scheduled", "decided")
    if new_status not in valid:
        return None
    filing = db.query(CourtFiling).filter(CourtFiling.id == filing_id).first()
    if not filing:
        return None
    filing.status = new_status
    db.commit()
    db.refresh(filing)
    return filing


def generate_filing_package_text(filing: "CourtFiling", case: "Case", petition: Optional["DraftedPetition"]) -> str:
    """
    Generate the text content of the court filing package.
    In production, this would be converted to PDF using reportlab or WeasyPrint.
    Returns formatted text that can be displayed or saved.
    """
    now = utcnow().strftime("%d %B %Y")
    case_ref = getattr(case, "case_reference_no", f"Case #{case.id}")
    opposing = getattr(case, "opposing_party", "Respondent")
    district = getattr(case, "district", filing.court_district)

    petition_content = petition.content if petition else (
        f"[Petition for {case.category} — please attach drafted petition]"
    )

    return f"""
================================================================================
                        LEGALEASE AI — COURT FILING PACKAGE
================================================================================

FILING REFERENCE: {filing.filing_number}
FILING DATE:      {now}
COURT:            {filing.court_type}, {filing.court_district}

--------------------------------------------------------------------------------
CASE REFERENCE:   {case_ref}
CATEGORY:         {case.category}
DISTRICT:         {district}
CLIENT:           [Client Name — see system record]
OPPOSING PARTY:   {opposing}
--------------------------------------------------------------------------------

DOCUMENTS INCLUDED IN THIS FILING:
  1. Cover Page (this document)
  2. Legal Petition — {filing.court_type}
  3. Supporting Documents (see attached)
  4. Vakalatnama / Power of Attorney

--------------------------------------------------------------------------------
PETITION
--------------------------------------------------------------------------------

{petition_content}

--------------------------------------------------------------------------------
                              END OF FILING PACKAGE
              Generated by LegalEase AI — AI Legal Assistant for Pakistan
================================================================================
"""
