# -*- coding: utf-8 -*-
import os
import json
import logging
from collections import OrderedDict

import irc3
from dotenv import load_dotenv

MODULE = __name__


# TODO: ddg
class Bot(irc3.IrcBot):
    DEV = 'BOT_DEV' in os.environ
    REPO_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
    CONFIG_DIR = REPO_DIR if DEV else os.path.dirname(REPO_DIR)

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.cfg_file = None
        self.env_file = None

    def load_config(self):
        with open(self.cfg_file, 'r') as fp:
            return json.load(fp, object_pairs_hook=OrderedDict)

    def save_config(self, data):
        with open(self.cfg_file, 'w') as fp:
            json.dump(data, fp, indent=2)

    @classmethod
    def from_json(cls, cfg_file: str = 'config.json', env_file: str = '.env'):
        cfg_file = os.path.join(cls.CONFIG_DIR, cfg_file)
        env_file = os.path.join(cls.CONFIG_DIR, env_file)

        load_dotenv(env_file)

        with open(cfg_file, 'r') as fp:
            conf = json.load(fp)

        if cls.DEV:
            conf['debug'] = True

        bot = cls.from_config(conf)
        bot.cfg_file = cfg_file
        bot.env_file = env_file
        return bot


@irc3.plugin
class BasePlugin:
    requires = ['irc3.plugins.command']

    def __init__(self, bot: Bot):
        self.bot = bot
        self.log = logging.getLogger('irc3.{}'.format(self.__class__.__name__.lower()))


class Plugin(BasePlugin):
    @classmethod
    def reload(cls, old: BasePlugin):
        return cls(old.bot)


from .storage import Storage  # noqa


class DatabasePlugin(Plugin):
    requires = Plugin.requires + ['bot.storage']

    def __init__(self, bot: Bot):
        super().__init__(bot)
        self.db = bot.get_plugin(Storage)
        self.con = self.db.con
        self.cur = self.db.cur