-- --- 日志配置 ---
local LOG_LEVELS = { DEBUG = 1, INFO = 2, WARN = 3, ERROR = 4 }
-- 设置当前运行环境的级别：生产环境设为 LOG_LEVELS.WARN (仅显示告警和错误)
local CURRENT_LOG_LEVEL = LOG_LEVELS.ERROR 

-- --- 修改后的日志辅助函数 ---
local function log(level, msg, module)
    -- 核心逻辑：如果当前调用的级别低于设定的阈值，则直接返回，不执行打印
    if (LOG_LEVELS[level] or 0) < CURRENT_LOG_LEVEL then
        return
    end

    local timestamp = os.date("%Y-%m-%d %H:%M:%S")
    local module_name = module or "subtitle_lua"
    print(string.format("[%s] [%s] [%s] %s", timestamp, level, module_name, msg))
end

local function sleep(milliseconds)
    local start = os.time()
    local target = start + (milliseconds / 1000)
    while os.time() < target do
        -- 空循环等待
    end
end


local function debug(msg, module) log("DEBUG", msg, module) end
local function info(msg, module)  log("INFO", msg, module) end
local function warn(msg, module)  log("WARN", msg, module) end
local function error(msg, module) log("ERROR", msg, module) end

-- --- 从 DaVinci Sub Editor.lua 提取并简化的工具函数 ---
local function getTimelineContext()
    debug("获取时间线上下文...") -- 添加日志
    local resolve = resolve or Resolve()
    if not resolve then
        error("无法获取 Resolve 对象") -- 添加日志
        return nil
    end

    local pm = resolve:GetProjectManager()
    local proj = pm and pm:GetCurrentProject()
    if not proj then
        error("无法获取项目") -- 添加日志
        return nil
    end

    local timeline = proj:GetCurrentTimeline()
    if not timeline then
        error("无法获取时间线") -- 添加日志
        return nil
    end

    local mp = proj:GetMediaPool()
    if not mp then
        error("无法获取媒体池") -- 添加日志
        return nil
    end

    local root = mp:GetRootFolder()
    if not root then
        error("无法获取媒体池根文件夹") -- 添加日志
        return nil
    end

    info("成功获取时间线上下文") -- 添加日志
    return {
        resolve = resolve,
        projectManager = pm,
        project = proj,
        timeline = timeline,
        mediaPool = mp,
        rootFolder = root
    }
end

-- --- 核心导入函数 ---
function importSubtitleFromPath(path)
    info("开始导入 SRT: " .. tostring(path), "Core") -- 添加日志

    local ctx = getTimelineContext()
    if not ctx then
        error("获取上下文失败", "Core")
        return false, "no_timeline_or_context"
    end

    local timeline = ctx.timeline
    local mediaPool = ctx.mediaPool
    local root = ctx.rootFolder
    local project = ctx.project

    -- 1. 轨道管理：寻找空轨道或新建轨道
    local trackCount = timeline:GetTrackCount("subtitle") or 0
    debug("当前字幕轨道数量: " .. trackCount, "Core") -- 添加日志

    local targetIndex = nil

    for i = 1, trackCount do
        -- 【修改点 1: 移除提前启用】
        -- timeline:SetTrackEnable("subtitle", i, true) -- 不需要这行
        timeline:SetTrackEnable("subtitle", i, false)
        debug("禁用轨道: " .. i, "Core") -- 添加日志

        if not targetIndex then
            local items = timeline:GetItemListInTrack("subtitle", i)
            if not items or #items == 0 then
                targetIndex = i
                debug("找到空轨道作为目标: " .. i, "Core") -- 添加日志
            end
        end
    end

    if not targetIndex then
        info("未发现空轨道，正在新建字幕轨道...", "Core") -- 添加日志
        timeline:AddTrack("subtitle")
        targetIndex = timeline:GetTrackCount("subtitle") or (trackCount + 1)
        debug("新建轨道索引: " .. targetIndex, "Core") -- 添加日志
    else
        debug("使用现有空轨道: " .. targetIndex, "Core") -- 添加日志
    end

    -- 【修改点 2: 移除提前启用】
    -- timeline:SetTrackEnable("subtitle", targetIndex, true) -- 移除这行
    debug("锁定目标轨道索引: " .. targetIndex, "Core") -- 添加日志

    -- 2. 媒体池管理：确保有 'srt' 文件夹 (可选，但与原脚本一致)
    local srtFolder = nil
    local subFolders = root:GetSubFolderList() or {}
    for _, folder in ipairs(subFolders) do
        if folder:GetName() == "srt" then
            srtFolder = folder
            debug("找到 'srt' 文件夹", "Core") -- 添加日志
            break
        end
    end
    if not srtFolder then
        srtFolder = mediaPool:AddSubFolder(root, "srt")
        debug("创建 'srt' 文件夹", "Core") -- 添加日志
    end
    if srtFolder then
        mediaPool:SetCurrentFolder(srtFolder)
        debug("设置媒体池当前文件夹为 'srt'", "Core") -- 添加日志
    end

    -- 3. 导入 SRT 文件到媒体池
    debug("执行 ImportMedia: " .. path, "Core") -- 添加日志
    local imported = mediaPool:ImportMedia({ path })

    -- 4. 查找导入的媒体项 (处理 ImportMedia 可能返回空的情况)
    local mediaItem = nil
    if imported and #imported > 0 then
        mediaItem = imported[#imported] -- 获取最后一个导入的项
        debug("ImportMedia 成功，媒体项名称: " .. mediaItem:GetName(), "Core") -- 添加日志
    else
        warn("ImportMedia 返回空，尝试通过文件名查找...", "Core") -- 添加日志
        -- 容错：尝试通过文件名查找
        local fileName = string.match(path, "([^/\\]+)$") -- 提取文件名
        local searchFolder = srtFolder or root
        local clips = searchFolder:GetClipList() or {}
        for _, clip in ipairs(clips) do
            if clip:GetName() == fileName then
                mediaItem = clip
                info("通过文件名找到媒体项: " .. fileName, "Core") -- 添加日志
                break
            end
        end
    end
    
    if not mediaItem then
        error("无法找到导入的媒体项", "Core") -- 添加日志
        return false, "failed_to_find_imported_media_item_after_ImportMedia"
    end

    project:SetCurrentTimeline(timeline)

    -- 关键：尝试通过读取属性来强制触发 API 等待媒体就绪
    local clipName = mediaItem:GetClipProperty("Clip Name")
    debug("正在校验媒体项就绪状态: " .. tostring(clipName))

    -- 5. 将媒体项追加到时间线
    timeline:SetCurrentTimecode(timeline:GetStartTimecode())

    -- debug("建立新的字幕轨道")
    -- timeline:AddTrack("subtitle")

    debug("执行 AppendToTimeline", "Core") -- 添加日志
    local appendOk = mediaPool:AppendToTimeline({ mediaItem })

    if not appendOk then
        error("AppendToTimeline 失败", "Core") -- 添加日志
        return false, "AppendToTimeline_failed"
    end
    info("AppendToTimeline 成功", "Core") -- 添加日志

    local finalCount = timeline:GetTrackCount("subtitle") or trackCount
    debug("开始清理轨道状态，总轨道数: " .. finalCount, "Core") -- 添加日志
    for i = 1, finalCount do
        if i ~= targetIndex then
            timeline:SetTrackEnable("subtitle", i, false)
            debug("禁用旧轨道: " .. i, "Core") -- 添加日志
        else
            timeline:SetTrackEnable("subtitle", i, true) -- 在这里才启用目标轨道
            debug("启用新轨道: " .. i, "Core") -- 添加日志
        end
    end

    sleep(300)

    debug("第二次执行追加字幕的操作，这是API的BUG要两次执行才能加入到时间线")
    local appendOk2 = mediaPool:AppendToTimeline({ mediaItem })
    timeline:SetCurrentTimecode(timeline:GetStartTimecode())

    local successMsg = string.format("成功导入字幕到新轨道 (Track %d), 媒体项: %s", targetIndex, mediaItem:GetName())
    info(successMsg, "Core") -- 添加日志
    -- 返回成功信息
    return true, successMsg
end

