"""Database locale del progetto @bg_perspective.

Tiene le cose che nessun'altra fonte sa: quale edizione possiede Paolo, come
contattare gli editori, cosa e' gia' stato pubblicato. I dati che vengono dal
portale non si duplicano qui, si rileggono da li'.

Sta sotto Documents e non nello scratchpad: /tmp si svuota a ogni riavvio del
Mac, e ci abbiamo gia' perso il lavoro due volte.

    python3 db.py init       crea le tabelle
    python3 db.py stato      cosa c'e' dentro
    python3 db.py editori    elenco completo degli editori
"""
import os, sqlite3, sys

QUI = os.path.dirname(os.path.abspath(__file__))
FILE = os.path.join(os.path.dirname(QUI), "dati", "bgp.sqlite")

SCHEMA = """
CREATE TABLE IF NOT EXISTS giochi (
  bgg_id            INTEGER PRIMARY KEY,
  nome_archivio     TEXT NOT NULL,      -- come si chiamano i file delle foto
  nome_portale      TEXT,
  titolo_copertina  TEXT,               -- quello che finisce stampato, deciso a mano
  edizione          TEXT,               -- italiana | internazionale | inglese
  testo_nel_gioco   TEXT,               -- nessuno | italiano | inglese
  editore_scatola   TEXT,               -- l'editore della scatola che Paolo ha
  n_foto            INTEGER,
  peso              REAL,
  etichetta_peso    TEXT,
  verificato_il     TEXT,
  note              TEXT
);

CREATE TABLE IF NOT EXISTS editori (
  nome              TEXT PRIMARY KEY,
  instagram         TEXT,               -- handle senza @, minuscolo
  hashtag           TEXT,
  email             TEXT,
  contatto          TEXT,               -- come si contattano se manca la mail
  sito              TEXT,
  italiano          INTEGER DEFAULT 1,
  fonte             TEXT,               -- da dove viene il dato
  verificato_il     TEXT,
  note              TEXT
);

CREATE TABLE IF NOT EXISTS post (
  id                INTEGER PRIMARY KEY AUTOINCREMENT,
  bgg_id            INTEGER REFERENCES giochi(bgg_id),
  data_prevista     TEXT,
  data_uscita       TEXT,
  slot              TEXT,               -- lunedi | mercoledi | venerdi
  n_slide           INTEGER,
  cta               TEXT,
  foto_usate        TEXT,               -- json della lista
  stato             TEXT DEFAULT 'da fare',   -- da fare | pronto | pubblicato
  note              TEXT
);

CREATE INDEX IF NOT EXISTS idx_post_gioco ON post(bgg_id);
CREATE INDEX IF NOT EXISTS idx_post_stato ON post(stato);
"""


def conn():
    c = sqlite3.connect(FILE)
    c.row_factory = sqlite3.Row
    return c


def init():
    with conn() as c:
        c.executescript(SCHEMA)
    print(f"database pronto: {FILE}")


def aggiungi_editore(c, nome, instagram=None, email=None, contatto=None,
                     sito=None, italiano=1, fonte=None, note=None):
    """Non sovrascrive un dato gia' presente con un NULL: le fonti si sommano."""
    ig = instagram.strip().lstrip("@").lower() if instagram else None
    tag = ig.replace("_", "").replace(".", "") if ig else None
    c.execute("""
      INSERT INTO editori (nome, instagram, hashtag, email, contatto, sito, italiano, fonte, note)
      VALUES (?,?,?,?,?,?,?,?,?)
      ON CONFLICT(nome) DO UPDATE SET
        instagram = COALESCE(excluded.instagram, editori.instagram),
        hashtag   = COALESCE(excluded.hashtag,   editori.hashtag),
        email     = COALESCE(excluded.email,     editori.email),
        contatto  = COALESCE(excluded.contatto,  editori.contatto),
        sito      = COALESCE(excluded.sito,      editori.sito),
        fonte     = COALESCE(editori.fonte, excluded.fonte)
    """, (nome, ig, tag, email, contatto, sito, italiano, fonte, note))


def editori():
    with conn() as c:
        for r in c.execute("SELECT * FROM editori ORDER BY nome"):
            print(f"  {r['nome'][:24]:24} @{(r['instagram'] or '-'):26} "
                  f"{(r['email'] or r['contatto'] or '-')[:34]:34} {r['fonte'] or ''}")


def stato():
    with conn() as c:
        for t in ("giochi", "editori", "post"):
            n = c.execute(f"SELECT count(*) FROM {t}").fetchone()[0]
            print(f"  {t:9} {n:>5}")
        for etichetta, dove in (("senza handle Instagram", "instagram IS NULL"),
                                ("senza email", "email IS NULL")):
            n = c.execute(f"SELECT count(*) FROM editori WHERE {dove}").fetchone()[0]
            print(f"  editori {etichetta}: {n}")


if __name__ == "__main__":
    cmd = sys.argv[1] if len(sys.argv) > 1 else "stato"
    {"init": init, "stato": stato, "editori": editori}.get(cmd, stato)()
