//
//  PQVideoMakeEventTrackModel.swift
//  PQSpeed
//
//  Created by SanW on 2021/3/3.
//  Copyright © 2021 BytesFlow. All rights reserved.
//

import UIKit
import BFCommonKit

public class PQVideoMakeEventTrackModel: NSObject {
    // 进入创作工具的入口
    public var entrance: videoMakeEntranceType = .entrancePublicTabCompose {
        didSet {
            isPureUploadVideo = entrance == .entrancePublicTabUpload
            isReproduction = entrance == .entranceReproduction
        }
    }

    // 草稿 Id
    public var draftId: String?
    // 项目 Id
    public var projectId: String?
    // 再创作视频的父 projectId - 仅「再创作」视频存在
    public var fatherProjectId: String?
    // 再创作视频的根 projectId - 仅「再创作」视频存在
    public var rootProjectId: String?
    // 再编辑视频的父 draftId - 仅「再编辑」视频存在
    public var fatherDraftId: String?

    // 发布标题
    public var title: String?
    // 发布描述
    public var videoDes: String?
    // 发布封面的 URL
    public var coverUrl: String?
    // 发布的视频 Id
    public var videoId: String?

    /**
      用户创作视频所用的时间成本，单位：毫秒（ms）
      （仅包含合成前的时间段，不包含合成后选择封面等时间消耗）
     如果是草稿箱项目，不包含之前累计的时间消耗，仅记录发布这一次的时间消耗
     如果是再创作项目，不包含别人创作的时间消耗，仅记录发布这一次的时间消耗
     如果是多次发布的项目，不包含之前累计的时间消耗，仅记录发布这一次的时间消耗
     */
    public var editTimeCost: Float64 = 0
    // 合成视频所用的时间成本，单位：毫秒（ms）
    public var composeTimeCost: Float64 = 0
    // 上传视频所用的时间成本，单位：毫秒（ms）
    public var uploadTimeCost: Float64 = 0

    // 是否为纯上传视频 纯上传视频：true 加工工具视频：false
    public var isPureUploadVideo: Bool = false
    // 是否为再创作视频 再创作视频：true 非再创作视频：false
    public var isReproduction: Bool = false
    // 是否为再编辑视频 再编辑视频：true 非再编辑视频：false
    public var isCopyVideo: Bool = false
    // 段落相关-视频中存在的段落个数：number
    public var sectionNum: Int = 1
    // 文字相关 段落中的文字长度信息：number[] [​ section1-text-length, section2-text-length, ... ]
    public var secTextLength: [Int] = Array<Int>.init()
    // 图片 / 视频素材相关 段落中的（本地素材）图片数量：number[] [ section1-localImage-num, section2-localImage-num, ... ]
    public var secLocalImageNum: [Int] = Array<Int>.init()
    // 图片 / 视频素材相关 段落中的（本地素材）动图数量：number[] [ section1-localGif-num, section2-localGif-num, ... ]
    public var secLocalGifNum: [Int] = Array<Int>.init()
    // 图片 / 视频素材相关 段落中的（本地素材）视频数量：number[] [ section1-localVideo-num, section2-localVideo-num, ... ]
    public var secLocalVideoNum: [Int] = Array<Int>.init()
    // 图片/视频素材相关 -段落中的（网络素材）图片数量
    public var secCloudImageNum: [Int] = Array<Int>.init()
    // 图片/视频素材相关 -段落中（网络素材）动图数量
    public var secCloudGifNum: [Int] = Array<Int>.init()
    // 图片/视频素材相关 -段落中（网络素材）视频数量
    public var secCloudVideoNum: [Int] = Array<Int>.init()
    // 文字转语音相关 -段落中使用的语音素材名称，若段落中没有使用则报""
    public var secTextToSpeechMaterial: [String] = Array<String>.init()
    // 文字转语音相关 -段落中文字转语音的毫秒数
    public var secTextToSpeechTime: [Int64] = Array<Int64>.init()
    // 语音转文字相关 -每个段落中使用录音的毫秒数
    public var secSpeechToTextTime: [Int64] = Array<Int64>.init()

    // 开始上传时间
    public var startUploadDate: Float64 = 0
    // 结束上传时间
    public var endUploadDate: Float64 = 0 {
        didSet {
            uploadTimeCost = (endUploadDate - startUploadDate) * 1000
        }
    }

    // 使用音乐的名称（未使用音乐默认为 ""）
    public var musicName: String = ""
    // 使用音乐Id
    public var musicId: String = ""
    // 使用音乐的地址（未使用音乐默认为 ""）
    public var musicUrl: String = ""
    // 音乐的类型（未使用音乐默认为 ""） - original - 原唱 - accompaniment - 伴奏
    public var musicType: String = ""
    // 音乐是否为片段（未使用音乐默认为 ""）- true - 音乐片段 - false - 完整音乐
    public var isMusicClip: Bool = false
    // 画布比例
    public var canvasRatio: String = "original"
    // 卡点视频 使用视频素材数量
    public var syncedUpVideoNumber: Int = 0
    // 卡点视频 使用图片素材数量
    public var syncedUpImageNumber: Int = 0
    // 卡点视频 使用音乐Id
    public var syncedUpMusicId: String = ""
    // 卡点视频 使用音乐名称
    public var syncedUpMusicName: String = ""
    // 卡点视频 合成后视频长度（单位：毫秒）
    public var syncedUpVideoDuration: Float64 = 0
    // 卡点视频 原素材总时长（单位：毫秒）视频：报视频时长 图片：一张图报 1000ms
    public var syncedUpOriginalMaterialDuration: Float64 = 0
    // 卡点视频 视频选用节奏名称（快节奏 1、适中 2、慢节奏 3））
    public var syncedUpRhythmNumber: Int = 2
    
    // add by ak 视频模式
    public var syncedUpVideoType:createStickersModel = .createStickersModelPoint
    //add by ak 设置的速度
    public var syncedUpVideoSpeedMax:Float = 0.0
    public var syncedUpVideoSpeedMin:Float = 0.0
    
    override public init() {
        super.init()
    }

    /// 初始化
    /// - Parameter projectModel: <#projectModel description#>
   public init(projectModel: PQEditProjectModel?, reCreateData: PQReCreateModel?) {
        super.init()
        if projectModel != nil {
            draftId = projectModel?.draftboxId
            projectId = projectModel?.projectId
            sectionNum = projectModel?.sData?.sections.count ?? 1
            if projectModel?.sData?.sections != nil, (projectModel?.sData?.sections.count ?? 0) > 0 {
                for section in (projectModel?.sData?.sections)! {
                    if section.sectionType == "normal" {
                        // 段落中的文字长度信息
                        let voiceType: VOICETYPT? = VOICETYPT(rawValue: section.sectionTimeline?.audioTrack?.audioTrackMaterials.first?.voiceType ?? "")
                        if voiceType == .SPEECH || voiceType == .LOCAL {
                            secTextLength.append(section.getInputSubtitle().count)
                        } else {
                            secTextLength.append(section.sectionText.count)
                        }
                        // 段落中使用的语音素材名称
                        secTextToSpeechMaterial.append(section.sectionTimeline?.audioTrack?.audioTrackMaterials.first?.produceVoiceConfig?.voice ?? "")
                        // 段落中文字转语音的毫秒数
                        var duration: Float64 = 0
                        if voiceType != nil && section.audioFilePath.count > 0 {
                            let audioAsset = AVURLAsset(url: URL(fileURLWithPath: documensDirectory + section.audioFilePath), options: avAssertOptions)
                            duration = Float64(audioAsset.duration.seconds * 1000)
                        }
                        if voiceType == .SPEECH || voiceType == .LOCAL {
                            secSpeechToTextTime.append(Int64(duration))
                            secTextToSpeechTime.append(0)
                        } else {
                            secTextToSpeechTime.append(Int64(duration))
                            secSpeechToTextTime.append(0)
                        }
                        // 本地图片数量
                        var localImageCount: Int = 0
                        // 本地gif数量
                        var localGifCount: Int = 0
                        // 本地视频数量
                        var localVideoCount: Int = 0
                        // 网络图片数量
                        var netImageCount: Int = 0
                        // 网络gif数量
                        var netGifCount: Int = 0
                        // 网络视频数量
                        var netVideoCount: Int = 0
                        if section.sectionTimeline?.visionTrack?.visionTrackMaterials != nil, (section.sectionTimeline?.visionTrack?.visionTrackMaterials.count ?? 0) > 0 {
                            for visionMaterial in (section.sectionTimeline?.visionTrack?.visionTrackMaterials)! {
                                switch visionMaterial.type {
                                case "image":
                                    if visionMaterial.netResCoverImageURL != nil, (visionMaterial.netResCoverImageURL?.count ?? 0) > 0 {
                                        netImageCount += 1
                                    } else {
                                        localImageCount += 1
                                    }
                                case "gif":
                                    if visionMaterial.netResCoverImageURL != nil, (visionMaterial.netResCoverImageURL?.count ?? 0) > 0 {
                                        netGifCount += 1
                                    } else {
                                        localGifCount += 1
                                    }
                                case "video":
                                    if visionMaterial.netResUrl.count > 0 {
                                        netVideoCount += 1
                                    } else {
                                        localVideoCount += 1
                                    }
                                default:
                                    break
                                }
                            }
                        }
                        // 本地素材图片数量
                        secLocalImageNum.append(localImageCount)
                        // 本地素材动图数量
                        secLocalGifNum.append(localGifCount)
                        // 本地素材视频数量
                        secLocalVideoNum.append(localVideoCount)
                        // 网络素材图片数量
                        secCloudImageNum.append(netImageCount)
                        // 网络素材动图数量
                        secCloudGifNum.append(netGifCount)
                        // 网络素材视频数量
                        secCloudVideoNum.append(netVideoCount)
                    } else {
                        sectionNum = sectionNum - 1
                        if sectionNum <= 0 {
                            sectionNum = 1
                        }
                    }
                }
            }
        }
        if reCreateData != nil {
            fatherProjectId = reCreateData?.projectId
            rootProjectId = reCreateData?.rootProjectId ?? reCreateData?.projectId
            fatherDraftId = reCreateData?.draftboxId
        }
    }

    /// 转换为字典
    /// - Returns: <#description#>
    public func toParams() -> [String: Any] {
        var eventTrackDic = Dictionary<String, Any>.init()
        // 进入创作工具的入口
        eventTrackDic["entrance"] = entrance.rawValue
        // 发布的视频 Id
        eventTrackDic["videoId"] = videoId ?? ""
        // 草稿 Id
        eventTrackDic["draftId"] = draftId ?? ""
        // 项目 Id
        eventTrackDic["projectId"] = projectId ?? ""
        // 再创作视频的父 projectId - 仅「再创作」视频存在
        eventTrackDic["fatherProjectId"] = fatherProjectId ?? ""
        // 再创作视频的根 projectId - 仅「再创作」视频存在
        eventTrackDic["rootProjectId"] = rootProjectId ?? ""
        // 再编辑视频的父 draftId - 仅「再编辑」视频存在
        eventTrackDic["fatherDraftId"] = fatherDraftId ?? ""
        // 发布标题
        eventTrackDic["title"] = title ?? ""
        // 发布描述
        eventTrackDic["description"] = videoDes ?? ""
        // 发布封面的 URL
        eventTrackDic["coverUrl"] = coverUrl ?? ""
        /**
          用户创作视频所用的时间成本，单位：毫秒（ms）
          （仅包含合成前的时间段，不包含合成后选择封面等时间消耗）
         如果是草稿箱项目，不包含之前累计的时间消耗，仅记录发布这一次的时间消耗
         如果是再创作项目，不包含别人创作的时间消耗，仅记录发布这一次的时间消耗
         如果是多次发布的项目，不包含之前累计的时间消耗，仅记录发布这一次的时间消耗
         */
        eventTrackDic["editTimeCost"] = Int64(editTimeCost)
        // 合成视频所用的时间成本，单位：毫秒（ms）
        eventTrackDic["composeTimeCost"] = Int64(composeTimeCost)
        // 上传视频所用的时间成本，单位：毫秒（ms）
        eventTrackDic["uploadTimeCost"] = Int64(uploadTimeCost)
        // 是否为纯上传视频 纯上传视频：true 加工工具视频：false
        eventTrackDic["isPureUploadVideo"] = isPureUploadVideo
        // 是否为再创作视频 再创作视频：true 非再创作视频：false
        eventTrackDic["isReproduction"] = isReproduction
        // 是否为再编辑视频 再编辑视频：true 非再编辑视频：false
        eventTrackDic["isCopyVideo"] = isCopyVideo
        // 段落相关-视频中存在的段落个数：number
        eventTrackDic["sectionNum"] = entrance == .entrancePublicTabUpload ? 0 : sectionNum
        // 文字相关 -段落中的文字长度信息
        eventTrackDic["secTextLength"] = secTextLength
        // 图片/视频素材相关 -段落中的（本地素材）图片数量
        eventTrackDic["secLocalImageNum"] = secLocalImageNum
        // 图片/视频素材相关 -段落中的（本地素材）动图数量
        eventTrackDic["secLocalGifNum"] = secLocalGifNum
        // 图片/视频素材相关 -段落中的（本地素材）视频数量
        eventTrackDic["secLocalVideoNum"] = secLocalVideoNum
        // 图片/视频素材相关 -段落中的（网络素材）图片数量
        eventTrackDic["secCloudImageNum"] = secCloudImageNum
        // 图片/视频素材相关 -段落中（网络素材）动图数量
        eventTrackDic["secCloudGifNum"] = secCloudGifNum
        // 图片/视频素材相关 -段落中（网络素材）视频数量
        eventTrackDic["secCloudVideoNum"] = secCloudVideoNum
        // 文字转语音相关 -段落中使用的语音素材名称，若段落中没有使用则报""
        eventTrackDic["secTextToSpeechMaterial"] = secTextToSpeechMaterial
        // 文字转语音相关 -段落中文字转语音的毫秒数
        eventTrackDic["secTextToSpeechTime"] = secTextToSpeechTime
        // 语音转文字相关 -每个段落中使用录音的毫秒数
        eventTrackDic["secSpeechToTextTime"] = secSpeechToTextTime
        // 实验数据abInfoData
        eventTrackDic["abInfoData"] = dictionaryToJsonString(PQSingletoMemoryUtil.shared.abInfoData) ?? ""
        // 使用音乐的名称（未使用音乐默认为 ""）
        eventTrackDic["musicName"] = musicName
        // 使用音乐Id
        eventTrackDic["musicId"] = musicId
        // 使用音乐的地址（未使用音乐默认为 ""）
        eventTrackDic["musicUrl"] = musicUrl
        // 音乐的类型（未使用音乐默认为 ""） - original - 原唱 - accompaniment - 伴奏
        eventTrackDic["musicType"] = musicType
        // 音乐是否为片段（未使用音乐默认为 ""）- true - 音乐片段 - false - 完整音乐
        if musicType.count > 0 {
            eventTrackDic["isMusicClip"] = isMusicClip
        } else {
            eventTrackDic["isMusicClip"] = ""
        }
        // 画布比例
        eventTrackDic["canvasRatio"] = canvasRatio
        // 卡点视频 使用视频素材数量
        eventTrackDic["syncedUpVideoNumber"] = syncedUpVideoNumber
        // 卡点视频 使用图片素材数量
        eventTrackDic["syncedUpImageNumber"] = syncedUpImageNumber
        // 卡点视频 使用音乐Id
        eventTrackDic["syncedUpMusicId"] = syncedUpMusicId
        // 卡点视频 使用音乐名称
        eventTrackDic["syncedUpMusicName"] = syncedUpMusicName
        // 卡点视频 合成后视频长度（单位：毫秒）
        eventTrackDic["syncedUpVideoDuration"] = syncedUpVideoDuration
        // 卡点视频 原素材总时长（单位：毫秒）视频：报视频时长 图片：一张图报 1000ms
        eventTrackDic["syncedUpOriginalMaterialDuration"] = syncedUpOriginalMaterialDuration
        // 卡点视频 视频选用节奏名称（快节奏 1、适中 2、慢节奏 3））
        eventTrackDic["syncedUpRhythmNumber"] = syncedUpRhythmNumber
        
        //-     1：跳跃卡点，2：快慢速，3：仅配乐
        if(syncedUpVideoType == .createStickersModelOnlyMusic){
            eventTrackDic["syncedUpVideoType"] = "3"
            
        }else if(syncedUpVideoType == .createStickersModelPoint){
            eventTrackDic["syncedUpVideoType"] = "1"
        }else if(syncedUpVideoType == .createStickersModelSpeed){
            eventTrackDic["syncedUpVideoType"] = "2"
            eventTrackDic["syncedUpVideoSpeed"] = "[\(syncedUpVideoSpeedMax),\(syncedUpVideoSpeedMin)]"
        }
    
        
        BFLog(message: "创作工具埋点信息数据-\(eventTrackDic)")
        return eventTrackDic
    }
}
