"""Vizio SmartCast API base commands."""

from abc import abstractmethod
from typing import Any, Dict


class CommandBase(object):
    """Base command to send data to Vizio device."""

    def __init__(self, url: str = "") -> None:
        """Initialize base command to send data to Vizio device."""
        self._url = url

    def __repr__(self) -> str:
        return f"{type(self).__name__}({self.__dict__})"

    def __eq__(self, other) -> bool:
        return self is other or self.__dict__ == other.__dict__

    @property
    def _method(self) -> str:
        """Get command method."""
        return "put"

    @property
    def url(self) -> str:
        """Get endpoint for command."""
        return self._url

    @url.setter
    def url(self, new_url: str) -> None:
        """Set endpoint for command."""
        self._url = new_url

    def get_url(self) -> str:
        """Get endpoint for command."""
        return self._url

    def get_method(self) -> str:
        return self._method

    @abstractmethod
    def process_response(self, json_obj: Dict[str, Any]) -> Any:
        """Always return True when there is no custom process_response method for subclass."""
        return True


class InfoCommandBase(CommandBase):
    """Base command to get data from Vizio device."""

    def __init__(self, url: str = "") -> None:
        """Initialize base command to get data from Vizio device."""
        super(InfoCommandBase, self).__init__(url)

    @property
    def _method(self) -> str:
        """Get command method."""
        return "get"

    @property
    def url(self) -> str:
        """Get endpoint for command."""
        return CommandBase.url.fget(self)

    @url.setter
    def url(self, new_url: str) -> None:
        """Set endpoint for command."""
        CommandBase.url.fset(self, new_url)

    def process_response(self, json_obj: Dict[str, Any]) -> Any:
        """Always return None when there is no custom process_response method for subclass."""
        return None
