"""Costruisce la scaletta delle uscite e la scrive nella tabella `post`.

Tre uscite a settimana, lunedi' mercoledi' venerdi' alle 19. Il peso dei giochi
si alterna: due post di fila dello stesso livello fanno sembrare il canale
monotono, e chi arriva dalla griglia deve capire in tre colpi d'occhio che qui
si parla sia di filler sia di mattoni.

    python3 scaletta.py            mostra la scaletta proposta
    python3 scaletta.py salva      la scrive nel database
"""
import os, sys
from datetime import date, timedelta

QUI = os.path.dirname(os.path.abspath(__file__))
sys.path.insert(0, QUI)
from db import conn
from portale import dati_gioco

GIRO = ["Leggero", "Impegnativo", "Medio", "Cinghiale", "Leggero", "Medio"]
GIORNI = {0: "lunedi", 2: "mercoledi", 4: "venerdi"}


def date_uscita(da, quante):
    """Le date di lunedi', mercoledi' e venerdi' a partire da `da` compreso."""
    fuori, g = [], da
    while len(fuori) < quante:
        if g.weekday() in GIORNI:
            fuori.append(g)
        g += timedelta(days=1)
    return fuori


def candidati():
    """Giochi con almeno tre foto e un editore italiano noto, mai pubblicati."""
    with conn() as c:
        gia = {r[0] for r in c.execute("SELECT bgg_id FROM post")}
        righe = list(c.execute(
            "SELECT bgg_id, nome_archivio, n_foto, peso, etichetta_peso FROM giochi "
            "WHERE n_foto >= 3 AND etichetta_peso IS NOT NULL ORDER BY n_foto DESC, peso"))
    fuori = []
    for r in righe:
        if r["bgg_id"] in gia:
            continue
        d = dati_gioco(r["bgg_id"])
        if d.get("errore") or not d.get("editoreIt"):
            continue
        fuori.append(dict(r) | {"editore": d["editoreIt"],
                                "da_verificare": bool(d.get("editoreItDaVerificare"))})
    return fuori


def proponi(da, quanti):
    """Sceglie i giochi seguendo il giro dei pesi, saltando quelli esauriti."""
    per_peso = {}
    for g in candidati():
        per_peso.setdefault(g["etichetta_peso"], []).append(g)
    scelti, i = [], 0
    for giorno in date_uscita(da, quanti):
        for salto in range(len(GIRO)):
            gruppo = per_peso.get(GIRO[(i + salto) % len(GIRO)]) or []
            if gruppo:
                g = gruppo.pop(0)
                scelti.append((giorno, g))
                i += salto + 1
                break
        else:
            break
    return scelti


if __name__ == "__main__":
    prop = proponi(date(2026, 9, 4), 15)
    for giorno, g in prop:
        segno = "  (editore da verificare)" if g["da_verificare"] else ""
        print(f"{giorno:%a %d %b}  {g['nome_archivio'][:30]:30} {g['etichetta_peso']:12}"
              f" {g['n_foto']} foto  {g['editore']}{segno}")
    if len(sys.argv) > 1 and sys.argv[1] == "salva":
        with conn() as c:
            for giorno, g in prop:
                c.execute("INSERT INTO post (bgg_id, data_prevista, slot, stato) VALUES (?,?,?,?)",
                          (g["bgg_id"], giorno.isoformat(), GIORNI[giorno.weekday()], "da fare"))
        print(f"\nsalvati {len(prop)} post in scaletta")
