# -*- coding:utf-8 -*-
import argparse
from message_api import *
from message_controller import check_available, init_mobile, r, message_info,check_login
import queue
import sys
from concurrent.futures import ThreadPoolExecutor, wait, ALL_COMPLETED, as_completed
import time
import random


def sed_msg(mobile, set_of_times, interval_time, remainder):
    init_mobile(mobile, set_of_times)
    available_msg = []
    while len(available_msg) < remainder:
        m = random.choice(all_message_info)
        if check_available(m):
            available_msg.append(m)
    pool = ThreadPoolExecutor(500)
    SHARE_Q = queue.Queue(remainder)
    while SHARE_Q.qsize() < remainder:
        SHARE_Q.put(random.choice(available_msg))
    all_task = []
    for t in range(SHARE_Q.qsize()):
        mg = SHARE_Q.get()
        try:
            all_task.append(pool.submit(eval(mg), mg, mobile))
        except KeyboardInterrupt:
            r.delete('%s_%d' % (mobile, set_of_times))
            sys.exit(0)
        if interval_time:
            time.sleep(interval_time)
    wait(all_task, return_when=ALL_COMPLETED)


def main(mobile, set_of_times, interval_time):
    mobile_incr = '%s_%d' % (mobile, set_of_times)
    while True:
        if r.get(mobile_incr):
            sed_count = int(r.get(mobile_incr))
        else:
            sed_count = 0
        if sed_count >= set_of_times:
            break
        if sed_count:
            remainder = set_of_times - sed_count
        else:
            remainder = set_of_times
        sed_msg(mobile, set_of_times, interval_time, remainder)
    r.delete(mobile_incr)


if __name__ == '__main__':
    check_login()
    parser = argparse.ArgumentParser()
    parser.add_argument('-m', required=True, type=int, dest='m', metavar='Mobile', help='接收短信的手机号码')
    parser.add_argument('-c', required=True, type=int, dest='c', metavar='Count', help='发送短信数量')
    parser.add_argument('-s', required=False, type=int, dest='s', metavar='Seconds', help='设置每条短信发送的时间间隔,默认为连续发送')
    args = parser.parse_args()
    mobile = str(args.m)
    if len(mobile) < 11 or not mobile.startswith('1'):
        sys.exit('手机号码格式错误')
    set_of_times = args.c
    interval_time = args.s
    all_message_info = [m for m in message_info()]
    try:
        main(mobile, set_of_times, interval_time)
    except KeyboardInterrupt:
        r.delete('%s_%d' % (mobile, set_of_times))
        sys.exit(0)