import os
import time

from flask import Flask, request, make_response, abort, render_template
from flask_restful import Api, Resource

import base
import rest
import auth
from config import cfg

from recorder import Recorder
from player import Player

app = Flask(__name__)
api = Api(app)


@app.route("/", methods=["POST"])
def default():
    token = request.form.get("token")
    if token == "": abort(401)
    print(token)
    if not auth.checktoken(token): abort(401)

    return render_template("apiinfo.html")


class PlayAudio(Resource):
    def put(self):
        token = request.headers.get('Authorization')
        if not auth.checktoken(token):
            return make_response('authorized failed', 401)
            
        reqjson = request.get_json()
        directory = reqjson["directory"]
        if directory is None:
            return make_response('miss parameters', 400)
        
        if Player.AsynPlay(directory) :
            return make_response('success')
        else:
            return make_response('can not play this file', 500)
            
            
    def post(self):
        token = request.headers.get('Authorization')
        if not auth.checktoken(token):
            return make_response('authorized failed', 401)
            
        reqjson = request.get_json()
        directory = reqjson["directory"]
        if directory is None:
            return make_response('miss parameters', 400)
        
        if Player.Play(directory) :
            return make_response('success')
        else:
            return make_response('can not play this file', 500)

    
    def delete(self):
        token = request.headers.get('Authorization')
        if not auth.checktoken(token):
            return make_response('authorized failed', 401)

        if Player.ForceStop() :
            return make_response('success')
        else:
            return make_response('no audio playing', 400)


class RecorderController(Resource):
    def put(self):
        token = request.headers.get('Authorization')
        if not auth.checktoken(token):
            return make_response('authorized failed', 401)

        if Recorder.IsOpened():
            return make_response("success")
            
        if Recorder.OpenRecorder():
            return make_response("success")
        else:
            return make_response('open recorder failed', 500)

    
    def delete(self):
        token = request.headers.get('Authorization')
        if not auth.checktoken(token):
            return make_response('authorized failed', 401)

        if not Recorder.IsOpened():
            return make_response("success")
            
        Recorder.CloseRecorder()
        return make_response("success")

            
class RecordAudio(Resource):
    def post(self):
        token = request.headers.get('Authorization')
        if not auth.checktoken(token):
            return make_response('authorized failed', 401)
            
        reqjson = request.get_json()
        directory = reqjson["directory"]
        maxtime = reqjson["maxtime"]
        humanonly = reqjson["humanonly"]
        if directory is None or maxtime is None or humanonly is None:
            return make_response('miss parameters', 400)
        elif maxtime <1 :
            return make_response('parameter is illegal', 400)
        
        res = Recorder.RecordAudio(humanonly, directory, maxtime)
        if res == 0 :
            return make_response('success')
        elif res == -1 :
            return make_response('recorder is not opened', 400)
        elif res == -2:
            return make_response('it is recording now', 400)
        elif res == -3:
            return make_response('time out, no sentence found', 400)
        else:
            return make_response('record sentence failed', 500)
        

class RecordAudios(Resource):
    def put(self):
        token = request.headers.get('Authorization')
        if not auth.checktoken(token):
            return make_response('authorized failed', 401)
            
        reqjson = request.get_json()
        directory = reqjson["directory"]
        prename = reqjson["prename"]
        bufsize = reqjson["bufsize"]
        looptime = reqjson["looptime"]
        recordtime = reqjson["recordtime"]
        if directory is None or prename is None or bufsize is None or looptime is None or recordtime is None:
            return make_response('miss parameters', 400)
        if bufsize < 2 or looptime < 1 or recordtime < 1:
            return make_response('parameter is illegal', 400)

        res = Recorder.RecordAudiosStart(directory, prename, bufsize, looptime, recordtime)
        if res == 0:
            return make_response('success')
        elif res == -1 :
            return make_response('recorder is not opened', 400)
        elif res == -2 :
            return make_response('it is recording now', 400)
        else:
            return make_response('record videos failed', 500)
        

    def delete(self):
        token = request.headers.get('Authorization')
        if not auth.checktoken(token):
            return make_response('authorized failed', 401)

        hr = Recorder.RecordAudiosStop()
        if hr == 0 :
            return make_response('success')
        
        return make_response('stop record-thread failed.', 500)



api.add_resource(PlayAudio, '/audio/play')
api.add_resource(RecorderController, '/recorder')
api.add_resource(RecordAudio, '/audio/record')
api.add_resource(RecordAudios, '/audios/record')


if __name__ == '__main__':
    port = cfg.getint("server","port")
    
    app.run(
        host = '0.0.0.0',
        port = port,
        debug = False
    )