from django.db.models import Model, CharField, BooleanField

from core.classes.sms import BaseSMSProvider, SMSNotSent

from urllib.parse import quote_plus
from urllib.request import urlopen
from typing import Union


import json

# Create your models here.

class PlaySMSServer(Model, BaseSMSProvider):
    name = CharField(max_length=255)
    logo = CharField(max_length=255)
    https = BooleanField(default=True)
    host = CharField(max_length=255)
    username = CharField(max_length=255)
    token = CharField(max_length=255)

    @property
    def is_active(self):
        return True

    @staticmethod
    def getError(status):
        if status["error_message"]:
            return status["error_message"]
        try:
            if status["data"]["error"]:
                return status["data"]["error"]
        finally:
            return

    def sendSMS(self, recipients: Union[str, list], message: str):
        '''Send an SMS message to one or more recipients

        :param recipients: Recipient phone number as a string, or a list of multiple phone number strings
        :param message: Message to be sent as a string
        '''

        if isinstance(recipients, list):
            recipients = ",".join(recipients)

        url = 'http%s://%s/index.php?app=ws&u="%s"&h="%s"&op=pv&to=%s&msg=%s' % ("s" if self.https else "", self.host, self.username, self.token, recipients, quote_plus(message))

        response = urlopen(url)

        status = json.loads(response.read().decode())

        error = PlaySMSServer.getError(status)

        if error:
            raise SMSNotSent(f'An error occurred trying to send the SMS: {error}')