from abc import abstractmethod, abstractproperty
from typing import final

from app.clients import Client, ClientException


class SmsClientResponseException(ClientException):
    """
    Base Exception for SmsClientsResponses
    """

    def __init__(self, message):
        self.message = message

    def __str__(self):
        return f"Message {self.message}"


class SmsClient(Client):
    """
    Base Sms client for sending smss.
    """

    @abstractmethod
    def send_sms(self, *args, **kwargs):
        raise NotImplementedError("TODO Need to implement.")

    @abstractproperty
    def name(self):
        raise NotImplementedError("TODO Need to implement.")

    @final
    def get_name(self):
        return self.name
