"""Peewee SQLite database instance and initialization."""
from peewee import SqliteDatabase

from imptune.config import DB_PATH

# Deferred init — path is set at runtime via init_db() so tests can override DB_PATH
db = SqliteDatabase(None)


def init_db() -> None:
    """Initialize the SQLite database with WAL mode and foreign keys.

    Idempotent — safe to call on every application startup.
    Creates all ORM tables if they do not already exist.

    Closes any existing connection before re-initializing so that test
    fixtures can monkeypatch DB_PATH between test runs.
    """
    from imptune.db.models import Client, Driver, Printer, Icon

    # Re-read DB_PATH each time so tests can patch imptune.config.DB_PATH
    import imptune.config as cfg

    # Close any lingering connection from a previous run (important for tests)
    if not db.is_closed():
        db.close()

    db.init(
        cfg.DB_PATH,
        pragmas={
            "journal_mode": "wal",
            "foreign_keys": 1,
        },
    )
    db.connect(reuse_if_open=True)
    db.create_tables([Client, Driver, Printer, Icon], safe=True)
