-- Store the reference to the currently playing preview
local current_preview = nil

-- Variables for search functionality
local search_query = ""

-- Function to handle search input
function handle_search_input(ctx)
    local changed, text = reaper.ImGui_InputText(ctx, "Search", search_query, 256)
    if changed then
        search_query = text
    end
    return search_query
end

-- Function to create a directory tree and search for files recursively
function create_directory_tree(path, depth)
    -- Enumerate subdirectories and files
    local idx = 0
    while true do
        local subdir = reaper.EnumerateSubdirectories(path, idx)
        if not subdir then break end

        local full_path = path .. "/" .. subdir

        -- Check if the directory matches the search query
        if search_query == "" or subdir:lower():find(search_query:lower(), 1, true) then
            if reaper.ImGui_TreeNode(ctx, subdir) then
                create_directory_tree(full_path, depth + 1)
                reaper.ImGui_TreePop(ctx)
            end
        end

        idx = idx + 1
    end

    -- Enumerate files
    idx = 0
    while true do
        local file = reaper.EnumerateFiles(path, idx)
        if not file then break end

        -- Check if the file matches the search query
        if (file:match("%.wav$") or file:match("%.mp3$")) then
            if search_query:startsWith("body:") then
                -- Search for the query in the file content
                if search_file_content(path .. "/" .. file, search_query:sub(6)) then
                    if reaper.ImGui_Selectable(ctx, file) then
                        preview_file(path .. "/" .. file)
                    end
                end
            elseif search_query == "" or file:lower():find(search_query:lower(), 1, true) then
                if reaper.ImGui_Selectable(ctx, file) then
                    preview_file(path .. "/" .. file)
                end
            end
        end

        idx = idx + 1
    end
end

-- Function to search the content of a file
function search_file_content(file_path, search_term)
    -- Implement your file content search logic here
    -- You can use Reaper's PCM_Source_CreateFromFile and PCM_Source_GetSamples functions
    -- to read the file content and search for the term
    -- Return true if the search term is found in the file content
    return false
end

-- Function to preview a selected file within Reaper
function preview_file(file)
    -- Stop any currently playing preview
    if current_preview then
        reaper.CF_Preview_StopAll()
        current_preview = nil
    end

    -- Create a PCM_Source from the file
    local source = reaper.PCM_Source_CreateFromFile(file)

    -- Create a preview object
    current_preview = reaper.CF_CreatePreview(source)

    -- Start the preview
    local play_success = reaper.CF_Preview_Play(current_preview)
    if not play_success then
        reaper.ShowMessageBox("Failed to play preview: " .. file, "Error", 0)
    end
end

function main()
    reaper.ImGui_SetNextWindowDockID(ctx, -7)
    local retval, is_open = reaper.ImGui_Begin(ctx, "Media Explorer", true)

    if is_open then
        -- Search input box
        search_query = handle_search_input(ctx)

        -- Adjust the indentation spacing

        -- Call the function to create the directory tree and search for files
        create_directory_tree("E:\\Sample Packs\\COLLECTION", 0)
        reaper.defer(main)
    end

    reaper.ImGui_End(ctx)
end

ctx = reaper.ImGui_CreateContext("ctx")
main()