import datetime
import logging
import os
from typing import Dict, List, Union

from praw import Reddit  # type: ignore
from praw.models import Subreddit  # type: ignore
from praw.models.reddit.subreddit import ModeratorRelationship  # type: ignore
from slackclient import SlackClient  # type: ignore

from tor import __root__, __version__, __SELF_NAME__
from tor.core import cached_property

# Load configuration regardless of if bugsnag is setup correctly
try:
    import bugsnag  # type: ignore
except ImportError:
    # If loading from setup.py or bugsnag isn't installed, we
    # don't want to bomb out completely
    bugsnag = None


class Config(object):
    """
    A singleton object for checking global configuration from
    anywhere in the application
    """

    r: Reddit

    # List of mods of ToR, fetched later using PRAW
    tor_mods: Union[List[str], ModeratorRelationship] = []

    # A collection of Subreddit objects, injected later based on
    # subreddit-specific rules
    subreddits_to_check: List[str] = []
    subreddits_domain_filter_bypass: List[str] = []

    # API keys for later overwriting based on contents of filesystem
    bugsnag_api_key = ''

    # Templating string for the header of the bot post
    header = ''

    no_gifs: List[str] = []

    perform_header_check = True
    debug_mode = False

    # Name of the bot
    name = __SELF_NAME__
    bot_version = __version__

    last_post_scan_time = datetime.datetime(1970, 1, 1, 1, 1, 1)

    @cached_property
    def redis(self):
        """
        Lazy-loaded redis connection
        """
        from redis import StrictRedis
        import redis.exceptions

        try:
            url = os.environ.get('REDIS_CONNECTION_URL',
                                 'redis://localhost:6379/0')
            conn = StrictRedis.from_url(url)
            conn.ping()
        except redis.exceptions.ConnectionError:
            logging.fatal("Redis server is not running")
            raise
        return conn

    @cached_property
    def tor(self) -> Subreddit:
        if self.debug_mode:
            return self.r.subreddit('ModsOfTor')
        else:
            return self.r.subreddit('transcribersofreddit')

    @cached_property
    def modchat(self):
        return SlackClient(os.getenv('SLACK_API_KEY', None))

    # Compatibility
    core_version = __version__
    video_domains: List[str] = []
    audio_domains: List[str] = []
    image_domains: List[str] = []
    video_formatting = ''
    audio_formatting = ''
    image_formatting = ''
    other_formatting = ''
    upvote_filter_subs: Dict[str, int] = {}
    no_link_header_subs: List[str] = []


try:
    Config.bugsnag_api_key = open('bugsnag.key').readline().strip()
except OSError:
    Config.bugsnag_api_key = os.getenv('BUGSNAG_API_KEY', '')

if bugsnag and Config.bugsnag_api_key:
    bugsnag.configure(
        api_key=Config.bugsnag_api_key,
        app_version=__version__,
        project_root=__root__,
    )


# ----- Compatibility -----
config = Config()