"""
================================================================================
 run_all_v1.1.py — IWRS: kompletní pipeline Pacienti + Léky (obě studie)
 Verze:  1.1
 Datum:  2026-06-10
================================================================================

  v1.1: všechny moduly pipeline přesunuty na úroveň IWRS/ — adresáře
        Patients/ a Drugs/ už pipeline nepotřebuje (zbývají v nich jen
        reportovací skripty, archivy a Trash)
  v1.0: první verze sjednocené pipeline

Stáhne z janssen.4gclinical.com a naimportuje do MongoDB (db `studie`):

  Pacienti: Subject Summary, Subject Details, notifikace (PDF+JSON)
  Léky:     Onsite Inventory, IP Destruction, Shipments Report, Shipment Details

Tok souborů: vše se stahuje do IWRS/Incoming/, po úspěšném importu se přesouvá
do IWRS/Incoming/Processed/. Při chybě soubor zůstává v Incoming/ a zpracuje
se při příštím běhu.

Přihlášení: 2× (jednou per studie) — studie se vybírá až po přihlášení, takže
jedna browser session stáhne pacienty i léky pro jednu studii.

Použití:
  python run_all_v1.1.py                    # vše (download + import, obě studie)
  python run_all_v1.1.py --download-only    # jen stažení do Incoming/
  python run_all_v1.1.py --import-only      # jen import čekajících souborů
  python run_all_v1.1.py --only-patients    # jen pacientská část
  python run_all_v1.1.py --only-drugs       # jen léková část
  python run_all_v1.1.py --study 42847922MDD3003   # jen jedna studie

Detaily v run_all_v1.1.md.
"""

import os
import sys
import argparse
import traceback

BASE_DIR = os.path.dirname(os.path.abspath(__file__))
if BASE_DIR not in sys.path:
    sys.path.insert(0, BASE_DIR)

from playwright.sync_api import sync_playwright

from common.iwrs_portal import login
from common.paths import STUDIES, INCOMING_DIR, PROCESSED_DIR, ensure_dirs
from common.mongo_writer import ensure_indexes

import download_patients
import import_patients
import download_drugs
import import_drugs


def download_phase(studies, do_patients, do_drugs):
    with sync_playwright() as p:
        for study in studies:
            print(f"\n{'='*60}")
            print(f"[{study}] STAHOVÁNÍ")
            print(f"{'='*60}")

            browser = p.chromium.launch(headless=False)
            context = browser.new_context(accept_downloads=True)
            page = context.new_page()

            try:
                print("  Přihlášení...")
                login(page, study)

                if do_patients:
                    print(f"\n  ── PACIENTI [{study}] ──")
                    try:
                        download_patients.run(page, study)
                    except Exception as e:
                        print(f"  CHYBA při stahování pacientů: {e}")
                        traceback.print_exc()

                if do_drugs:
                    print(f"\n  ── LÉKY [{study}] ──")
                    try:
                        download_drugs.run(page, study)
                    except Exception as e:
                        print(f"  CHYBA při stahování léků: {e}")
                        traceback.print_exc()

            except Exception as e:
                print(f"  CHYBA (login/session): {e}")
                traceback.print_exc()
            finally:
                browser.close()


def import_phase(studies, do_patients, do_drugs):
    print(f"\n{'='*60}")
    print("IMPORT DO MongoDB")
    print(f"{'='*60}")
    ensure_indexes()

    if do_patients:
        try:
            import_patients.run(studies)
        except Exception as e:
            print(f"  CHYBA při importu pacientů: {e}")
            traceback.print_exc()

    if do_drugs:
        try:
            import_drugs.run(studies)
        except Exception as e:
            print(f"  CHYBA při importu léků: {e}")
            traceback.print_exc()


def main():
    ap = argparse.ArgumentParser(
        description="IWRS pipeline: stažení + import pacientů a léků (obě studie)")
    ap.add_argument("--download-only", action="store_true", help="jen stažení do Incoming/")
    ap.add_argument("--import-only", action="store_true", help="jen import čekajících souborů")
    ap.add_argument("--only-patients", action="store_true", help="jen pacientská část")
    ap.add_argument("--only-drugs", action="store_true", help="jen léková část")
    ap.add_argument("--study", choices=STUDIES, help="jen jedna studie")
    args = ap.parse_args()

    if args.download_only and args.import_only:
        ap.error("--download-only a --import-only nelze kombinovat")
    if args.only_patients and args.only_drugs:
        ap.error("--only-patients a --only-drugs nelze kombinovat")

    studies = [args.study] if args.study else STUDIES
    do_patients = not args.only_drugs
    do_drugs = not args.only_patients

    ensure_dirs()

    if not args.import_only:
        download_phase(studies, do_patients, do_drugs)

    if not args.download_only:
        import_phase(studies, do_patients, do_drugs)

    print(f"\n{'='*60}")
    print("Vše hotovo.")
    print(f"  Incoming:  {INCOMING_DIR}")
    print(f"  Processed: {PROCESSED_DIR}")
    print(f"{'='*60}")


if __name__ == "__main__":
    main()
