package com.my.core.commandManager.contrller;

import com.alibaba.fastjson.JSONObject;
import com.my.core.commandManager.CommandManager;
import com.my.core.commandManager.commandbuidler.CommandBuidlerFactory;
import org.springframework.web.bind.annotation.*;

import javax.annotation.PreDestroy;
import javax.annotation.Resource;
import java.util.Random;

/**
 * @Project : huimv.shiwan
 * @Package : com.huimv.biosafety.uface.controller
 * @Description : TODO
 * @Version : 1.0
 * @Author : ZhuoNing
 * @Create : 2020-12-25
 **/
@CrossOrigin
@RestController
@RequestMapping("/appleVideo")
public class TaskController {
    @Resource
    CommandManager manager;

    @GetMapping("/play")
    public String play(@RequestParam(value = "url", required = true) String url,
                       @RequestParam(value = "name", required = true) String name,
                       @RequestParam(value = "dt", required = false) Integer delayTime,
                       @RequestParam(value = "targetUrl", required = true) String targetUrl) throws InterruptedException {
        System.out.println("#接收参数 url=" + url);
        System.out.println("#接收参数 name=" + name);
        System.out.println("#接收参数 delayTime=" + delayTime);
        if (delayTime == null) {
            delayTime = Integer.valueOf(3000);
        }
        System.out.println("#接收参数 delayTime2=" + delayTime);

        url = url.replace("rtsp://", "");
        String mediaName = getMedia(url);

        String media = this.manager.start(name, CommandBuidlerFactory.createBuidler()
                .add("ffmpeg")
                .add("-f", "rtsp")
                .add("-rtsp_transport", "tcp")
                .add("-i", "rtsp://" + url)
                .add("-c", "copy")
                .add("-f", "hls")
                .add("-hls_time", "2.0")
                .add("-hls_list_size", "1")
                .add("-hls_wrap", "15")
                .add("/usr/local/nginx/html/hls/" + mediaName + ".m3u8"), url, mediaName);

        Thread.sleep(delayTime.intValue());

        System.out.println("C1 media=" + mediaName);
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("url", targetUrl + "/hls/" + mediaName + ".m3u8");
        jsonObject.put("name", name);
        jsonObject.put("code", Integer.valueOf(8200));
        jsonObject.put("message", "请求成功。");
        return jsonObject.toJSONString();
    }

//    @GetMapping("/play")
//    public String play(@RequestParam(value = "url", required = true) String url,
//                       @RequestParam(value = "name", required = true) String name,
//                       @RequestParam(value = "flags", required = true) String flags) throws InterruptedException {
//        url = url.replace("rtsp://", "");
//        String mediaName = getMedia(url);
//        //TEST
//        name = mediaName;
//        //{启动}
//        String media = manager.start(name, CommandBuidlerFactory.createBuidler()
//                .add("ffmpeg")
//                .add("-f", "rtsp")
//                .add("-rtsp_transport", "tcp")
//                .add("-i", "rtsp://" + url)
//                .add("-c", "copy")
//                .add("-f", "hls")
//                .add("-hls_time", "2.0")
////                .add("-hls_list_size", "1")
//                .add("-hls_wrap", "15")
//                .add("-hls_list_size", "2")
////                .add(" -hls_flags", flags)
//                .add("/usr/local/nginx/html/hls/" + mediaName + ".m3u8"),url,mediaName);
////                .add("D:\\nginx-1.20.2\\html\\hls\\"+mediaName+".m3u8"),url,mediaName);
//
//        Thread.sleep(10000);
//        System.out.println("C1 media="+mediaName);
//        JSONObject jsonObject = new JSONObject();
//        jsonObject.put("url", "/hls/" + mediaName + ".m3u8");
//        jsonObject.put("name", name);
//        jsonObject.put("code", 8200);
//        jsonObject.put("message", "请求成功。");
//        return jsonObject.toJSONString();
//    }

//    @PostMapping("/start2")
//    public String start2(@RequestBody @Validated StartParam param) {
//        String name;
//        if (param.getName() == null || "".equals(param.getName())) {
//            name = getRandomString(10);
//        } else {
//            name = param.getName();
//        }
//
//        CommandTasker query = manager.query(name);
//        if (query == null) {
//            manager.start(name, CommandBuidlerFactory.createBuidler()
//                    .add("ffmpeg").add("-f", "rtsp")
//                    .add("-rtsp_transport", "tcp")
//                    .add("-i", param.getUrl())
//                    .add("-c", "copy")
//                    .add("-f", "hls")
//                    .add("-hls_time", "2.0")
//                    .add("-hls_list_size", "1")
//                    .add("-hls_wrap", "15")
//                    .add("/tmp/hls/" + name + ".m3u8"));
//        } else {
//            query.setCreateTime(LocalDateTime.now());
//        }
//        JSONObject jsonObject = new JSONObject();
//        jsonObject.put("url", "/hls/" + name + ".m3u8");
//        jsonObject.put("name", name);
//        jsonObject.put("code", 8200);
//        jsonObject.put("message", "请求成功。");
//        return jsonObject.toJSONString();
//    }

//    @GetMapping("/start_old1")
//    public String start_old1(@RequestParam(value = "url", required = true) String url,
//                       @RequestParam(value = "name", required = true) String name) {
//        url = url.replace("rtsp://", "");
//        String mediaName = getMedia(url);
//
////        CommandTasker query = manager.query(name);
////        if (query == null) {
//        manager.start(name, CommandBuidlerFactory.createBuidler()
//                .add("ffmpeg").add("-f", "rtsp")
//                .add("-rtsp_transport", "tcp")
//                .add("-i", "rtsp://" + url)
//                .add("-c", "copy")
//                .add("-f", "hls")
//                .add("-hls_time", "2.0")
//                .add("-hls_list_size", "1")
//                .add("-hls_wrap", "15")
//                .add("/usr/local/nginx/html/hls/" + mediaName + ".m3u8"));
////        }else{
////            query.setCreateTime(LocalDateTime.now());
////        }
//        JSONObject jsonObject = new JSONObject();
//        jsonObject.put("url", "/hls/" + mediaName + ".m3u8");
//        jsonObject.put("name", name);
//        jsonObject.put("code", 8200);
//        jsonObject.put("message", "请求成功。");
//        return jsonObject.toJSONString();
//    }

    //    @GetMapping("/start")
//    public String test(@RequestParam(value = "url", required = true) String url,
//                       @RequestParam(value = "name", required = true) String name) {
//        url = url.replace("rtsp://", "");
//        String mediaName = getMedia(url);
//
////        CommandTasker query = manager.query(name);
////        if (query == null) {
//        manager.start(name, CommandBuidlerFactory.createBuidler()
//                .add("ffmpeg").add("-f", "rtsp")
//                .add("-rtsp_transport", "tcp")
//                .add("-i", "rtsp://" + url)
//                .add("-c", "copy")
//                .add("-f", "hls")
//                .add("-hls_time", "2.0")
//                .add("-hls_list_size", "1")
//                .add("-hls_wrap", "15")
//                .add("/usr/local/nginx/html/hls/" + mediaName + ".m3u8"));
////        }else{
////            query.setCreateTime(LocalDateTime.now());
////        }
//        JSONObject jsonObject = new JSONObject();
//        jsonObject.put("url", "/hls/" + mediaName + ".m3u8");
//        jsonObject.put("name", name);
//        jsonObject.put("code", 8200);
//        jsonObject.put("message", "请求成功。");
//        return jsonObject.toJSONString();
//    }

    public String getMedia(String rtsp) {
        String ipc = rtsp.substring(rtsp.lastIndexOf(".") + 1, rtsp.length());
        return "m" + ipc;
    }

    @GetMapping("/stop")
    public String stop(String name) {
        manager.stop(name);
        return "停止成功";
    }

    @PreDestroy
    public void destory() {
        manager.stopAll();
    }

    private static final Random RANDOM = new Random();

    private static String getRandomString(int length) {
        String str = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < length; i++) {
            int number = RANDOM.nextInt(62);
            sb.append(str.charAt(number));
        }
        return sb.toString();
    }
}
