from fastapi.testclient import TestClient
from sqlmodel import Session

from app.core.config import get_settings
from app.db.session import init_db, reset_db_for_tests
from app.main import app
from app.models.core import PostDraft, Provider, VideoAsset, VideoStatus


def setup_test_db(tmp_path):
    settings = get_settings()
    settings.database_url = "sqlite://"
    settings.storage_root = tmp_path / "storage"
    engine = init_db(settings)
    reset_db_for_tests(engine)
    return engine, TestClient(app)


def test_schedule_accepts_iso_datetime_string(tmp_path):
    engine, client = setup_test_db(tmp_path)
    with Session(engine) as session:
        video = VideoAsset(
            candidate_id="schedule_video",
            package_id="package_schedule_video",
            source="prepared_package",
            file_path=str(tmp_path / "video.mp4"),
            file_size=1,
            checksum="schedule-video-checksum",
            working_title="Schedule Video",
            status=VideoStatus.ready_for_review,
        )
        session.add(video)
        session.commit()
        session.refresh(video)
        draft = PostDraft(video_asset_id=video.id, provider=Provider.youtube, title="Schedule", privacy_status="private")
        session.add(draft)
        session.commit()
        session.refresh(draft)
        draft_id = draft.id

    response = client.post(f"/api/post-drafts/{draft_id}/schedule", json={"scheduled_at": "2026-06-07T09:30:00+02:00"})

    assert response.status_code == 200
    assert response.json()["status"] == "scheduled"
    detail = client.get(f"/api/post-drafts/{draft_id}").json()
    assert detail["scheduled_at"].startswith("2026-06-07T09:30:00")


def test_schedule_rejects_invalid_datetime(tmp_path):
    engine, client = setup_test_db(tmp_path)
    with Session(engine) as session:
        video = VideoAsset(
            candidate_id="bad_schedule_video",
            package_id="package_bad_schedule_video",
            source="prepared_package",
            file_path=str(tmp_path / "video.mp4"),
            file_size=1,
            checksum="bad-schedule-video-checksum",
            working_title="Bad Schedule Video",
            status=VideoStatus.ready_for_review,
        )
        session.add(video)
        session.commit()
        session.refresh(video)
        draft = PostDraft(video_asset_id=video.id, provider=Provider.youtube, title="Schedule", privacy_status="private")
        session.add(draft)
        session.commit()
        session.refresh(draft)
        draft_id = draft.id

    response = client.post(f"/api/post-drafts/{draft_id}/schedule", json={"scheduled_at": "not-a-date"})

    assert response.status_code == 400
