package com.platform.autoconfigure.live;

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;

import java.util.ArrayList;
import java.util.List;

/**
 * 直播配置
 *
 * @Author TONG
 * @Date 2019/2/18 11:39
 **/
@ConfigurationProperties("zkdx.live")
@Data
public class LiveProperties {

    /**
     * 直播账号配置
     */
    private final LiveAccount account = new LiveAccount();
    /**
     * 直播基础配置
     */
    private final LiveCommon common = new LiveCommon();
    /**
     * 直播域名
     */
    private final LiveDomains domains = new LiveDomains();
    /**
     * 直播录制配置
     */
    private final LiveRecord record = new LiveRecord();
    /**
     * 导播台配置
     */
    private final LiveCaster caster = new LiveCaster();
    /**
     * 语音配置
     */
    private final LiveAudio audio = new LiveAudio();
    /**
     * 微信配置
     */
    private final LiveWeixin weixin = new LiveWeixin();
    /**
     * 转码模板
     */
    private List<Template> templates;
    /**
     * 图片压缩
     * */
    private final CompressImage compressImage = new CompressImage();

    @Data
    public static class LiveAccount {
        private String accessKeyId;
        private String secret;
    }

    @Data
    public static class LiveCommon {
        private String regionId = "cn-shanghai";
        private String domain = "live.aliyuncs.com";
        private String version = "2017-03-21";
    }

    @Data
    public static class LiveDomains {
        /**
         * 推流域名
         */
        private Domain push = new Domain();
        /**
         * 播流域名
         */
        private Domain live = new Domain();

        /**
         * 煤资库
         *
         * @author weiyan 20190311
         */
        private Media media = new Media();

    }
    
    @Data
    public static class LiveAudio{
    	/*
    	 * 语音识别
    	 * @author weiyan 20200408
    	 */
    	private Recognition recognition = new Recognition();
    }
    
    @Data
    public static class LiveWeixin {
        private String appId;
        private String appSecret;
    }

    @Data
    public static class LiveCaster {
        /**
         * 输出模板lp_ud: 超清 lp_hd: 高清 lp_sd: 标清 lp_ld: 流畅
         */
        private String casterTemplate = "lp_ud";
        /**
         * 转码输出模板 lld: 流畅 lsd: 标清 lhd: 高清 lud: 超清
         */
        private List<String> liveTemplateIds = new ArrayList<>();

        public void setLiveTemplateIds(List<String> liveTemplateIds) {
            if (liveTemplateIds != null && liveTemplateIds.size() > 0)
                this.liveTemplateIds = liveTemplateIds;
            else {
                switch (this.casterTemplate) {

                    case "lp_ud":
                        liveTemplateIds.add("lld");
                        liveTemplateIds.add("lsd");
                        liveTemplateIds.add("lhd");
                        liveTemplateIds.add("lud");
                        break;
                    case "lp_hd":
                        liveTemplateIds.add("lld");
                        liveTemplateIds.add("lsd");
                        liveTemplateIds.add("lhd");
                        break;
                    case "lp_sd":
                        liveTemplateIds.add("lld");
                        liveTemplateIds.add("lsd");
                        break;
                    case "lp_ld":
                        liveTemplateIds.add("lld");
                        break;
                    default:
                        break;
                }
            }
        }
    }

    @Data
    public static class Domain {
        /**
         * 域名名称
         */
        private String domainName;
        /**
         * URL鉴权key
         */
        private String key;
        /**
         * URL鉴权时间, 默认30分钟
         */
        private Integer authTime = 30 * 60;
    }

    @Data
    public static class Media {

        /**
         * 域名名称
         */
        private String domainName;
        /**
         * 煤资库Bucket名称
         */
        private String bucket;
        /**
         * 煤资库Endpoint域名
         */
        private String endpoint;
        /**
         * 点播服务接入点
         */
        private String apiRegionId;
        /**
         * 模板组ID
         */
        private String templateGroupId;

        public String getTemplateGroupId() {
            return templateGroupId;
        }
    }

    @Data
    public static class LiveRecord {

        /**
         * 加速域名
         */
        private String domainName;
        /**
         * 视频转码模板ID
         */
        private String vodTranscodeGroupIdMp4;

        /**
         * 音频转码模板ID
         */
        private String vodTranscodeGroupIdMp3;

        /**
         * 录制默认分类
         */
        private String vodRecordCategory;
        /**
         * OssBucket名称
         */
        private String ossBucket;
        /**
         * 媒资库Bucket名称
         */
        private String mediaBucket;
        /**
         * OssEndpoint域名
         * oss-cn-shanghai.aliyuncs.com
         */
        private String ossEndpoint = "oss-cn-shanghai.aliyuncs.com";
        /**
         * 按需录制
         * 0表示关闭
         * 1表示通过HTTP回调方式,使用1方式时候需要设置OnDemandCallback，否则默认不录制
         * 2表示通过推流参数方式
         */
        private Integer onDemand;
        /**
         * 直播录制格式
         */
        private final LiveRecordFormat recordFormat = new LiveRecordFormat();


    }

    @Data
    public static class LiveRecordFormat {
        /**
         * 周期录制时长。单位：秒。不填则默认为 6 小时。
         */
        private Integer cycleDuration = 60 * 60 * 6;
        /**
         * 格式。目前支持 m3u8、flv、mp4 周期录制。
         */
        private String recordFormat = "mp4";
        /**
         * OSS 存储的录制文件名
         * live-record/{AppName}/{StreamName}/{EscapedStartTime}_{EscapedEndTime}
         */
        private String ossObjectPrefix = "/{AppName}/{StreamName}/{EscapedStartTime}_{EscapedEndTime}";

        /**
         * 更细后生成回顾地址
         */
        private String ossRecordPrefix = "live-record";
    }

    @Data
    public static class Template {

        /**
         * 模板名称
         */
        String templateName;
        /**
         * 模板id
         */
        String templateId;
        /**
         * 分辨率：宽
         */
        String wide;
        /**
         * 分辨率：高
         */
        String high;
    }

    @Data
    public static class CompressImage{
        /**
         * 图片等比压缩
         * */
        String geometricFormat;
        /**
         * 图片强制宽高压缩
         * */
        String mandatoryFormat;
    }
    
    @Data
    public static class Recognition{
    	/**
    	 * 管控台项目的appkey
    	 */
    	String appKey;
    	/**
         * 服务接入点
         */
    	String regionId;
    	/**
    	 * 服务总结点
    	 */
    	String endpointName;
    	/**
    	 * 产品名称
    	 */
    	String product;
    	/**
    	 * 域名
    	 */
    	String domainName;
    	/**
    	 * API的版本号
    	 */
    	String apiVersion;
    	/**
    	 * post提交的action
    	 */
    	String postRequestAction;
    	/**
    	 * get提交的action
    	 */
    	String getRequestAction;
    	/**
         * 回调域名
         * */
    	String callbackDomainName;
    }
}
