module Azubi.Commands.Install where

import Azubi.Core.Context
import Azubi.Core.Revertable
import Azubi.Core.Command


type Package = String

-- check if installed or not
class (Context a, Revertable a) => Installed a where

    installed :: Package -> a -> [ Command ]
    installed package context =
      if (isRevert context) then
        uninstallCommands
      else
        installCommands
      where
        uninstallCommands =
          [ IfCommand (isInstalled  context package)
            ([ InfoMsg $ "uninstalling " ++ package ] ++ (doUnInstall  context package))
            [ InfoMsg $ package ++ " is not installed" ]
          ]
        installCommands =
          [ IfCommand (isInstalled  context package)
            [ InfoMsg $ package ++ " is already installed" ]
            $ [ InfoMsg $ "installing " ++ package ] ++ doInstall  context package
          ]


    --
    -- exit code of the command decides if it is True or False
    --
    isInstalled :: a -> Package -> BoolCommand

    doInstall   :: a -> Package -> [ Command ]

    doUnInstall :: a -> Package -> [ Command ]