import os
import pickle

import xbmcvfs

from lib.jacktook.utils import kodilog
from lib.utils.kodi.utils import ADDON_ID


class PickleDatabase:
    def __init__(self):
        BASE_DATABASE = {
            "jt:watch": {},
            "jt:lth": {},
            "jt:lfh": {},
            "jt:lib": {},
        }

        data_dir = xbmcvfs.translatePath(os.path.join("special://profile/addon_data/", ADDON_ID))
        self._database_path = os.path.join(data_dir, "database.pickle")
        xbmcvfs.mkdirs(data_dir)

        try:
            if os.path.exists(self._database_path):
                with open(self._database_path, "rb") as f:
                    database = pickle.load(f)
            else:
                database = {}
        except Exception as e:
            kodilog(f"Failed to load database: {e}")
            database = {}

        self._database = {**BASE_DATABASE, **database}
        self.addon_xml_path = xbmcvfs.translatePath(
            os.path.join("special://home/addons/", ADDON_ID, "addon.xml")
        )

    def set_item(self, key: str, subkey: str, value, commit: bool = True):
        self._database[key][subkey] = value
        if commit:
            self.commit()

    def get_item(self, key: str, subkey: str):
        return self._database[key].get(subkey, None)

    def delete_item(self, key: str, subkey: str, commit: bool = True):
        try:
            if subkey in self._database[key]:
                del self._database[key][subkey]
                if commit:
                    self.commit()
        except KeyError:
            pass

    def set_key(self, key: str, value, commit: bool = True):
        self._database[key] = value
        if commit:
            self.commit()

    def get_key(self, key: str):
        return self._database[key]

    def commit(self):
        try:
            with open(self._database_path, "wb") as f:
                pickle.dump(self._database, f)
        except Exception as e:
            kodilog(f"Failed to save database: {e}")

    @property
    def database(self):
        """Expose internal database dict as read-only property."""
        return self._database
