import time
import traceback
from sys import version_info
import json
import logging


LOG = logging.getLogger(__name__)

# Common definitions
_BASE_URL = "https://api.netatmo.com/"

# HTTP libraries depends upon Python 2 or 3
if version_info.major == 3:
    import urllib.parse, urllib.request
else:
    from urllib import urlencode
    import urllib2


class NoDevice(Exception):
    pass


# Utilities routines


def postRequest(url, params=None, timeout=10):
    if version_info.major == 3:
        req = urllib.request.Request(url)
        if params:
            req.add_header(
                "Content-Type", "application/x-www-form-urlencoded;charset=utf-8"
            )
            params = urllib.parse.urlencode(params).encode("utf-8")
        try:
            resp = (
                urllib.request.urlopen(req, params, timeout=timeout)
                if params
                else urllib.request.urlopen(req, timeout=timeout)
            )
        except urllib.error.URLError:
            LOG.error(traceback.format_exc())
            return None
    else:
        if params:
            params = urlencode(params)
            headers = {
                "Content-Type": "application/x-www-form-urlencoded;charset=utf-8"
            }
        req = (
            urllib2.Request(url=url, data=params, headers=headers)
            if params
            else urllib2.Request(url)
        )
        try:
            resp = urllib2.urlopen(req, timeout=timeout)
        except urllib2.URLError:
            return None
    data = b""
    for buff in iter(lambda: resp.read(65535), b""):
        data += buff
    # Return values in bytes if not json data to handle properly camera images
    returnedContentType = (
        resp.getheader("Content-Type")
        if version_info.major == 3
        else resp.info()["Content-Type"]
    )
    return (
        json.loads(data.decode("utf-8"))
        if "application/json" in returnedContentType
        else data
    )


def toTimeString(value):
    return time.strftime("%Y-%m-%d_%H:%M:%S", time.localtime(int(value)))


def toEpoch(value):
    return int(time.mktime(time.strptime(value, "%Y-%m-%d_%H:%M:%S")))


def todayStamps():
    today = time.strftime("%Y-%m-%d")
    today = int(time.mktime(time.strptime(today, "%Y-%m-%d")))
    return today, today + 3600 * 24


# Global shortcut


def getStationMinMaxTH(station=None, module=None):
    from pyatmo import ClientAuth
    from smart_home.WeatherStation import DeviceList

    authorization = ClientAuth()
    devList = DeviceList(authorization)
    if not station:
        station = devList.default_station
    if module:
        mname = module
    else:
        mname = devList.stationByName(station)["module_name"]
    lastD = devList.lastData(station)
    if mname == "*":
        result = dict()
        for m in lastD.keys():
            if time.time() - lastD[m]["When"] > 3600:
                continue
            r = devList.MinMaxTH(module=m)
            result[m] = (r[0], lastD[m]["Temperature"], r[1])
    else:
        if time.time() - lastD[mname]["When"] > 3600:
            result = ["-", "-"]
        else:
            result = [lastD[mname]["Temperature"], lastD[mname]["Humidity"]]
        result.extend(devList.MinMaxTH(station, mname))
    return result
