from __future__ import annotations

from fastapi import APIRouter, Depends
from sqlmodel import Session, select

from app.api.deps import get_session
from app.models.core import ActivityEvent, PostDraft, ProductionQueueItem, UploadRequest, VideoAsset, now_utc
from app.services.seed_demo import seed_demo

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

ACTIVE_REVIEW_VIDEO_STATUSES = {
    "ready_for_review",
    "in_review",
    "needs_metadata",
    "approved",
    "scheduled",
}
TEST_MARKERS = ("test", "preview", "demo", "sprint", "package_774e1ed1", "package_real_", "package_demo")


def _looks_like_test_video(video: VideoAsset) -> bool:
    text = " ".join([
        video.working_title or "",
        video.candidate_id or "",
        video.package_id or "",
        video.source_label or "",
        video.import_batch_label or "",
    ]).lower()
    return video.is_demo or any(marker in text for marker in TEST_MARKERS)


def reset_active_workspace(session: Session, payload: dict | None = None) -> dict:
    payload = payload or {}
    archive_status = payload.get("archive_status") or "archived"
    queue_archive_status = payload.get("queue_archive_status") or "archived_pre_real_run"
    reset_queue = bool(payload.get("archive_active_queue", True))
    videos_archived = 0
    drafts_archived = 0
    requests_archived = 0
    queue_archived = 0

    videos = session.exec(select(VideoAsset)).all()
    archived_video_ids = set()
    for video in videos:
        if video.status in ACTIVE_REVIEW_VIDEO_STATUSES or _looks_like_test_video(video):
            video.status = archive_status
            video.updated_at = now_utc()
            session.add(video)
            archived_video_ids.add(video.id)
            videos_archived += 1
            for draft in session.exec(select(PostDraft).where(PostDraft.video_asset_id == video.id)).all():
                if draft.status not in {"uploaded_private", "posted_on_tiktok", "archived", "done"}:
                    draft.status = archive_status
                    draft.scheduled_at = None
                    draft.updated_at = now_utc()
                    session.add(draft)
                    drafts_archived += 1

    # Clean calendar/work inbox clutter from drafts whose parent video is already archived/test-hidden.
    for draft in session.exec(select(PostDraft)).all():
        video = session.get(VideoAsset, draft.video_asset_id)
        if video and (video.id in archived_video_ids or video.status == "archived" or _looks_like_test_video(video)) and draft.status in {"scheduled", "draft", "ready_for_review", "needs_metadata", "exported_for_tiktok", "upload_requested"}:
            draft.status = archive_status
            draft.scheduled_at = None
            draft.updated_at = now_utc()
            session.add(draft)
            drafts_archived += 1

    for req in session.exec(select(UploadRequest)).all():
        if req.status in {"approved", "sent_to_executor", "failed", "draft", "waiting_for_executor"}:
            text = " ".join([req.expected_candidate_id or "", req.approval_text or "", str(req.metadata_snapshot_json or {})]).lower()
            if any(marker in text for marker in TEST_MARKERS) or payload.get("archive_upload_requests", True):
                req.status = queue_archive_status
                req.updated_at = now_utc()
                session.add(req)
                requests_archived += 1

    if reset_queue:
        for item in session.exec(select(ProductionQueueItem)).all():
            if item.status in {"locked_next", "approved_next", "concept_proposed", "concept_approved", "producing", "in_review", "needs_changes", "sent_to_production", "package_ready", "failed"}:
                item.status = queue_archive_status
                item.updated_at = now_utc()
                session.add(item)
                queue_archived += 1

    session.add(ActivityEvent(
        entity_type="dev_reset",
        entity_id="active_workspace",
        event_type="active_workspace_reset",
        label="Active workspace archived for real production run",
        payload_json={
            "videos_archived": videos_archived,
            "drafts_archived": drafts_archived,
            "upload_requests_archived": requests_archived,
            "queue_items_archived": queue_archived,
            "archive_status": archive_status,
            "queue_archive_status": queue_archive_status,
        },
    ))
    session.commit()
    active_review_count = len([v for v in session.exec(select(VideoAsset)).all() if v.status in ACTIVE_REVIEW_VIDEO_STATUSES])
    return {
        "ok": True,
        "videos_archived": videos_archived,
        "drafts_archived": drafts_archived,
        "upload_requests_archived": requests_archived,
        "queue_items_archived": queue_archived,
        "active_review_count": active_review_count,
        "kept": ["analytics", "content_library", "content_families", "scripts", "upload_audits", "logs", "website_pending_files"],
    }


@router.post("/seed")
def seed():
    return seed_demo()


@router.post("/reset-active-workspace")
def reset_workspace(payload: dict | None = None, session: Session = Depends(get_session)):
    return reset_active_workspace(session, payload or {})
