# state.py
"""Лёгкий sqlite-дедуп: показанные посты (TG/Reddit) и виденные RSS-ссылки."""
import sqlite3
from datetime import datetime, timezone
from pathlib import Path
from typing import List, Optional

SCHEMA = """
CREATE TABLE IF NOT EXISTS seen_posts (
    post_id TEXT PRIMARY KEY,
    seen_at TEXT NOT NULL
);
CREATE TABLE IF NOT EXISTS seen_entries (
    link TEXT PRIMARY KEY,
    first_seen TEXT NOT NULL
);
"""


def _now():
    return datetime.now(timezone.utc).isoformat()


def connect(db_path) -> sqlite3.Connection:
    Path(db_path).parent.mkdir(parents=True, exist_ok=True)
    con = sqlite3.connect(str(db_path))
    con.row_factory = sqlite3.Row
    con.executescript(SCHEMA)
    con.commit()
    return con


def was_seen_post(con, post_id: str) -> bool:
    row = con.execute("SELECT 1 FROM seen_posts WHERE post_id=?", (post_id,)).fetchone()
    return row is not None


def mark_posts_seen(con, post_ids: List[str], at: Optional[str] = None) -> None:
    at = at or _now()
    con.executemany("INSERT OR IGNORE INTO seen_posts (post_id, seen_at) VALUES (?,?)",
                    [(p, at) for p in post_ids])
    con.commit()


def new_entries(con, records: List[dict]) -> List[dict]:
    at = _now()
    out = []
    for r in records:
        cur = con.execute("INSERT OR IGNORE INTO seen_entries (link, first_seen) VALUES (?,?)",
                          (r["link"], at))
        if cur.rowcount:
            out.append(r)
    con.commit()
    return out
