import sys
import io
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding="utf-8", errors="replace")

"""
Webshop Automatikus Riport
- Minden éjjel 00:00: lehúzza az aznapi adatokat -> SQLite
- Hétfőn reggel: elkészíti az Excel riportot + megnyitja Outlookot küldésre
"""

import sqlite3
import os
import sys
from datetime import datetime, timedelta
from collections import defaultdict

try:
    from config import *
except ImportError:
    print("HIBA: Hiányzik a config.py!")
    sys.exit(1)

import requests
import xml.etree.ElementTree as ET

DB_PATH = os.path.join(os.path.dirname(__file__), "webshop_adatok.db")
RIPORT_DIR = os.path.join(os.path.dirname(__file__), "riportok")

# Kizart Shoprenter statuszok (torolt/sikertelen rendelesek)
# 8=Elutasitva, 10=Sikertelen, 11=Visszafizetve, 12=Visszakuldve, 14=Torolt, 15=Sikertelen bankkartyas
KIZART_STATUSZOK = {8, 10, 11, 12, 14, 15}

def get_status_id_from_href(href):
    import base64
    try:
        b64 = href.rstrip("/").split("/")[-1]
        decoded = base64.b64decode(b64 + "==").decode()
        return int(decoded.split("=")[-1])
    except:
        return None


# ============================================================
# ADATBÁZIS
# ============================================================

def init_db():
    os.makedirs(RIPORT_DIR, exist_ok=True)
    con = sqlite3.connect(DB_PATH)
    con.execute("""
        CREATE TABLE IF NOT EXISTS napi_adatok (
            datum TEXT NOT NULL,
            forras TEXT NOT NULL,
            osszeg REAL NOT NULL DEFAULT 0,
            PRIMARY KEY (datum, forras)
        )
    """)
    con.commit()
    return con


def save_day(con, datum, forras, osszeg, force=False):
    """Ment napi forgalmi adatot a DB-be.

    Vedelem alaperteleemzesben:
    - Ha mar van adat es az uj ertek alacsonyabb -> NEM ir felul (megorzi)
    - Ha mar van adat es az uj ertek 0 -> NEM ir felul
    - Force=True esetn megserul (csak manualis javitasokhoz)
    """
    existing = con.execute(
        "SELECT osszeg FROM napi_adatok WHERE datum=? AND forras=?",
        (datum, forras)
    ).fetchone()
    if existing and not force:
        meglevo = existing[0] or 0
        # 0 felulirashoz megorizzunk
        if meglevo > 0 and osszeg == 0:
            return
        # Alacsonyabb felulirashoz megorizzunk
        if meglevo > 0 and osszeg < meglevo:
            return
    con.execute(
        "INSERT OR REPLACE INTO napi_adatok (datum, forras, osszeg) VALUES (?, ?, ?)",
        (datum, forras, osszeg)
    )
    con.commit()


def has_data(con, datum, forras):
    """Van-e mar adat erre a napra/forrasra (akar 0 ertekkel is)?"""
    row = con.execute(
        "SELECT 1 FROM napi_adatok WHERE datum=? AND forras=?",
        (datum, forras)
    ).fetchone()
    return row is not None


def get_range(con, date_from, date_to):
    rows = con.execute(
        "SELECT datum, forras, osszeg FROM napi_adatok WHERE datum BETWEEN ? AND ? ORDER BY datum",
        (date_from, date_to)
    ).fetchall()
    unas, shop = defaultdict(float), defaultdict(float)
    for datum, forras, osszeg in rows:
        if forras == "unas":
            unas[datum] = osszeg
        else:
            shop[datum] = osszeg
    return dict(unas), dict(shop)


# ============================================================
# UNAS API
# ============================================================

def unas_login():
    payload = f"""<?xml version="1.0" encoding="UTF-8"?>
<Params><ApiKey>{UNAS_API_KEY}</ApiKey></Params>"""
    r = requests.post("https://api.unas.eu/shop/login",
                      data=payload.encode(), headers={"Content-Type": "application/xml"}, timeout=30)
    token = ET.fromstring(r.text).findtext("Token")
    if not token:
        raise Exception(f"Unas login hiba: {r.text[:200]}")
    return token


def unas_find_total(token):
    """Megkeresi hány rendelés van összesen bináris kereséssel"""
    def check(start):
        p = f"""<?xml version="1.0" encoding="UTF-8"?>
<Params><StatusGroup>all</StatusGroup><LimitNum>1</LimitNum><LimitStart>{start}</LimitStart></Params>"""
        r = requests.post("https://api.unas.eu/shop/getOrder",
                          data=p.encode(),
                          headers={"Content-Type": "application/xml",
                                   "Authorization": f"Bearer {token}"},
                          timeout=30)
        return len(ET.fromstring(r.text).findall(".//Order")) > 0
    lo, hi = 10000, 100000
    while lo < hi - 50:
        mid = (lo + hi) // 2
        if check(mid):
            lo = mid
        else:
            hi = mid
    return lo

def unas_napi_osszeg(token, datum):
    """Egy napi UNAS osszeg - rate-limit-tudo retry-vel.

    Ha api hiba ALL probaltakozas utan -> raise Exception (a hivo eldonti)
    Ha api OK + 0 rendeles -> return 0.0
    """
    import time as _time
    def get_orders(start, num=200, retries=5):
        p = f"""<?xml version="1.0" encoding="UTF-8"?>
<Params><StatusGroup>all</StatusGroup><LimitNum>{num}</LimitNum><LimitStart>{start}</LimitStart></Params>"""
        last_err = None
        for attempt in range(retries):
            try:
                r = requests.post("https://api.unas.eu/shop/getOrder",
                                  data=p.encode(),
                                  headers={"Content-Type": "application/xml",
                                           "Authorization": f"Bearer {token}"},
                                  timeout=60)
                if r.status_code == 429:
                    _time.sleep(5 + attempt * 3)
                    continue
                if r.status_code >= 500:
                    _time.sleep(3 + attempt * 2)
                    continue
                return ET.fromstring(r.text).findall(".//Order")
            except Exception as e:
                last_err = e
                _time.sleep(2 + attempt * 2)
        raise RuntimeError(f"Unas API hiba {retries} probaltakozas utan (start={start}): {last_err}")

    # Bináris keresés - megkeressük hol van a datum
    lo, hi = 0, 20000
    while lo < hi - 200:
        mid = (lo + hi) // 2
        ords = get_orders(mid, 1)
        if not ords:
            hi = mid
            continue
        d = (ords[0].findtext("Date", "") or "")[:10].replace(".", "-")
        if d < datum:
            lo = mid
        else:
            hi = mid

    # lo korul vannak az aznapi rendelesek - 400-at kérünk le
    orders = get_orders(max(0, lo - 100), 400)

    total = 0.0
    for o in orders:
        raw = (o.findtext("Date", "") or "")[:10].replace(".", "-")
        if raw != datum:
            continue
        statusz = (o.findtext("Status") or "").strip()
        if statusz == "Törölve":
            continue
        total += float(o.findtext("SumPriceGross", "0") or 0)

    return total


def shoprenter_napi_osszeg(datum):
    """Egy napi SHOPRENTER osszeg - rate-limit-tudo retry-vel.

    Ha api hiba ALL probaltakozas utan -> raise Exception (a hivo eldonti)
    Ha api OK + 0 rendeles -> return 0.0
    """
    base_url = SHOPRENTER_API_URL.rstrip("/")
    auth = (SHOPRENTER_API_USER, SHOPRENTER_API_PASSWORD)
    total = 0.0
    import time

    def get_page(page, retries=6):
        last_err = None
        for attempt in range(retries):
            try:
                r = requests.get(f"{base_url}/orders", auth=auth,
                                 headers={"Accept": "application/json"},
                                 params={"page": page, "limit": 25, "full": 1}, timeout=30)
                if r.status_code == 429:
                    time.sleep(5 + attempt * 3)
                    continue
                if r.status_code >= 500:
                    time.sleep(3 + attempt * 2)
                    continue
                if r.status_code != 200:
                    last_err = f"HTTP {r.status_code}"
                    time.sleep(2 + attempt)
                    continue
                return r.json().get("items", [])
            except Exception as e:
                last_err = e
                time.sleep(2 + attempt * 2)
        raise RuntimeError(f"Shoprenter API hiba {retries} probaltakozas utan (page={page}): {last_err}")

    # page_count retry-vel
    last_err = None
    for attempt in range(6):
        try:
            r0 = requests.get(f"{base_url}/orders", auth=auth,
                              headers={"Accept": "application/json"},
                              params={"page": 0, "limit": 25, "full": 1}, timeout=30)
            if r0.status_code == 429:
                time.sleep(5 + attempt * 3)
                continue
            page_count = int(r0.json().get("pageCount", 1) or 1)
            break
        except Exception as e:
            last_err = e
            time.sleep(2 + attempt * 2)
    else:
        raise RuntimeError(f"Shoprenter pageCount lekerdezhetelen: {last_err}")

    # Binarid kereses - ugyanugy mint a debug
    lo, hi = 0, page_count - 1
    target_page = None
    while lo <= hi:
        mid = (lo + hi) // 2
        items = get_page(mid)
        if not items:
            break
        dates = [(o.get("dateCreated") or "")[:10] for o in items if o.get("dateCreated")]
        if not dates:
            break
        min_d, max_d = min(dates), max(dates)
        if max_d < datum:
            lo = mid + 1
        elif min_d > datum:
            hi = mid - 1
        else:
            target_page = mid
            break

    if target_page is None:
        return 0.0

    # +-10 oldal - ugyanugy mint a debug
    for pg in range(max(0, target_page - 10), min(page_count, target_page + 11)):
        items = get_page(pg)
        for o in items:
            date_str = (o.get("dateCreated") or "")[:10]
            if date_str != datum:
                continue
            st = o.get("orderStatus")
            status_href = st.get("href", "") if isinstance(st, dict) else ""
            status_id = get_status_id_from_href(status_href)
            if status_id is None or status_id in KIZART_STATUSZOK:
                continue
            total += float(o.get("total", 0) or 0)

    return total


# ============================================================
# NAPI ADATGYŰJTÉS
# ============================================================

def napi_gyujtes(datum=None, force=False):
    """Biztonsagos napi gyujtes.

    Alapertelmezesben az utolso 7 napot vegigvizsgalja:
    - Ha mar van adat (>= 0) erre a napra es forrasra -> SKIP (mar lefutott)
    - Ha nincs adat -> API-tol lekeri, csak SIKERES lekereskor ir DB-be
    - API hiba eseten NEM ir 0-t, kovetkezo napon ujraprobal

    Igy egy nap egyszer lesz API-bol lekerve, es onnantol a DB-ben rogzul.
    Reszleges API-hibak nem ronthatjak el a regi adatokat.

    Hasznalat:
      napi_gyujtes()                         -> utolso 7 nap, csak hianyzo
      napi_gyujtes(datum='2026-06-01')       -> egyetlen nap, csak hianyzo
      napi_gyujtes(datum='2026-06-01', force=True) -> kenyszeritett ujragyujtes
    """
    if datum is None:
        # Utolso 7 nap (1 hetes ablak hogy hibazas eseten legyen ido javitani)
        napok = [(datetime.today() - timedelta(days=i)).strftime("%Y-%m-%d") for i in range(1, 8)]
    else:
        napok = [datum]

    con = init_db()
    token = None  # csak akkor logolunk be ha kell

    for d in napok:
        unas_megvan = has_data(con, d, "unas")
        shop_megvan = has_data(con, d, "shoprenter")

        # Ha mindketto megvan es nem force -> skip
        if unas_megvan and shop_megvan and not force:
            continue

        print(f"\n[>] Napi adatgyűjtés: {d}")
        if force:
            print(f"   [FORCE] Kenyszeritett ujragyujtes")

        # Unas
        if not unas_megvan or force:
            try:
                if token is None:
                    token = unas_login()
                unas_osszeg = unas_napi_osszeg(token, d)
                save_day(con, d, "unas", unas_osszeg, force=force)
                print(f"   [OK] Unas: {unas_osszeg:,.0f} Ft")
            except Exception as e:
                # NEM irunk 0-t! A kov nap ujraprobalja.
                print(f"   [!!] Unas hiba ({d}): {e} - NEM irunk be, holnap ujraprobalja")
        else:
            print(f"   [SKIP] Unas: mar van adat")

        # Shoprenter
        if not shop_megvan or force:
            try:
                shop_osszeg = shoprenter_napi_osszeg(d)
                save_day(con, d, "shoprenter", shop_osszeg, force=force)
                print(f"   [OK] Shoprenter: {shop_osszeg:,.0f} Ft")
            except Exception as e:
                # NEM irunk 0-t! A kov nap ujraprobalja.
                print(f"   [!!] Shoprenter hiba ({d}): {e} - NEM irunk be, holnap ujraprobalja")
        else:
            print(f"   [SKIP] Shoprenter: mar van adat")

    con.close()


# ============================================================
# EXCEL + OUTLOOK (HÉTFŐN)
# ============================================================

def hetfoi_riport():
    try:
        from webshop_riport_uj import generate_excel
    except Exception as e:
        print("\n[!] webshop_riport_uj IMPORT HIBA -> heti Excel riport KIHAGYVA.")
        print(f"    Hiba tipus: {type(e).__name__}")
        print(f"    Hiba szoveg: {e}")
        import os as _os
        print(f"    Munkamappa: {_os.getcwd()}")
        try:
            files = sorted(_os.listdir(_os.getcwd()))
            relevant = [f for f in files if 'riport' in f.lower() or 'webshop' in f.lower()]
            print(f"    Relevans fajlok: {relevant}")
        except Exception:
            pass
        return

    today = datetime.today()
    date_to = (today - timedelta(days=1)).strftime("%Y-%m-%d")
    date_from = "2023-01-01"  # teljes torteneti adatok

    print(f"\n[XL] Riport keszitese: {date_from} - {date_to}")

    con = init_db()
    unas_data, shop_data = get_range(con, date_from, date_to)
    con.close()

    print(f"   Unas napok: {len(unas_data)}, Shoprenter: {len(shop_data)}")

    filename = f"webshop_riport_{date_from}_{date_to}.xlsx"
    output_path = os.path.join(RIPORT_DIR, filename)
    generate_excel(unas_data, shop_data, date_from, date_to, output_path)

    # Masolat a fo mappaba is (mindig felulirja)
    import shutil
    fo_mappa = os.path.dirname(os.path.abspath(__file__))
    aktualis_path = os.path.join(fo_mappa, "webshop_riport_AKTUALIS.xlsx")
    try:
        shutil.copy2(output_path, aktualis_path)
        print(f"   [OK] Masolat: webshop_riport_AKTUALIS.xlsx")
    except Exception as e:
        print(f"   [!!] Masolas hiba: {e}")

    abs_path = os.path.abspath(output_path)
    subject = f"Webshop Heti Riport - {date_from} / {date_to}"
    body = f"Kedves Ugyfelunk!`n`nMellekelem a heti riportot ({date_from} - {date_to}).`n`nUdvozlettel,`n{FELADO_NEV}"

    # Outlook + PowerShell csak Windowson elerheto
    import platform
    if platform.system() != "Windows":
        print(f"   [i] Linuxon - Outlook helyett SMTP-vel probaljuk az emailt.")
        try:
            from email_kuldes import send_excel_email
            ok, info = send_excel_email(abs_path, date_from, date_to)
            print(f"   [{'OK' if ok else '!!'}] SMTP: {info}")
        except Exception as e:
            print(f"   [!!] SMTP modul hiba: {e}")
        return

    ps_lines = [
        "$outlook = New-Object -ComObject Outlook.Application",
        "$mail = $outlook.CreateItem(0)",
        f'$mail.To = "{UGYFEL_EMAIL}"',
        f'$mail.Subject = "{subject}"',
        f'$mail.Body = "{body}"',
        f'$mail.Attachments.Add("{abs_path}")',
        "$mail.Display()",
        'Write-Host "Email megnyitva - csak Send kell!"',
    ]
    ps_script = "\r\n".join(ps_lines)

    ps_path = os.path.join(RIPORT_DIR, "kuldes.ps1")
    with open(ps_path, "w", encoding="utf-8-sig") as f:
        f.write(ps_script)

    print(f"   [@] PS script: {ps_path}")

    try:
        import subprocess
        subprocess.Popen(["powershell", "-ExecutionPolicy", "Bypass", "-File", ps_path])
        print("   [OK] Outlook megnyilt - csak Send kell!")
    except Exception as e:
        print(f"   [i] Hiba: {e}")


# ============================================================
# FŐPROGRAM
# ============================================================

def honap_ujraszamolas():
    """Minden ho 1-jen: az elozo honap adatait ujra lehuzza es felulirja a DB-ben"""
    ma = datetime.today()
    elso = ma.replace(day=1)
    ho_vege = elso - timedelta(days=1)
    ho_eleje = ho_vege.replace(day=1)
    date_from = ho_eleje.strftime("%Y-%m-%d")
    date_to = ho_vege.strftime("%Y-%m-%d")

    print(f"\n[H1] Havi ujraszamolas: {date_from} - {date_to}")
    con = init_db()

    # Unas
    try:
        token = unas_login()
        total_count = unas_find_total(token)
        start = max(0, total_count - 1000)

        def get_unas_page(s, num=1000):
            p = f"""<?xml version="1.0" encoding="UTF-8"?>
<Params><StatusGroup>all</StatusGroup><LimitNum>{num}</LimitNum><LimitStart>{s}</LimitStart></Params>"""
            r = requests.post("https://api.unas.eu/shop/getOrder",
                              data=p.encode(),
                              headers={"Content-Type": "application/xml",
                                       "Authorization": f"Bearer {token}"},
                              timeout=120)
            return ET.fromstring(r.text).findall(".//Order")

        daily_unas = defaultdict(float)
        while start >= 0:
            orders = get_unas_page(start)
            if not orders:
                break
            for o in orders:
                raw = o.findtext("Date", "")[:10].replace(".", "-")
                if raw < date_from:
                    start = -1
                    break
                if date_from <= raw <= date_to:
                    statusz = (o.findtext("Status") or "").strip()
                    if statusz == "Torölve":
                        continue
                    daily_unas[raw] += float(o.findtext("SumPriceGross", "0") or 0)
            if start > 0:
                start -= 1000
            else:
                break

        d = ho_eleje
        while d <= ho_vege:
            ds = d.strftime("%Y-%m-%d")
            uj = daily_unas.get(ds, 0)
            meglevo = con.execute(
                "SELECT osszeg FROM napi_adatok WHERE datum=? AND forras='unas'", (ds,)
            ).fetchone()
            meglevo_val = meglevo[0] if meglevo else 0
            if uj >= meglevo_val or meglevo_val == 0:
                save_day(con, ds, "unas", uj)
            else:
                print(f"   [SKIP] {ds}: uj={uj:,.0f} < meglevo={meglevo_val:,.0f} (megorizzuk)")
            d += timedelta(days=1)
        print(f"   [OK] Unas: {sum(daily_unas.values()):,.0f} Ft (havi)")
    except Exception as e:
        print(f"   [!!] Unas hiba: {e} - havi adatokat NEM irjuk felul")

    # Shoprenter
    # FONTOS: rate-limit-tudo retry. Ha valamelyik oldal vegleg sikertelen,
    # ABORTALJUK az egesz havi ujraszamolast, hogy NE irjunk felul reszleges
    # adattal valos napi totalokat.
    abort_havi = False
    try:
        import time as _time
        base_url = SHOPRENTER_API_URL.rstrip("/")
        auth = (SHOPRENTER_API_USER, SHOPRENTER_API_PASSWORD)
        daily_shop = defaultdict(float)

        def _shop_get_page(page, retries=6):
            for attempt in range(retries):
                try:
                    rr = requests.get(f"{base_url}/orders", auth=auth,
                                     headers={"Accept": "application/json"},
                                     params={"page": page, "limit": 25, "full": 1}, timeout=30)
                    if rr.status_code == 429:
                        _time.sleep(5 + attempt * 3)
                        continue
                    if rr.status_code != 200:
                        _time.sleep(2 + attempt)
                        continue
                    return rr.json()
                except Exception:
                    _time.sleep(2 + attempt)
            raise RuntimeError(f"Shoprenter /orders page={page} sikertelen {retries} probaltakozas utan")

        j0 = _shop_get_page(0)
        page_count = int(j0.get("pageCount", 1) or 1)

        for page in range(page_count - 1, -1, -1):
            j = _shop_get_page(page)
            items = j.get("items", [])
            if not items:
                break
            stop = False
            for o in items:
                date_str = (o.get("dateCreated") or "")[:10]
                if not date_str:
                    continue
                if date_str < date_from:
                    stop = True
                    break
                if date_from <= date_str <= date_to:
                    st = o.get("orderStatus")
                    status_href = st.get("href", "") if isinstance(st, dict) else ""
                    status_id = get_status_id_from_href(status_href)
                    if status_id is None or status_id in KIZART_STATUSZOK:
                        continue
                    daily_shop[date_str] += float(o.get("total", 0) or 0)
            if stop:
                break

        d = ho_eleje
        while d <= ho_vege:
            ds = d.strftime("%Y-%m-%d")
            uj = daily_shop.get(ds, 0)
            # Csak akkor irjuk felul, ha az uj ertek >= meglevo
            # (igy reszleges feldolgozas miatti ALACSONYABB ertek nem rontja a korrekt adatot)
            meglevo = con.execute(
                "SELECT osszeg FROM napi_adatok WHERE datum=? AND forras='shoprenter'", (ds,)
            ).fetchone()
            meglevo_val = meglevo[0] if meglevo else 0
            if uj >= meglevo_val or meglevo_val == 0:
                save_day(con, ds, "shoprenter", uj)
            else:
                print(f"   [SKIP] {ds}: uj={uj:,.0f} < meglevo={meglevo_val:,.0f} (megorizzuk)")
            d += timedelta(days=1)
        print(f"   [OK] Shoprenter: {sum(daily_shop.values()):,.0f} Ft (havi)")
    except Exception as e:
        print(f"   [!!] Shoprenter hiba: {e} - havi adatokat NEM irjuk felul")
        abort_havi = True

    con.close()
    print(f"   [OK] Havi ujraszamolas kesz: {date_from} - {date_to}")


def anomalia_ellenorzes():
    """Vizsgalja az utolso 14 napot, jelez ha furcsa.

    Eseten:
    - Hianyzo napi adat (mar > 1 napja eltelt es nincs DB sor) -> warn
    - Egy nap forgalma > 70%-kal alacsonyabb mint az elozo 7 nap atlaga -> warn
    """
    con = init_db()
    ma = datetime.today().date()
    panaszok = []

    for i in range(2, 15):  # 2-14 nap (1 nap meg nem biztos hogy lefutott)
        d = (ma - timedelta(days=i)).strftime("%Y-%m-%d")
        for forras in ("unas", "shoprenter"):
            row = con.execute(
                "SELECT osszeg FROM napi_adatok WHERE datum=? AND forras=?", (d, forras)
            ).fetchone()
            if not row:
                panaszok.append(f"  [HIANYZIK] {d} {forras}: nincs adat (API hiba lehetett)")

    # Furcsa drop ellenorzes
    rows = con.execute(
        "SELECT datum, forras, osszeg FROM napi_adatok WHERE datum >= ? ORDER BY datum",
        ((ma - timedelta(days=21)).strftime("%Y-%m-%d"),)
    ).fetchall()
    by_src = defaultdict(list)
    for dat, fr, oss in rows:
        by_src[fr].append((dat, oss or 0))
    for fr, lst in by_src.items():
        lst.sort()
        for i in range(7, len(lst)):
            atlag7 = sum(x[1] for x in lst[i-7:i]) / 7
            if atlag7 > 5000 and lst[i][1] < atlag7 * 0.3:
                # Hetkoznap?
                dat = datetime.strptime(lst[i][0], "%Y-%m-%d")
                if dat.weekday() < 5:  # H-P
                    panaszok.append(f"  [FURCSA DROP] {lst[i][0]} {fr}: {lst[i][1]:,.0f} Ft vs 7-napos atlag {atlag7:,.0f} Ft")

    con.close()

    if panaszok:
        print("\n[!] ANOMALIA-FIGYELMEZTETES (utolso 14 nap):")
        for p in panaszok:
            print(p)
        print("  -> Erdemes manualisan futtatni: webshop_auto.py --force-day YYYY-MM-DD")
        return panaszok
    return []


def main():
    ma = datetime.today()
    teszt_mod = "--teszt" in sys.argv
    print(f"[T] Futás ideje: {ma.strftime('%Y-%m-%d %H:%M')}")
    if teszt_mod:
        print("    [TESZT MOD - riport most generálodik]")

    # CLI: --force-day YYYY-MM-DD (kenyszeritett egy-napos ujragyujtes)
    if "--force-day" in sys.argv:
        idx = sys.argv.index("--force-day")
        if idx + 1 < len(sys.argv):
            datum = sys.argv[idx + 1]
            print(f"[FORCE] Egy nap kenyszeritett ujragyujtese: {datum}")
            napi_gyujtes(datum=datum, force=True)
            return
        else:
            print("HIBA: --force-day utan datum kell (YYYY-MM-DD)")
            sys.exit(1)

    # CLI: --ujraszamolas-honap YYYY-MM (manualis havi ujraszamolas - csak manualis!)
    if "--ujraszamolas-honap" in sys.argv:
        idx = sys.argv.index("--ujraszamolas-honap")
        if idx + 1 < len(sys.argv):
            print(f"[!] Havi ujraszamolas: {sys.argv[idx+1]}")
            print("   (megj: a kov hibavedett save_day-jel mukodik, csak felfele ir)")
            honap_ujraszamolas()
            return

    # Normal napi gyujtes: csak hianyzo napokat (utolso 7 nap ablakon)
    napi_gyujtes()

    # HONAP_UJRASZAMOLAS NINCS AUTOMATIKUS! Regen ez itt futott minden ho 1-jen,
    # de API rate-limit reszleges hibai miatt regen jo adatokat ronthatott el.
    # Mostantol csak manualisan: webshop_auto.py --ujraszamolas-honap 2026-05

    # Anomalia-ellenorzes
    anomalia_ellenorzes()

    if ma.weekday() == 0 or teszt_mod:
        print("\n[H] Riport keszitese...")
        hetfoi_riport()
    else:
        nap_nev = ["Hetfo","Kedd","Szerda","Csutortok","Pentek","Szombat","Vasarnap"][ma.weekday()]
        print(f"\n   [i]  Ma {nap_nev} – riport csak hetfon megy ki.")
        print(f"   [i]  Teszt: python webshop_auto.py --teszt")


if __name__ == "__main__":
    main()
