"""내보내기 API 테스트."""

import io
import shutil
from pathlib import Path

import pytest
from fastapi.testclient import TestClient
from fpdf import FPDF

from app.core.config import settings
from app.core.database import Base, engine
from app.main import app
from tests._safety_guards import safe_drop_all, safe_rmtree


def make_test_pdf(text="Test screenplay content") -> bytes:
    pdf = FPDF()
    pdf.add_page()
    pdf.set_font("Helvetica", size=12)
    pdf.cell(200, 10, text=text)
    return pdf.output()


@pytest.fixture(autouse=True)
def _setup_db():
    Base.metadata.create_all(engine)
    with TestClient(app):
        pass
    yield
    safe_drop_all(engine, Base.metadata)
    proj_dir = Path(settings.projects_dir)
    if proj_dir.exists():
        safe_rmtree(proj_dir)


@pytest.fixture()
def client():
    with TestClient(app, raise_server_exceptions=False) as c:
        yield c


def _admin_login(client: TestClient):
    resp = client.post("/api/v1/auth/login", json={"username": "admin", "password": "admin123"})
    assert resp.status_code == 200


def _create_project(client: TestClient) -> str:
    _admin_login(client)
    resp = client.post("/api/v1/projects/", json={"name": "Export Test Proj"})
    assert resp.status_code == 200
    return resp.json()["id"]


def _create_episode(client: TestClient, project_id: str) -> str:
    pdf_bytes = make_test_pdf("INT. OFFICE - DAY")
    resp = client.post(
        f"/api/v1/projects/{project_id}/episodes/",
        data={"episode_number": "1", "title": "Pilot"},
        files={"file": ("pilot.pdf", io.BytesIO(pdf_bytes), "application/pdf")},
    )
    assert resp.status_code == 200
    return resp.json()["id"]


def test_list_exports_empty(client: TestClient):
    """List exports returns empty list when no exports exist."""
    project_id = _create_project(client)
    resp = client.get(f"/api/v1/projects/{project_id}/exports")
    assert resp.status_code == 200
    assert resp.json() == []


def test_generate_webbook_no_key(client: TestClient):
    """Generate webbook fails when no OpenAI key is configured."""
    project_id = _create_project(client)
    episode_id = _create_episode(client, project_id)

    original_key = settings.openai_api_key
    settings.openai_api_key = ""
    try:
        resp = client.post(
            f"/api/v1/projects/{project_id}/episodes/{episode_id}/generate-webbook",
            json={"web_episode_count": 4, "sections_per_episode": 10},
        )
        assert resp.status_code == 400
        assert resp.json()["error"]["code"] == "analysis.openai_key_missing"
    finally:
        settings.openai_api_key = original_key


def test_render_pdf_no_webbook(client: TestClient):
    """Render PDF fails when no webbook package exists."""
    project_id = _create_project(client)
    episode_id = _create_episode(client, project_id)

    resp = client.post(
        f"/api/v1/projects/{project_id}/episodes/{episode_id}/render-pdf"
    )
    assert resp.status_code == 400
    assert resp.json()["error"]["code"] == "export.no_webbook"


def test_download_export_not_found(client: TestClient):
    """Download nonexistent export file returns 404."""
    project_id = _create_project(client)
    resp = client.get(f"/api/v1/projects/{project_id}/exports/nonexistent.pdf")
    assert resp.status_code == 404
    assert resp.json()["error"]["code"] == "export.file_not_found"
