import logging
from time import sleep

from pyhamtools.locator import latlong_to_locator

from data.sig_ref import SIGRef
from providers.sigrefdata.file_download_sig_ref_data_provider import FileDownloadSIGRefDataProvider


class IOTA(FileDownloadSIGRefDataProvider):
    """SIG ref data provider for Islands on the Air"""

    POLL_INTERVAL_DAYS = 365
    SIG = "IOTA"
    DATA_URL = "https://www.iota-world.org/islands-on-the-air/downloads/download-file.html?path=groups.json"

    def __init__(self, provider_config):
        super().__init__(self.SIG, provider_config, self.DATA_URL, self.POLL_INTERVAL_DAYS)

    def _http_response_to_data(self, http_response):
        new_data = []
        data = http_response.json()
        if isinstance(data, list):
            for ref in data:
                ref_id = ref["refno"]
                latitude = float(ref["latitude_min"]) + float(ref["latitude_max"]) / 2.0
                longitude = float(ref["longitude_min"]) + float(ref["longitude_max"]) / 2.0
                grid = None
                try:
                    grid = latlong_to_locator(latitude, longitude, 6)
                except ValueError:
                    logging.debug(f"Error converting lat/lon to locator for an IOTA reference %f %f", latitude, longitude)

                new_data.append(SIGRef(sig=self.SIG, id=ref_id, name=ref["name"],
                                          ref_type="Island", grid=grid, latitude=latitude, longitude=longitude))

                # Bail out if a stop has been requested, i.e. the program is shutting down - no need to parse the rest
                # of the data in this case
                if self._stop_event.is_set():
                    break

                # Very short pause. This will extend the time to handle sig refs by a few seconds but will ensure some time
                # is available for other threads e.g. the web server.
                sleep(0.001)

        return new_data
