from __future__ import annotations

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

from app.api.deps import get_session
from app.core.config import get_settings as runtime_settings
from app.models.core import AppSetting

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

DEFAULT_SETTINGS = {
    "google_drive_analytics_folder": "TrueTraceShorts/Analysen/260606 Youtube",
    "youtube_analytics_import_folder": "storage/imports/youtube/260606",
    "default_source_dir": "/home/agent/jarvis_runtime/autoshortsbot/AutoShortsBot/data/post_candidates",
    "default_import_limit": 3,
    "demo_mode": False,
    "website_repo_path": "/home/agent/projects/TrueTraceShorts_WebSite",
    "website_branch": "website-mvp-v0",
    "website_public_url": "https://truetraceshorts.pages.dev",
    "website_candidate_dir": "data/candidates",
    "website_audit_dir": "/home/agent/jarvis_runtime/autoshortsbot/AutoShortsBot/data/youtube_upload_audits",
    "website_auto_push": False,
    "youtube_oauth_scope": "https://www.googleapis.com/auth/youtube.upload",
    "youtube_default_privacy": "private",
    "youtube_upload_notify_subscribers": False,
    "youtube_default_category_id": "22",
    "youtube_contains_synthetic_media_default": True,
    "youtube_upload_dry_run": False,
}


def _settings(session: Session) -> dict:
    row = session.get(AppSetting, "dashboard")
    data = dict(DEFAULT_SETTINGS)
    if row and row.value_json:
        data.update(row.value_json)
    return data


@router.get("")
def get_settings(session: Session = Depends(get_session)):
    data = _settings(session)
    runtime = runtime_settings()
    data["youtube_config_status"] = {
        "oauth_configured": bool(runtime.google_client_id and runtime.google_client_secret),
        "client_id_present": bool(runtime.google_client_id),
        "client_secret_present": bool(runtime.google_client_secret),
        "redirect_uri": runtime.google_redirect_uri or "http://127.0.0.1:8012/api/accounts/youtube/connect/callback",
        "scope": runtime.youtube_oauth_scope,
        "default_privacy": runtime.youtube_default_privacy,
        "notify_subscribers": runtime.youtube_upload_notify_subscribers,
        "category_id": runtime.youtube_default_category_id,
        "contains_synthetic_media_default": runtime.youtube_contains_synthetic_media_default,
        "dry_run": runtime.youtube_upload_dry_run,
    }
    return {"settings": data}


@router.patch("")
def update_settings(payload: dict, session: Session = Depends(get_session)):
    allowed = set(DEFAULT_SETTINGS)
    current = _settings(session)
    for key, value in payload.items():
        if key in allowed:
            current[key] = value
    row = session.get(AppSetting, "dashboard") or AppSetting(key="dashboard")
    row.value_json = current
    row.updated_at = datetime.now(timezone.utc)
    session.add(row)
    session.commit()
    return {"ok": True, "settings": current}
