# -*- coding: utf-8 -*-
"""
Statikus dashboard generator Rackforest osztott tarhelyre.

Mit csinal:
  1. Beolvassa az adatbazist (webshop_adatok.db).
  2. A dashboard_template.html sablonba beleagyazza az adatot.
  3. Az eredmenyt egy celkonyvtarba menti (index.html + riport.xlsx).

Hasznalat:
  Helyi Windows + FTP feltoltes:
    python dashboard_export.py            # csak generalas a dashboard_export/ mappaba
    python dashboard_export.py --upload   # generalas + FTP feltoltes (config.py-bol)

  Rackforest szerveren (cPanel cron):
    python dashboard_export.py --target-dir /home/USER/public_html/schneider-juwelier.at/riport
      -> az aldomain mappajaba kozvetlenul ir, semmi FTP nem kell.

Jelszovedelem a tarhelyen:
    cPanel -> Directory Privacy -> a /riport mappa ->
    "Password protect this directory" -> felhasznalo + jelszo.
"""
import argparse
import sys, os, json, sqlite3, ftplib, ssl, time, glob, shutil

try:
    sys.stdout.reconfigure(encoding="utf-8", errors="replace")
except Exception:
    pass

SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__))
DB_PATH = os.path.join(SCRIPT_DIR, "webshop_adatok.db")
TEMPLATE_PATH = os.path.join(SCRIPT_DIR, "dashboard_template.html")
RIPORTOK_DIR = os.path.join(SCRIPT_DIR, "riportok")
# Helyi alapertelmezett kimenet a "public/" mappa - ez tukrozi a Rackforest publikus mappajat
OUT_DIR = os.path.join(SCRIPT_DIR, "public")
OUT_HTML = os.path.join(OUT_DIR, "index.html")
OUT_XLSX = os.path.join(OUT_DIR, "riport.xlsx")
DATA_PLACEHOLDER = "/*<<DATA>>*/null"


def read_data():
    """SQLite -> {rows: [...], last_date: '...', generated_at: '...', brands: [...]}"""
    if not os.path.exists(DB_PATH):
        raise RuntimeError(f"Nem talalom az adatbazist: {DB_PATH}")

    con = sqlite3.connect(DB_PATH)
    rows = con.execute(
        "SELECT datum, forras, osszeg FROM napi_adatok ORDER BY datum"
    ).fetchall()

    # Marka adatok (ha letezik a tabla)
    brands = []
    try:
        brand_rows = con.execute(
            "SELECT datum, forras, marka, db, osszeg FROM napi_marka ORDER BY datum"
        ).fetchall()
        for d, f, m, db, o in brand_rows:
            brands.append({
                "datum": d, "forras": f, "marka": m,
                "db": int(db or 0), "osszeg": round(float(o or 0), 2)
            })
    except sqlite3.OperationalError:
        pass  # napi_marka tabla meg nem letezik

    # Utalvanyok (ha letezik a tabla)
    vouchers = []
    try:
        v_rows = con.execute(
            """SELECT datum, forras, tipus, cimlet, db, osszeg, pluszbol_koltott
               FROM napi_utalvany ORDER BY datum"""
        ).fetchall()
        for d, f, t, c, db, o, plus in v_rows:
            vouchers.append({
                "datum": d, "forras": f, "tipus": t,
                "cimlet": int(c or 0),
                "db": int(db or 0),
                "osszeg": round(float(o or 0), 2),
                "pluszbol_koltott": round(float(plus or 0), 2)
            })
    except sqlite3.OperationalError:
        pass

    con.close()

    if not rows:
        raise RuntimeError("Az adatbazis ures (napi_adatok tabla).")

    by_date = {}
    for d, f, o in rows:
        if d not in by_date:
            by_date[d] = {"unas": 0.0, "shoprenter": 0.0}
        by_date[d][f] = float(o or 0)

    result = []
    for d in sorted(by_date.keys()):
        v = by_date[d]
        result.append({
            "datum": d,
            "unas": round(v["unas"], 2),
            "shoprenter": round(v["shoprenter"], 2),
            "total": round(v["unas"] + v["shoprenter"], 2),
        })
    return {
        "rows": result,
        "brands": brands,
        "vouchers": vouchers,
        "last_date": result[-1]["datum"],
        "generated_at": time.strftime("%Y-%m-%d %H:%M"),
    }


def generate(target_dir=None):
    """Sablon + adat -> index.html az adott mappaba.

    Ha target_dir nincs megadva, az alapertelmezett dashboard_export/ mappa.
    Tipikus hasznalat:
      - Helyi teszt:  generate()  -> dashboard_export/index.html
      - Rackforest:   generate('/home/USER/public_html/.../riport')  -> oda kozvetlenul
    """
    if not os.path.exists(TEMPLATE_PATH):
        raise RuntimeError(f"Nem talalom a sablont: {TEMPLATE_PATH}")

    with open(TEMPLATE_PATH, "r", encoding="utf-8") as f:
        template = f.read()

    if DATA_PLACEHOLDER not in template:
        raise RuntimeError(
            "A sablonban nincs benne a '/*<<DATA>>*/null' placeholder. "
            "Visszallt a dashboard_template.html?"
        )

    data = read_data()
    payload = json.dumps(data, ensure_ascii=False, separators=(",", ":"))
    html = template.replace(DATA_PLACEHOLDER, payload)

    # Frissites idopontja a header-be
    html = html.replace(
        'Üzleti dashboard — UNAS &amp; Shoprenter forgalmi adatok',
        f'Üzleti dashboard — UNAS &amp; Shoprenter — frissítve: {data["generated_at"]}'
    )

    out_dir = os.path.abspath(target_dir) if target_dir else OUT_DIR
    out_html = os.path.join(out_dir, "index.html")
    out_xlsx = os.path.join(out_dir, "riport.xlsx")
    os.makedirs(out_dir, exist_ok=True)

    with open(out_html, "w", encoding="utf-8", newline="\n") as f:
        f.write(html)

    size_kb = os.path.getsize(out_html) / 1024
    print(f"[OK] Generalva: {out_html}")
    print(f"     Adat: {len(data['rows'])} nap | Utolso datum: {data['last_date']}")
    brand_count = len(data.get("brands", []))
    if brand_count:
        unique_brands = len(set(b["marka"] for b in data["brands"]))
        print(f"     Marka adat: {brand_count} sor, {unique_brands} kulonbozo marka")
    else:
        print(f"     Marka adat: meg nincs (futtasd: python marka_lekerdezes.py --backfill 30)")
    print(f"     Fajlmeret: {size_kb:.1f} KB")

    # Legfrissebb Excel masolasa riport.xlsx neven (a dashboard 'Excel letoltese' gombja erre mutat)
    if os.path.isdir(RIPORTOK_DIR):
        xlsx_files = glob.glob(os.path.join(RIPORTOK_DIR, "webshop_riport_*.xlsx"))
        xlsx_files.sort(key=os.path.getmtime)
        if xlsx_files:
            latest = xlsx_files[-1]
            shutil.copy2(latest, out_xlsx)
            xlsx_kb = os.path.getsize(out_xlsx) / 1024
            print(f"[OK] Excel masolva: {os.path.basename(latest)} -> riport.xlsx ({xlsx_kb:.1f} KB)")
        else:
            print(f"[!] Nincs Excel a {RIPORTOK_DIR} mappaban -> 'Excel letoltese' gomb nem fog mukodni")
    else:
        print(f"[!] Nincs 'riportok/' mappa -> 'Excel letoltese' gomb nem fog mukodni")

    return out_dir


def upload():
    """FTP / FTPS feltoltes a config alapjan."""
    try:
        from config import FTP_HOST, FTP_USER, FTP_PASSWORD, FTP_TARGET_DIR
    except ImportError:
        raise RuntimeError("config.py-bol nem tudtam beolvasni az FTP adatokat.")
    try:
        from config import FTP_USE_TLS
    except ImportError:
        FTP_USE_TLS = True

    if not (FTP_HOST and FTP_USER and FTP_PASSWORD and FTP_TARGET_DIR):
        print("[!] FTP adatok hianyosak a config.py-ban -> feltoltes kihagyva.")
        print("    Allitsd be: FTP_HOST, FTP_USER, FTP_PASSWORD, FTP_TARGET_DIR")
        return False

    print(f"[..] Kapcsolodas: {FTP_HOST} ({'FTPS' if FTP_USE_TLS else 'FTP'})")
    if FTP_USE_TLS:
        ctx = ssl.create_default_context()
        ftp = ftplib.FTP_TLS(FTP_HOST, FTP_USER, FTP_PASSWORD, context=ctx, timeout=30)
        ftp.prot_p()
    else:
        ftp = ftplib.FTP(FTP_HOST, FTP_USER, FTP_PASSWORD, timeout=30)

    # Konyvtarba beleptetes (ha kell, letrehozzuk)
    parts = [p for p in FTP_TARGET_DIR.strip("/").split("/") if p]
    ftp.cwd("/")
    for p in parts:
        try:
            ftp.cwd(p)
        except ftplib.error_perm:
            print(f"     mkdir: {p}")
            ftp.mkd(p)
            ftp.cwd(p)

    with open(OUT_HTML, "rb") as f:
        ftp.storbinary("STOR index.html", f)
    print(f"[OK] Feltoltve: {FTP_TARGET_DIR}/index.html")

    if os.path.exists(OUT_XLSX):
        with open(OUT_XLSX, "rb") as f:
            ftp.storbinary("STOR riport.xlsx", f)
        print(f"[OK] Feltoltve: {FTP_TARGET_DIR}/riport.xlsx")

    ftp.quit()
    return True


def main():
    ap = argparse.ArgumentParser(
        description="Statikus dashboard generator a Schneider webshop riportokhoz."
    )
    ap.add_argument("--target-dir", help="Cel mappa ahova az index.html + riport.xlsx kerul. "
                                          "Ha nincs megadva: a helyi dashboard_export/ mappa.")
    ap.add_argument("--upload", action="store_true",
                    help="FTP feltoltes a config.py szerint (helyi --target-dir nelkul).")
    args = ap.parse_args()

    out_dir = generate(target_dir=args.target_dir)
    print()

    if args.upload:
        if args.target_dir:
            print("[!] --target-dir es --upload egyszerre nincs ertelme - csak az egyiket hasznald.")
            return
        upload()
    elif args.target_dir:
        # Kozvetlenul a celkonyvtarba irtunk, nincs tovabbi teendo
        print(f"[OK] A dashboard a {out_dir} mappaba kerult.")
        print(f"     A webszerver ezt mar szolgalja az aldomainre.")
    else:
        print("Tippek:")
        print("  python dashboard_export.py --upload                # FTP feltoltes")
        print("  python dashboard_export.py --target-dir /path      # Kozvetlen mapparairas (server)")
        print()
        print("KEZI FELTOLTES (FTP/cPanel File Manager):")
        print(f"  {os.path.join(out_dir, 'index.html')}")
        print("  -> az aldomain mappajaba (pl. /public_html/<aldomain>/riport/)")
        print()
        print("JELSZOVEDELEM (cPanel):")
        print("  Directory Privacy -> a riport/ mappa -> Password protect.")


if __name__ == "__main__":
    main()
