import logging
from pathlib import Path

from googleapiclient.discovery import build
from googleapiclient.http import MediaFileUpload

from app.config import FIXED_HASHTAGS
from app.youtube.auth import load_credentials

logger = logging.getLogger(__name__)

EDUCATION_CATEGORY_ID = "27"


def _get_service():
    creds = load_credentials()
    return build("youtube", "v3", credentials=creds)


def upload_video(
    video_path: Path,
    title: str,
    description: str,
    hashtags: list[str],
    publish_at_iso: str,
) -> str:
    all_tags = FIXED_HASHTAGS + [h for h in hashtags if h.lower() not in {t.lower() for t in FIXED_HASHTAGS}]
    tags_line = " ".join(f"#{h}" for h in all_tags)
    full_description = f"{description}\n\n{tags_line}"

    body = {
        "snippet": {
            "title": title[:100],
            "description": full_description,
            "categoryId": EDUCATION_CATEGORY_ID,
            "tags": all_tags,
        },
        "status": {
            "privacyStatus": "private",
            "publishAt": publish_at_iso,
            "selfDeclaredMadeForKids": False,
        },
    }

    media = MediaFileUpload(str(video_path), chunksize=-1, resumable=True, mimetype="video/mp4")
    service = _get_service()
    request = service.videos().insert(part="snippet,status", body=body, media_body=media)

    response = None
    while response is None:
        status, response = request.next_chunk()
        if status:
            logger.info("Upload progress: %d%%", int(status.progress() * 100))

    video_id = response["id"]
    logger.info("Uploaded video %s scheduled for %s", video_id, publish_at_iso)
    return video_id
