import time
import threading
import sys

import nls
from tests.test_utils import (TEST_ACCESS_TOKEN, TEST_ACCESS_APPKEY)

class TestSr:
    def __init__(self, tid, test_file):
        self.__th = threading.Thread(target=self.__test_run)
        self.__id = tid
        self.__test_file = test_file
   
    def loadfile(self, filename):
        with open(filename, 'rb') as f:
            self.__data = f.read()
    
    def start(self):
        self.loadfile(self.__test_file)
        self.__th.start()

    def test_on_start(self, message, *args):
        print('test_on_start:{}'.format(message))

    def test_on_error(self, message, *args):
        print('on_error args=>{}'.format(args))

    def test_on_close(self, *args):
        print('on_close: args=>{}'.format(args))

    def test_on_result_chg(self, message, *args):
        print('test_on_chg:{}'.format(message))

    def test_on_completed(self, message, *args):
        print('on_completed:args=>{} message=>{}'.format(args, message))


    def __test_run(self):
        print('thread:{} start..'.format(self.__id))
        
        sr = nls.NlsSpeechRecognizer(
                    token=TEST_ACCESS_TOKEN,
                    appkey=TEST_ACCESS_APPKEY,
                    on_start=self.test_on_start,
                    on_result_changed=self.test_on_result_chg,
                    on_completed=self.test_on_completed,
                    on_error=self.test_on_error,
                    on_close=self.test_on_close,
                    callback_args=[self.__id]
                )
        while True:
            print('{}: session start'.format(self.__id))
            r = sr.start(ex={'format':'pcm', 'hello':123})
           
            self.__slices = zip(*(iter(self.__data),) * 640)
            for i in self.__slices:
                sr.send_audio(bytes(i))
                time.sleep(0.01)

            r = sr.stop()
            print('{}: sr stopped:{}'.format(self.__id, r))
            time.sleep(5)

def multiruntest(num=500):
    for i in range(0, num):
        name = 'thread' + str(i)
        t = TestSr(name, 'tests/test1.pcm')
        t.start()

nls.enableTrace(True)
multiruntest(1)