package com.platform.plugs.live.handlers;

import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;

import com.alibaba.fastjson.JSONObject;
import com.aliyuncs.CommonRequest;
import com.aliyuncs.CommonResponse;
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.http.MethodType;
import com.aliyuncs.profile.DefaultProfile;
import com.platform.plugs.live.config.LiveAudioConfig;

public class LiveAudioHandler implements ILiveAudioHandler {
	
	private LiveAudioConfig liveAudioConfig;
	
	private DefaultAcsClient client;

	@Override
	public void configLiveAudio(LiveAudioConfig liveAudioConfig) {
		this.liveAudioConfig = liveAudioConfig;
		// 设置endpoint
        try {
            DefaultProfile.addEndpoint(liveAudioConfig.getEndpointName(), liveAudioConfig.getRegionId(), liveAudioConfig.getProduct(), liveAudioConfig.getDomainName());
        } catch (ClientException e) {
            e.printStackTrace();
        }
		this.client = new DefaultAcsClient(DefaultProfile.getProfile(liveAudioConfig.getRegionId(), liveAudioConfig.getAccessKeyId(), liveAudioConfig.getAccessKeySecret()));
	}
	
	@Override
	public String getAudioRecognitionResult(String fileLink, String callback){
		if(StringUtils.isBlank(fileLink)){
			return null;
		}
		String taskId = this.submitFileTransRequest(fileLink, callback);

		if (StringUtils.isBlank(taskId)){
		    return null;
        }

		return taskId;
//        if (StringUtils.isNotBlank(taskId)) {
//        	String result = this.getFileTransResult(taskId);
//            if (result != null) {
//            	return result;
//            } else {
//                System.out.println("录音文件识别结果查询失败！");
//                return null;
//            }
//        }else {
//            System.out.println("录音文件识别请求失败！");
//            return null;
//        }
//        return null;
	}

	@Override
	public String submitFileTransRequest(String fileLink, String callback) {
		if(StringUtils.isBlank(fileLink)){
			return null;
		}
		/**
         * 1. 创建CommonRequest 设置请求参数
         */
        CommonRequest postRequest = new CommonRequest();
        // 设置域名
        postRequest.setDomain(liveAudioConfig.getDomainName());
        // 设置API的版本号，格式为YYYY-MM-DD
        postRequest.setVersion(liveAudioConfig.getApiVersion());
        // 设置action
        postRequest.setAction(liveAudioConfig.getPostRequestAction());
        // 设置产品名称
        postRequest.setProduct(liveAudioConfig.getProduct());
        /**
         * 2. 设置录音文件识别请求参数，以JSON字符串的格式设置到请求的Body中
         */
        JSONObject taskObject = new JSONObject();
        // 设置appkey
        taskObject.put("appkey", liveAudioConfig.getAppKey());
        // 设置音频文件访问链接
        taskObject.put("file_link", fileLink);
        // 新接入请使用4.0版本，已接入(默认2.0)如需维持现状，请注释掉该参数设置
        taskObject.put("version", "4.0");
        // 设置是否输出词信息，默认为false，开启时需要设置version为4.0及以上
        taskObject.put("enable_words", false);
        //是否将大于16khz采样率的音频进行自动降采样，默认为false，开启时需要设置version为”4.0”
        taskObject.put("enable_sample_rate_adaptive", true);
        //是否开启智能分轨（开启智能分轨，即可在两方对话的语音情景下，依据每句话识别结果中的ChannelId，判断该句话的发言人为哪一方。通常先发言一方ChanelId为1。只支持8000Hz采样率单通道语音。）
        taskObject.put("auto_split", true);
        //是否启用统一后处理，默认值为 false
        taskObject.put("enable_unify_post", true);
        // 是否使用回调
        taskObject.put("enable_callback", true);
        // 回调地址设置
//        taskObject.put("callback_url", liveAudioConfig.getCallbackDomainName() + "platform/live/notify/allocation");
        taskObject.put("callback_url", liveAudioConfig.getCallbackDomainName() + callback);

        String task = taskObject.toJSONString();
        System.out.println(task);
        // 设置以上JSON字符串为Body参数
        postRequest.putBodyParameter("Task", task);
        // 设置为POST方式的请求
        postRequest.setMethod(MethodType.POST);
        /**
         * 3. 提交录音文件识别请求，获取录音文件识别请求任务的ID，以供识别结果查询使用
         */
        String taskId = null;
        try {
            CommonResponse postResponse = client.getCommonResponse(postRequest);
            System.err.println("提交录音文件识别请求的响应：" + postResponse.getData());
            if (postResponse.getHttpStatus() == 200) {
                JSONObject result = JSONObject.parseObject(postResponse.getData());
                String statusText = result.getString("StatusText");
                if ("SUCCESS".equals(statusText)) {
                    taskId = result.getString("TaskId");
                }
            }
        } catch (ClientException e) {
			e.printStackTrace();
		}
        return taskId;
	}

	@Override
	public String getFileTransResult(String taskId) {
		if(StringUtils.isBlank(taskId)){
			return null;
		}
		/**
         * 1. 创建CommonRequest 设置任务ID
         */
        CommonRequest getRequest = new CommonRequest();
        // 设置域名
        getRequest.setDomain(liveAudioConfig.getDomainName());
        // 设置API版本
        getRequest.setVersion(liveAudioConfig.getApiVersion());
        // 设置action
        getRequest.setAction(liveAudioConfig.getGetRequestAction());
        // 设置产品名称
        getRequest.setProduct(liveAudioConfig.getProduct());
        // 设置任务ID为查询参数
        getRequest.putQueryParameter("TaskId", taskId);
        // 设置为GET方式的请求
        getRequest.setMethod(MethodType.GET);
        /**
         * 2. 提交录音文件识别结果查询请求
         * 以轮询的方式进行识别结果的查询，直到服务端返回的状态描述为“SUCCESS”,或者为错误描述，则结束轮询。
         */
        String result = null;
        int k = 0;
        while (k<3) {
            try {
                CommonResponse getResponse = client.getCommonResponse(getRequest);
                System.err.println("识别查询结果：" + getResponse.getData());
                if (getResponse.getHttpStatus() != 200) {
                    break;
                }
                JSONObject jsonResult = JSONObject.parseObject(getResponse.getData());
                String statusText = jsonResult.getString("StatusText");
                if ("RUNNING".equals(statusText) || "QUEUEING".equals(statusText)) {
                	k++;
                    // 继续轮询，注意设置轮询时间间隔
                    Thread.sleep(3000);
                } else {
                    // 状态信息为成功，返回识别结果；状态信息为异常，返回空
                    if ("SUCCESS".equals(statusText)) {
                    	result = "";
                        for (int i = 0; i < jsonResult.getJSONObject("Result").getJSONArray("Sentences").size(); i++) {
                        	if(jsonResult.getJSONObject("Result").getJSONArray("Sentences").getJSONObject(i).getString("ChannelId")=="1" || jsonResult.getJSONObject("Result").getJSONArray("Sentences").getJSONObject(i).getString("ChannelId").equals("1")){
                        		result += jsonResult.getJSONObject("Result").getJSONArray("Sentences").getJSONObject(i).getString("Text");
                        	}
                        }
                        
                       // 状态信息为成功，但没有识别结果，则可能是由于文件里全是静音、噪音等导致识别为空
                        if(StringUtils.isBlank(result)) {
                            result = "";
                        }
                    }
                    break;
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        return result;
	}

	public static void main(String[] args) {
		LiveAudioConfig liveAudioConfig = new LiveAudioConfig("C9DHTIxeXhe6fp9u", "cn-shanghai", "cn-shanghai", "nls-filetrans", 
				"filetrans.cn-shanghai.aliyuncs.com", "2018-08-17", "SubmitTask", "GetTaskResult", "LTAIVvNJzQ3Etp6q", "nCu0fyV85yn3jes5lRwqx7Q9qxRhSS", "http://test.zhongkedongxin.com/");
	}
}
