import json
import logging
import time

from app.database import db

logger = logging.getLogger(__name__)

# Maximum age for telemetry history entries (30 days)
_MAX_AGE_SECONDS = 30 * 86400

# Maximum entries to keep per repeater (sanity cap)
_MAX_ENTRIES_PER_REPEATER = 1000


class RepeaterTelemetryRepository:
    @staticmethod
    async def record(
        public_key: str,
        timestamp: int,
        data: dict,
    ) -> None:
        """Insert a telemetry history row and prune stale entries."""
        await db.conn.execute(
            """
            INSERT INTO repeater_telemetry_history
                (public_key, timestamp, data)
            VALUES (?, ?, ?)
            """,
            (public_key, timestamp, json.dumps(data)),
        )

        # Prune entries older than 30 days
        cutoff = int(time.time()) - _MAX_AGE_SECONDS
        await db.conn.execute(
            "DELETE FROM repeater_telemetry_history WHERE public_key = ? AND timestamp < ?",
            (public_key, cutoff),
        )

        # Cap at _MAX_ENTRIES_PER_REPEATER (keep newest)
        await db.conn.execute(
            """
            DELETE FROM repeater_telemetry_history
            WHERE public_key = ? AND id NOT IN (
                SELECT id FROM repeater_telemetry_history
                WHERE public_key = ?
                ORDER BY timestamp DESC
                LIMIT ?
            )
            """,
            (public_key, public_key, _MAX_ENTRIES_PER_REPEATER),
        )

        await db.conn.commit()

    @staticmethod
    async def get_history(public_key: str, since_timestamp: int) -> list[dict]:
        """Return telemetry rows for a repeater since a given timestamp, ordered ASC."""
        cursor = await db.conn.execute(
            """
            SELECT timestamp, data
            FROM repeater_telemetry_history
            WHERE public_key = ? AND timestamp >= ?
            ORDER BY timestamp ASC
            """,
            (public_key, since_timestamp),
        )
        rows = await cursor.fetchall()
        return [
            {
                "timestamp": row["timestamp"],
                "data": json.loads(row["data"]),
            }
            for row in rows
        ]
