# pylint: disable=C0111,R0903

"""Displays the current color temperature of redshift

Requires the following executable:
    * redshift

Parameters:
    * redshift.location : location provider, either of 'auto' (default), 'geoclue2',
      'ipinfo' or 'manual'
      'auto' uses whatever redshift is configured to do
    * redshift.lat : latitude if location is set to 'manual'
    * redshift.lon : longitude if location is set to 'manual'
    * redshift.show_transition: information about the transitions (x% day) defaults to True
"""

import re
import threading

import core.module
import core.widget
import core.input
import core.decorators

import util.cli
import util.format
import util.location


def get_redshift_value(module):
    widget = module.widget()
    location = module.parameter("location", "auto")
    lat = module.parameter("lat", None)
    lon = module.parameter("lon", None)

    # Even if location method is set to manual, if we have no lat or lon,
    # fall back to the geoclue2 method.
    if location == "manual" and (lat is None or lon is None):
        location = "geoclue2"

    command = ["redshift", "-p"]
    if location == "manual":
        command.extend(["-l", "{}:{}".format(lat, lon)])
    if location == "geoclue2":
        command.extend(["-l", "geoclue2"])

    try:
        res = util.cli.execute(" ".join(command))
    except Exception:
        res = ""
    widget.set("temp", "n/a")
    widget.set("transition", "")
    widget.set("state", "day")
    for line in res.split("\n"):
        line = line.lower()
        if "temperature" in line:
            widget.set("temp", line.split(" ")[2])
        if "period" in line:
            state = line.split(" ")[1]
            if "day" in state:
                widget.set("state", "day")
            elif "night" in state:
                widget.set("state", "night")
            else:
                widget.set("state", "transition")
                match = re.search(r"(\d+)\.\d+% ([a-z]+)", line)
                widget.set(
                    "transition", "({}% {})".format(match.group(1), match.group(2))
                )
    core.event.trigger("update", [widget.module.id], redraw_only=True)


class Module(core.module.Module):
    @core.decorators.every(seconds=10)
    def __init__(self, config, theme):
        super().__init__(config, theme, core.widget.Widget(self.text))

        self.__thread = None
        self.show_transition = util.format.asbool(
            self.parameter("show_transition", True)
        )

        if self.parameter("location", "") == "ipinfo":
            # override lon/lat with ipinfo
            try:
                location = util.location.coordinates()
                self.set("lat", location[0])
                self.set("lon", location[1])
                self.set("location", "manual")
            except Exception:
                # Fall back to geoclue2.
                self.set("location", "geoclue2")

        self._text = ""

    def text(self, widget):
        val = widget.get("temp", "n/a")
        transition = widget.get("transition", "")
        if transition and self.show_transition:
            val = "{} {}".format(val, transition)
        return val

    def update(self):
        if self.__thread is not None and self.__thread.isAlive():
            return
        self.__thread = threading.Thread(target=get_redshift_value, args=(self,))
        self.__thread.start()

    def state(self, widget):
        return widget.get("state", None)


# vim: tabstop=8 expandtab shiftwidth=4 softtabstop=4
