    -- | Maintainer: Félix Sipma <felix+propellor@gueux.org>

    module Propellor.Property.Prosody where

    import Propellor.Base
    import qualified Propellor.Property.File as File
    import qualified Propellor.Property.Apt as Apt
    import qualified Propellor.Property.Service as Service

    type ConfigFile = [String]

    type Conf = String

    confEnabled :: Conf -> ConfigFile -> RevertableProperty DebianLike DebianLike
    confEnabled conf cf = enable <!> disable
      where
            enable = dir `File.isSymlinkedTo` target
                    `describe` ("prosody conf enabled " ++ conf)
                    `requires` confAvailable conf cf
                    `requires` installed
                    `onChange` reloaded
              where
                    target = confValRelativePath conf
                    dir = confValPath conf
                    confValRelativePath conf' = File.LinkTarget $
                            "../conf.avail" </> conf' <.> "cfg.lua"
            disable = File.notPresent (confValPath conf)
                    `describe` ("prosody conf disabled " ++ conf)
                    `requires` installed
                    `onChange` reloaded

    confAvailable :: Conf -> ConfigFile -> Property DebianLike
    confAvailable conf cf = ("prosody conf available " ++ conf) ==>
            tightenTargets (confAvailPath conf `File.hasContent` (comment : cf))
      where
            comment = "-- deployed with propellor, do not modify"

    confAvailPath :: Conf -> FilePath
    confAvailPath conf = "/etc/prosody/conf.avail" </> conf <.> "cfg.lua"

    confValPath :: Conf -> FilePath
    confValPath conf = "/etc/prosody/conf.d" </> conf <.> "cfg.lua"

    installed :: Property DebianLike
    installed = Apt.installed ["prosody"]

    restarted :: Property DebianLike
    restarted = Service.restarted "prosody"

    reloaded :: Property DebianLike
    reloaded = Service.reloaded "prosody"