from json import dumps
from time import sleep

from py.lib.twilio.client import get_client


def send_sms(to, from_, body, max_char_count=300, stream=None):
    '''
    abstraction for twilio.client.messages.create which will break
    messages into multi-part SMS rather than throwing an error or
    requiring the use of MMS data

    @param to               messages.create parameter
    @param from_            messages.create parameter
    @param body             messages.create parameter
    @param max_char_count   1 ≤ N ≤ 1500 (default 300)
    @param stream           used to report success/failure (optional)

    @return   a list of twilio MessageInstance objects
    '''
    client = get_client()
    messages = []

    max_char_count = max(1, min(max_char_count, 1500))

    total_sms_parts = 1 + len(body) // max_char_count
    contains_multiple_parts = total_sms_parts > 1

    for i in range(0, len(body), max_char_count):
        msg_body = body[i:i+max_char_count]
        current_part = 1 + i // max_char_count

        if contains_multiple_parts:
            msg_body = f'{current_part}/{total_sms_parts}\n{msg_body}'

        message = client.messages.create(
                to = to,
                from_ = from_,
                body = msg_body,
                )

        messages.append(message)

        if stream is not None:
            stream.writeline(
                    dumps({
                        'sid': message.sid,
                        'to': to,
                        'from': from_,
                        'body': msg_body,
                        })
                    )

        if contains_multiple_parts:
            sleep(2 if max_char_count <= 500 else 5)

    return messages