from lib.api.tmdbv3api.tmdb import TMDb


class List(TMDb):
    _urls = {
        "details": "/list/%s",
        "check_status": "/list/%s/item_status",
        "create": "/list",
        "add_movie": "/list/%s/add_item",
        "remove_movie": "/list/%s/remove_item",
        "clear_list": "/list/%s/clear",
        "delete_list": "/list/%s",
    }

    def details(self, list_id):
        """
        Get list details by id.
        :param list_id: int
        :return:
        """
        return self._request_obj(self._urls["details"] % list_id, key="items")

    def check_item_status(self, list_id, movie_id):
        """
        You can use this method to check if a movie has already been added to the list.
        :param list_id: int
        :param movie_id: int
        :return:
        """
        return self._request_obj(
            self._urls["check_status"] % list_id, params=f"movie_id={movie_id}"
        )["item_present"]

    def create_list(self, name, description):
        """
        You can use this method to check if a movie has already been added to the list.
        :param name: str
        :param description: str
        :return:
        """
        return self._request_obj(
            self._urls["create"],
            params=f"session_id={self.session_id}",
            method="POST",
            json={"name": name, "description": description, "language": self.language},
        ).list_id

    def add_movie(self, list_id, movie_id):
        """
        Add a movie to a list.
        :param list_id: int
        :param movie_id: int
        """
        self._request_obj(
            self._urls["add_movie"] % list_id,
            params=f"session_id={self.session_id}",
            method="POST",
            json={"media_id": movie_id},
        )

    def remove_movie(self, list_id, movie_id):
        """
        Remove a movie from a list.
        :param list_id: int
        :param movie_id: int
        """
        self._request_obj(
            self._urls["remove_movie"] % list_id,
            params=f"session_id={self.session_id}",
            method="POST",
            json={"media_id": movie_id},
        )

    def clear_list(self, list_id):
        """
        Clear all of the items from a list.
        :param list_id: int
        """
        self._request_obj(
            self._urls["clear_list"] % list_id,
            params=f"session_id={self.session_id}&confirm=true",
            method="POST",
        )

    def delete_list(self, list_id):
        """
        Delete a list.
        :param list_id: int
        """
        self._request_obj(
            self._urls["delete_list"] % list_id,
            params=f"session_id={self.session_id}",
            method="DELETE",
        )
