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, AnalyticsImportBatch, ApiCallLog, ImportLog, PublishJob, TikTokUploadAttempt, YouTubeUploadAudit
from app.security.redaction import redact_json

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


@router.get("")
def logs(kind: str | None = None, session: Session = Depends(get_session)):
    items = []
    if kind in {None, "activity"}:
        for e in session.exec(select(ActivityEvent).order_by(ActivityEvent.created_at.desc()).limit(100)).all():
            items.append({"kind": "activity", "id": e.id, "label": e.label, "event_type": e.event_type, "entity_type": e.entity_type, "entity_id": e.entity_id, "created_at": e.created_at.isoformat(), "payload": redact_json(e.payload_json)})
    if kind in {None, "imports"}:
        for b in session.exec(select(AnalyticsImportBatch).order_by(AnalyticsImportBatch.imported_at.desc()).limit(50)).all():
            items.append({"kind": "analytics_import", "id": b.id, "label": b.import_batch_label or b.source_label or "Analytics import", "status": b.status, "provider": b.provider, "created_at": b.imported_at.isoformat(), "payload": {"files": b.total_files, "rows": b.total_rows, "warnings": b.warnings_json}})
        for i in session.exec(select(ImportLog).order_by(ImportLog.created_at.desc()).limit(50)).all():
            items.append({"kind": "package_import", "id": i.id, "label": i.package_id or i.folder_name or "Package import", "status": i.status, "created_at": i.created_at.isoformat(), "payload": {"message": i.message, "error": i.error}})
    if kind in {None, "publish"}:
        for j in session.exec(select(PublishJob).order_by(PublishJob.created_at.desc()).limit(50)).all():
            items.append({"kind": "publish_job", "id": j.id, "label": j.job_type, "status": j.status, "provider": j.provider, "created_at": j.created_at.isoformat(), "payload": redact_json({"error": j.error_message, "external_post_id": j.external_post_id})})
    if kind in {None, "youtube", "youtube_uploads"}:
        for y in session.exec(select(YouTubeUploadAudit).order_by(YouTubeUploadAudit.created_at.desc()).limit(100)).all():
            items.append({"kind": "youtube_upload", "id": y.id, "label": y.title or "YouTube private upload", "status": y.upload_status, "provider": "youtube", "created_at": y.created_at.isoformat(), "payload": redact_json({"youtube_video_id": y.youtube_video_id, "privacy": y.privacy_status, "endpoints": y.api_endpoints_called, "scopes": y.oauth_scopes_used, "error": y.error_message, "website_link_allowed": y.website_link_allowed})})
    if kind in {None, "tiktok", "tiktok_verification"}:
        for t in session.exec(select(TikTokUploadAttempt).order_by(TikTokUploadAttempt.created_at.desc()).limit(100)).all():
            items.append({"kind": "tiktok_verification", "id": t.id, "label": "TikTok Upload Draft demo", "status": t.upload_status, "provider": "tiktok", "created_at": t.created_at.isoformat(), "payload": redact_json({"mode": t.mode, "endpoint": "/v2/post/publish/inbox/video/init/", "scope": t.scope, "source": t.source, "publish_id": t.publish_id, "transfer_status": t.transfer_status, "request": t.request_redacted_json, "response": t.response_redacted_json, "error_code": t.error_code, "error": t.error_message})})
    if kind in {None, "api"}:
        for a in session.exec(select(ApiCallLog).order_by(ApiCallLog.created_at.desc()).limit(50)).all():
            items.append({"kind": "api_call", "id": a.id, "label": f"{a.method} {a.endpoint}", "status": a.status_code, "provider": a.provider, "created_at": a.created_at.isoformat(), "payload": redact_json({"request": a.request_redacted_json, "response": a.response_redacted_json, "error": a.error_code})})
    items.sort(key=lambda x: x.get("created_at") or "", reverse=True)
    return {"items": items[:200]}
