from fastapi import FastAPI, File, UploadFile, HTTPException
from fastapi.middleware.cors import CORSMiddleware
from pydantic import BaseModel, Field

from agents.admin_agent import interpret_admin_command
from agents.grammar_agent import evaluate_grammar
from agents.interview_agent import prepare_interview
from agents.listening_agent import evaluate_listening
from agents.pronunciation_agent import evaluate_pronunciation
from agents.reading_agent import evaluate_reading
from agents.speaking_agent import evaluate_speaking
from agents.study_planner_agent import create_study_plan
from agents.vocabulary_agent import evaluate_vocabulary
from agents.writing_agent import evaluate_writing
from services.ai_router import ask_ai
from services.whisper_service import transcribe_audio

app = FastAPI()
app.add_middleware(
    CORSMiddleware,
    allow_origins=["*"],
    allow_methods=["*"],
    allow_headers=["*"],
)


class SpeakingRequest(BaseModel):
    transcript: str
    part: str = "Part 1"


class WritingRequest(BaseModel):
    essay: str
    task: int = 2


class AdminCommandRequest(BaseModel):
    command: str


class TextRequest(BaseModel):
    text: str


class PronunciationRequest(BaseModel):
    transcript: str


class ReadingRequest(BaseModel):
    passages: str | list = Field(default="")
    questions: str | list = Field(default="")


class ListeningRequest(BaseModel):
    audioAnalysis: str | dict = Field(default="")
    questions: str | list = Field(default="")


class InterviewRequest(BaseModel):
    script: str


class PlannerRequest(BaseModel):
    profile: str | dict = Field(default="")
    goals: str | list = Field(default="")


class ExaminerRequest(BaseModel):
    module: str = "general"
    part: str = "Part 1"
    task: int = 2
    transcript: str = ""
    essay: str = ""
    responses: str | list | dict = ""


@app.get("/")
async def home():
    return {"status": "success", "message": "ALO AI Agent Engine Running"}


@app.get("/health")
async def health():
    return {"status": "ok", "service": "alo-ai-engine"}


@app.post("/ai/speaking")
async def speaking_exam(data: SpeakingRequest):
    return evaluate_speaking(data.transcript, data.part)


@app.post("/ai/writing")
async def writing_exam(data: WritingRequest):
    return evaluate_writing(data.essay, data.task)


@app.post("/ai/grammar")
async def grammar_exam(data: TextRequest):
    return evaluate_grammar(data.text)


@app.post("/ai/vocabulary")
async def vocabulary_exam(data: TextRequest):
    return evaluate_vocabulary(data.text)


@app.post("/ai/pronunciation")
async def pronunciation_exam(data: PronunciationRequest):
    return evaluate_pronunciation(data.transcript)


@app.post("/ai/reading")
async def reading_exam(data: ReadingRequest):
    return evaluate_reading(data.passages, data.questions)


@app.post("/ai/listening")
async def listening_exam(data: ListeningRequest):
    return evaluate_listening(data.audioAnalysis, data.questions)


@app.post("/ai/interview")
async def interview_exam(data: InterviewRequest):
    return prepare_interview(data.script)


@app.post("/ai/planner")
async def planner_exam(data: PlannerRequest):
    return create_study_plan(data.profile, data.goals)


@app.post("/ai/examiner")
async def examiner_exam(data: ExaminerRequest):
    prompt = f"""
You are a certified AI English examiner for ALO Education.
Evaluate this submission and return structured feedback.

Module: {data.module}
Part: {data.part}
Task: {data.task}
Transcript:
{data.transcript}

Essay:
{data.essay}

Responses:
{data.responses}

Return:
- overall_band
- pronunciation_score
- grammar_score
- vocabulary_score
- coherence_score
- fluency_score
- strengths
- weaknesses
- recommended_next_steps
"""
    return ask_ai(prompt)


@app.post("/ai/command")
async def ai_command(data: AdminCommandRequest):
    return interpret_admin_command(data.command)


@app.post("/ai/transcribe")
async def transcribe_audio_file(file: UploadFile = File(...)):
    content = await file.read()
    result = transcribe_audio(content)
    if not result.get("success"):
        raise HTTPException(status_code=500, detail=result.get("message", "Transcription failed."))

    transcript = result.get("transcript", "")
    return {
        **result,
        "transcript": transcript,
        "text": transcript,
    }
