import json

from lib.api.trakt.base_cache import connect_database


class Paginator:
    def __init__(self, page_size=10):
        self.page_size = page_size
        self.total_pages = 0
        self.current_page = 0

    def _connect(self):
        return connect_database(database_name="paginator_db")

    def _store_page(self, page_number, total_pages, data):
        conn = self._connect()
        cursor = conn.cursor()
        cursor.execute(
            """
            INSERT OR REPLACE INTO paginated_data (id, page_number, data, total_pages)
            VALUES (?, ?, ?, ?)
        """,
            (f"page_{page_number}", page_number, json.dumps(data), total_pages),
        )
        conn.commit()
        conn.close()

    def _retrieve_page(self, page_number):
        conn = self._connect()
        cursor = conn.cursor()
        cursor.execute(
            """
            SELECT data FROM paginated_data WHERE page_number = ?
        """,
            (page_number,),
        )
        result = cursor.fetchone()
        conn.close()
        if result and result[0] is not None:
            return json.loads(result[0])
        return None

    def _clear_table(self):
        conn = self._connect()
        cursor = conn.cursor()
        cursor.execute("DELETE FROM paginated_data")
        conn.commit()
        conn.close()

    def initialize(self, data):
        self._clear_table()
        self.total_pages = (len(data) + self.page_size - 1) // self.page_size
        for i in range(self.total_pages):
            start = i * self.page_size
            end = start + self.page_size
            page_data = data[start:end]
            self._store_page(i + 1, self.total_pages, page_data)

    def get_page(self, page_number):
        self.current_page = page_number - 1
        data = self._retrieve_page(page_number)
        if data is None:
            raise IndexError(f"Page number not found in database: Requested page {page_number}")
        return data

    def next_page(self):
        """Move to the next page."""
        if self.current_page < self.total_pages - 1:
            self.current_page += 1
        return self.get_page(self.current_page + 1)

    def previous_page(self):
        """Move to the previous page."""
        if self.current_page > 0:
            self.current_page -= 1
        return self.get_page(self.current_page + 1)

    def current_page_data(self):
        """Get the data for the current page."""
        return self.get_page(self.current_page + 1)


paginator_db = Paginator()
