-- mpv_websocket
-- https://github.com/kuroahna/mpv_websocket

local utils = require("mp.utils")

local platform = mp.get_property_native("platform")

local config_file_path = mp.find_config_file("mpv.conf")
local config_folder_path, config_file = utils.split_path(config_file_path)
local mpv_websocket_path =
  utils.join_path(config_folder_path, platform == "windows" and "mpv_websocket.exe" or "mpv_websocket")
local initialised_websocket

local _, err = utils.file_info(config_file_path)
if err then
  error("failed to open mpv config file `" .. config_file_path .. "`")
end

local _, err = utils.file_info(mpv_websocket_path)
if err then
  error("failed to open mpv_websocket")
end

local function find_mpv_socket(config_file_path)
  local file = io.open(config_file_path, "r")
  if file == nil then
    error("failed to read mpv config file `" .. config_file_path .. "`")
  end

  local mpv_socket
  for line in file:lines() do
    mpv_socket = line:match("^input%-ipc%-server%s*=%s*(%g+)%s*")
    if mpv_socket then
      break
    end
  end

  file:close()

  if not mpv_socket then
    error("input-ipc-server option does not exist in `" .. config_file_path .. "`")
  end

  return mpv_socket
end

local mpv_socket = find_mpv_socket(config_file_path)
if platform == "windows" then
  mpv_socket = "\\\\.\\pipe" .. mpv_socket:gsub("/", "\\")
end

local function start_websocket()
  initialised_websocket = mp.command_native_async({
    name = "subprocess",
    playback_only = false,
    capture_stdout = true,
    capture_stderr = true,
    args = {
      mpv_websocket_path,
      "-m",
      mpv_socket,
      "-w",
      "6677",
    },
  })
end

local function end_websocket()
  mp.abort_async_command(initialised_websocket)
  initialised_websocket = nil
end

local function toggle_websocket()
  local paused = mp.get_property_bool("pause")
  if initialised_websocket and paused then
    end_websocket()
  elseif not initialised_websocket and not paused then
    start_websocket()
  end
end

mp.register_script_message("togglewebsocket", toggle_websocket)
start_websocket()