import urllib
import logging
import simplejson

from modules.communication.liquidsoap.communicator import LiquidSoapCommunicator
from libraries.database.broadcasts import ScheduleEntry
from libraries.base.config import AuraConfig
from libraries.exceptions.auraexceptions import LQConnectionError


class ConnectionTester(AuraConfig):

    def __init__(self):
        super(ConnectionTester, self).__init__()

    def get_connection_status(self):
        status = dict()
        status["db"] = self.test_db_conn()
        status["pv"] = self.test_pv_conn()
        status["lqs"] = self.test_lqs_conn()
        status["lqsr"] = self.test_lqsr_conn()
        status["tank"] = self.test_tank_conn()
        status["redis"] = self.test_redis_conn()

        return simplejson.dumps(status)

    def test_db_conn(self):
        try:
            ScheduleEntry.select_all()
        except:
            return False

        return True

    def test_lqs_conn(self):
        try:
            lsc = LiquidSoapCommunicator(self.config)
            lsc.get_mixer_status()
            return True

        except Exception as e:
            logger = logging.getLogger("AuraEngine")
            logger.warning(str(e))
            return False

    def test_lqsr_conn(self):
        try:
            lsc = LiquidSoapCommunicator(self.config)
            lsc.get_recorder_status()
            return True

        except Exception as e:
            logger = logging.getLogger("AuraEngine")
            logger.warning(str(e))
            return False

    def test_pv_conn(self):
        return self.test_url_connection(self.config.get("calendarurl"))

    def test_tank_conn(self):
        # test load of playlist 1
        return self.test_url_connection(self.config.get("importerurl")+"1")

    def test_redis_conn(self):
        from modules.communication.redis.adapter import ClientRedisAdapter
        try:
            cra = ClientRedisAdapter()
            cra.publish("aura", "status")
        except:
            return False

        return True

    def test_url_connection(self, url):
        try:
            request = urllib.request.Request(url)
            response = urllib.request.urlopen(request)
            response.read()
        except Exception as e:
            print(e)
            return False

        return True