from __future__ import annotations

import argparse
import sys
from pathlib import Path

sys.path.insert(0, str(Path(__file__).resolve().parents[3]))

from sqlalchemy.orm import Session

from app.database import SessionLocal, engine, init_db
from app.programme.models_programme import CSV_LEVEL_SLUGS, ProgrammeLevel, resolve_upp_csv_path
from app.programme.services.programme_service import (
    import_programmes_from_csv,
    programme_schema_outdated,
    recreate_programme_schema,
    reseed_programmes_from_csv,
    seed_programmes_from_csv_if_empty,
    sync_programme_string_columns,
    sync_users_programme_columns,
)


def main() -> None:
    parser = argparse.ArgumentParser(description="Import programme data from UPP CSV files")
    parser.add_argument(
        "--force",
        action="store_true",
        help="ORM se programme rows delete kar dubara CSV import (schema same hona chahiye)",
    )
    parser.add_argument(
        "--reset-schema",
        action="store_true",
        help="programme_* tables DROP karke naya schema (missing column / purani table fix)",
    )
    args = parser.parse_args()

    if args.reset_schema and args.force:
        print("Note: --reset-schema already pura programme tree hata deta hai; --force optional hai.")

    sync_programme_string_columns(engine)
    init_db()
    sync_users_programme_columns(engine)

    if args.reset_schema:
        print("Purani programme_* tables hata rahe hain (Postgres: CASCADE)...")
        recreate_programme_schema()
    elif programme_schema_outdated(engine):
        print("Purana programme schema mila (jaise `kind` column missing). Auto-reset + dubara create...")
        recreate_programme_schema()

    init_db()
    sync_users_programme_columns(engine)

    db: Session = SessionLocal()
    try:
        print("CSV paths (pehla milne wala file):")
        for slug in CSV_LEVEL_SLUGS:
            p = resolve_upp_csv_path(slug)
            print(f"  {slug}: {p or 'NOT FOUND'}")

        print(
            "\nDB import chal raha hai — bahut saari rows; 1–5 min lag sakte hain. "
            "Neeche har level ke baad line aayegi; commit par thodi der aur.\n",
            flush=True,
        )

        if args.reset_schema:
            ok = import_programmes_from_csv(db, progress=True)
            print(
                "Reset-schema + seed:",
                "OK — data import ho gaya" if ok else "FAIL — koi CSV nahi mili ya import error",
            )
        elif args.force:
            ok = reseed_programmes_from_csv(db, progress=True)
            print("Force reseed:", "OK — data import ho gaya" if ok else "FAIL — koi CSV nahi mili ya import error")
        else:
            before = db.query(ProgrammeLevel).count()
            ok = seed_programmes_from_csv_if_empty(db, progress=True)
            after = db.query(ProgrammeLevel).count()
            if before > 0:
                print("Pehle se programme_levels me data hai — seed skip (khali chahiye).")
                print("Sirf data dubara: python app/programme/scripts/seed_programme.py --force")
                print("Schema + data fix: python app/programme/scripts/seed_programme.py --reset-schema")
            elif ok:
                print(f"Seed OK — programme_levels rows: {after}")
            else:
                print("Seed nahi chala — CSV files nahi milien ya DB error. Upar NOT FOUND check karo.")
    finally:
        db.close()


if __name__ == "__main__":
    main()
