# -*- coding: utf-8 -*-

MANUAL_SLUG = "manual"


class WorkerVersionMixin(object):
    def get_worker_version(self, worker_version_id: str) -> dict:
        """
        Get worker version from cache if possible, otherwise make API request
        """
        if worker_version_id in self._worker_version_cache:
            return self._worker_version_cache[worker_version_id]

        worker_version = self.request("RetrieveWorkerVersion", id=worker_version_id)
        self._worker_version_cache[worker_version_id] = worker_version

        return worker_version

    def get_worker_version_slug(self, worker_version_id: str) -> str:
        """
        Get worker version slug from cache if possible, otherwise make API request

        Should use `get_ml_result_slug` instead of using this method directly
        """
        worker_version = self.get_worker_version(worker_version_id)
        return worker_version["worker"]["slug"]

    def get_ml_result_slug(self, ml_result) -> str:
        """
        Helper function to get the slug from element, classification or transcription

        Can handle old and new (source vs worker_version)

        :type ml_result: Element or classification or transcription
        """
        if (
            "source" in ml_result
            and ml_result["source"]
            and ml_result["source"]["slug"]
        ):
            return ml_result["source"]["slug"]
        elif "worker_version" in ml_result and ml_result["worker_version"]:
            return self.get_worker_version_slug(ml_result["worker_version"])
        # transcriptions have worker_version_id but elements have worker_version
        elif "worker_version_id" in ml_result and ml_result["worker_version_id"]:
            return self.get_worker_version_slug(ml_result["worker_version_id"])
        elif "worker_version" in ml_result and ml_result["worker_version"] is None:
            return MANUAL_SLUG
        elif (
            "worker_version_id" in ml_result and ml_result["worker_version_id"] is None
        ):
            return MANUAL_SLUG
        else:
            raise ValueError(f"Unable to get slug from: {ml_result}")