content: --------------------------------------------------------------------------------
  {-# LANGUAGE TemplateHaskell #-}
  module Patat.Images.Kitty
      ( backend
      ) where
  
  
  --------------------------------------------------------------------------------
  import           Control.Exception     (throwIO)
  import           Control.Monad         (unless, void, when)
  import qualified Data.Aeson            as A
  import           Data.Functor          (($>))
  import qualified Data.List             as L
  import           Patat.Cleanup         (Cleanup)
  import qualified Patat.Images.Internal as Internal
  import           System.Environment    (lookupEnv)
  import qualified System.IO             as IO
  import qualified System.Process        as Process
  
  
  --------------------------------------------------------------------------------
  backend :: Internal.Backend
  backend = Internal.Backend new
  
  
  --------------------------------------------------------------------------------
  data Config = Config deriving (Eq)
  instance A.FromJSON Config where parseJSON _ = return Config
  
  
  --------------------------------------------------------------------------------
  new :: Internal.Config Config -> IO Internal.Handle
  new config = do
      when (config == Internal.Auto) $ do
          term <- lookupEnv "TERM"
          unless (maybe False ("kitty" `L.isInfixOf`) term) $ throwIO $
              Internal.BackendNotSupported "TERM does not indicate kitty"
  
      return Internal.Handle {Internal.hDrawImage = drawImage}
  
  
  --------------------------------------------------------------------------------
  drawImage :: FilePath -> IO Cleanup
  drawImage path = icat ["--align=center", path] $> icat ["--clear"]
    where
      icat args = do
          (Just inh, _, _, ph) <- Process.createProcess (Process.proc "kitty"
              ("+kitten" : "icat" : "--transfer-mode=stream" : "--stdin=no" : args))
              { Process.std_in = Process.CreatePipe
              }
          IO.hClose inh
          void $ Process.waitForProcess ph
  