content: module Main where
  
  import Data.List (intercalate)
  import OpenTelemetry.ChromeExporter
  import System.Directory (findExecutable)
  import System.Environment (getArgs)
  import System.Exit
  import System.Process
  
  help :: IO ()
  help = do
    putStrLn "Converts eventlog to Tracy format and launches the viewer."
    putStrLn ""
    putStrLn "Usage:"
    putStrLn "  eventlog-to-tracy [--collapse-threads | --split-threads] <application.eventlog>"
    exitFailure
  
  tracyInstallInstructions :: String
  tracyInstallInstructions =
    intercalate
      ", "
      [ "https://github.com/wolfpld/tracy from source",
        "or get it from AUR or nixpkgs"
      ]
  
  callProcessOrExplain :: FilePath -> String -> [String] -> IO ()
  callProcessOrExplain filename instruction args = do
    exists <- findExecutable filename
    case exists of
      Just _ -> callProcess filename args
      Nothing -> do
        putStrLn $ filename <> ": command not found, please install " <> instruction
        exitFailure
  
  main :: IO ()
  main = do
    args <- getArgs
    case args of
      ["-h"] -> help
      ["--help"] -> help
      ["help"] -> help
      [eventlogFile] -> work eventlogFile SplitThreads
      ["--collapse-threads", eventlogFile] -> work eventlogFile CollapseThreads
      ["--split-threads", eventlogFile] -> work eventlogFile SplitThreads
      _ -> help
  
  work :: FilePath -> ThreadPresentation -> IO ()
  work inputFile doWeCollapseThreads = do
    let chromeFile = inputFile ++ ".trace.json"
        tracyFile = inputFile ++ ".tracy"
    putStrLn $ "Converting " <> inputFile <> " to " <> chromeFile <> "..."
    eventlogToChrome inputFile chromeFile doWeCollapseThreads
    callProcessOrExplain "import-chrome" tracyInstallInstructions [chromeFile, tracyFile]
    callProcessOrExplain "Tracy" tracyInstallInstructions [tracyFile]
  