msg = require("mp.msg")
opts = require("mp.options")
utils = require("mp.utils")

options = {
    key = "D",
    active = true,
    client_id = "737663962677510245",
    binary_path = "",
    socket_path = "/tmp/mpvsocket",
    use_static_socket_path = true,
    autohide_threshold = 0
}
opts.read_options(options, "discord")

if options.binary_path == "" then
    msg.fatal("Missing binary path in config file.")
    os.exit(1)
end

function file_exists(path) -- fix(#23): use this instead of utils.file_info
    local f = io.open(path, "r")
    if f ~= nil then io.close(f) return true else return false end
end

if not file_exists(options.binary_path) then
    msg.fatal("The specified binary path does not exist.")
    os.exit(1)
end

version = "1.6.0"
msg.info(("mpv-discord v%s by tnychn"):format(version))

socket_path = options.socket_path
if not options.use_static_socket_path then
    pid = utils.getpid()
    filename = ("mpv-discord-%s"):format(pid)
    if socket_path == "" then
        socket_path = "/tmp/" -- default
    end
    socket_path = utils.join_path(socket_path, filename)
elseif socket_path == "" then
    msg.fatal("Missing socket path in config file.")
    os.exit(1)
end
msg.info(("(mpv-ipc): %s"):format(socket_path))
mp.set_property("input-ipc-server", socket_path)

cmd = nil

function start()
    if cmd == nil then
        cmd = mp.command_native_async({
            name = "subprocess",
            playback_only = false,
            args = {
                options.binary_path,
                socket_path,
                options.client_id
            }
        }, function() end)
        msg.info("launched subprocess")
        mp.osd_message("Discord Rich Presence: Started")
    end
end

function stop()
    mp.abort_async_command(cmd)
    cmd = nil
    msg.info("aborted subprocess")
    mp.osd_message("Discord Rich Presence: Stopped")
end

if options.active then
    mp.register_event("file-loaded", start)
end

mp.add_key_binding(options.key, "toggle-discord", function()
    if cmd ~= nil then stop()
    else start() end
end)

mp.register_event("shutdown", function()
    if cmd ~= nil then stop() end
    if not options.use_static_socket_path then
        os.remove(socket_path)
    end
end)

if options.autohide_threshold > 0 then
    local timer = nil
    local t = options.autohide_threshold
    mp.observe_property("pause", "bool", function(_, value)
        if value == true then
            timer = mp.add_timeout(t, function()
                if cmd ~= nil then stop() end
            end)
        else
            if timer ~= nil then
                timer:kill()
                timer = nil
            end
            if options.active and cmd == nil then start() end
        end
    end)
end