from lib.api.tmdbv3api.tmdb import TMDb


class Episode(TMDb):
    _urls = {
        "details": "/tv/%s/season/%s/episode/%s",
        "account_states": "/tv/%s/season/%s/episode/%s/account_states",
        "changes": "/tv/episode/%s/changes",
        "credits": "/tv/%s/season/%s/episode/%s/credits",
        "external_ids": "/tv/%s/season/%s/episode/%s/external_ids",
        "images": "/tv/%s/season/%s/episode/%s/images",
        "translations": "/tv/%s/season/%s/episode/%s/translations",
        "rate_tv_episode": "/tv/%s/season/%s/episode/%s/rating",
        "delete_rating": "/tv/%s/season/%s/episode/%s/rating",
        "videos": "/tv/%s/season/%s/episode/%s/videos",
    }

    def details(
        self,
        tv_id,
        season_num,
        episode_num,
        append_to_response="trailers,images,casts,translations",
    ):
        """
        Get the TV episode details by id.
        :param tv_id: int
        :param season_num: int
        :param episode_num: int
        :param append_to_response: str
        :return:
        """
        return self._request_obj(
            self._urls["details"] % (tv_id, season_num, episode_num),
            params=f"append_to_response={append_to_response}",
        )

    def account_states(self, tv_id, season_num, episode_num):
        """
        Get your rating for a episode.
        :param tv_id: int
        :param season_num: int
        :param episode_num: int
        :return:
        """
        return self._request_obj(
            self._urls["account_states"] % (tv_id, season_num, episode_num),
            params=f"session_id={self.session_id}",
        )

    def changes(self, episode_id, start_date=None, end_date=None, page=1):
        """
        Get the changes for a TV episode. By default only the last 24 hours are returned.
        You can query up to 14 days in a single query by using the start_date and end_date query parameters.
        :param episode_id: int
        :param start_date: str
        :param end_date: str
        :param page: int
        :return:
        """
        params = f"page={page}"
        if start_date:
            params += f"&start_date={start_date}"
        if end_date:
            params += f"&end_date={end_date}"
        return self._request_obj(self._urls["changes"] % episode_id, params=params, key="changes")

    def credits(self, tv_id, season_num, episode_num):
        """
        Get the credits for TV season.
        :param tv_id: int
        :param season_num: int
        :param episode_num: int
        :return:
        """
        return self._request_obj(self._urls["credits"] % (tv_id, season_num, episode_num))

    def external_ids(self, tv_id, season_num, episode_num):
        """
        Get the external ids for a TV episode.
        :param tv_id: int
        :param season_num: int
        :param episode_num: int
        :return:
        """
        return self._request_obj(self._urls["external_ids"] % (tv_id, season_num, episode_num))

    def images(self, tv_id, season_num, episode_num, include_image_language=None):
        """
        Get the images that belong to a TV episode.
        :param tv_id: int
        :param season_num: int
        :param episode_num: int
        :param include_image_language: str
        :return:
        """
        return self._request_obj(
            self._urls["images"] % (tv_id, season_num, episode_num),
            params=f"include_image_language={include_image_language}"
            if include_image_language
            else "",
            key="stills",
        )

    def translations(self, tv_id, season_num, episode_num):
        """
        Get the translation data for an episode.
        :param tv_id: int
        :param season_num: int
        :param episode_num: int
        :return:
        """
        return self._request_obj(
            self._urls["translations"] % (tv_id, season_num, episode_num),
            key="translations",
        )

    def rate_tv_episode(self, tv_id, season_num, episode_num, rating):
        """
        Rate a TV episode.
        :param tv_id: int
        :param season_num: int
        :param episode_num: int
        :param rating: float
        """
        self._request_obj(
            self._urls["rate_tv_episode"] % (tv_id, season_num, episode_num),
            params=f"session_id={self.session_id}",
            method="POST",
            json={"value": rating},
        )

    def delete_rating(self, tv_id, season_num, episode_num):
        """
        Remove your rating for a TV episode.
        :param tv_id: int
        :param season_num: int
        :param episode_num: int
        """
        self._request_obj(
            self._urls["delete_rating"] % (tv_id, season_num, episode_num),
            params=f"session_id={self.session_id}",
            method="DELETE",
        )

    def videos(self, tv_id, season_num, episode_num, include_video_language=None):
        """
        Get the videos that have been added to a TV episode.
        :param tv_id: int
        :param season_num: int
        :param episode_num: int
        :param include_video_language: str
        :return:
        """
        params = ""
        if include_video_language:
            params += f"&include_video_language={include_video_language}"
        return self._request_obj(
            self._urls["videos"] % (tv_id, season_num, episode_num), params=params
        )
