{-# LANGUAGE Safe #-}
-----------------------------------------------------------------------------
-- |
-- Module      : Hasmin.Config
-- Copyright   : (c) 2017 Cristian Adrián Ontivero
-- License     : BSD3
-- Stability   : experimental
-- Portability : non-portable
--
-----------------------------------------------------------------------------
module Hasmin.Config (
      Config(..)
    , ColorSettings(..)
    , DimensionSettings(..)
    , GradientSettings(..)
    , FontWeightSettings(..)
    , LetterCase(..)
    , SortingMethod(..)
    , defaultConfig
    , Instructions
    , Commands(..)
    ) where

type Instructions = (Commands, Config)

data Commands = Commands { shouldBeautify :: Bool
                         , shouldCompress :: Bool
                         , file :: FilePath
                         } deriving (Show)

data ColorSettings = ColorMinOff | ColorMinOn
  deriving (Show, Eq)
data DimensionSettings = DimMinOff | DimMinOn
  deriving (Show, Eq)
data GradientSettings = GradientMinOff | GradientMinOn
  deriving (Show, Eq)
data LetterCase = Original  -- ^ Leave letter casing as is.
                | Lowercase -- ^ Lowercase whatever possible to improve gzip compression.
  deriving (Show, Eq)
data SortingMethod = NoSorting | Lexicographical
  deriving (Show, Eq)
data FontWeightSettings = FontWeightMinOff | FontWeightMinOn
  deriving (Show, Eq)

-- TODO: * avoid boolean blindness
--       * Use a more declarative style for the names, e.g. shouldLowercase vs.
--       preferredCasing, shouldSortSelectors vs. selectorSorting, etc.
-- | The configuration used for minifying.
data Config = Config { colorSettings :: ColorSettings
                     , dimensionSettings :: DimensionSettings
                     , gradientSettings :: GradientSettings
                     , shouldUsePropertyTraits :: Bool
                     , shouldCleanRules :: Bool
                     , shouldMinifyTimingFunctions :: Bool
                     , shouldMinifyFilterFunctions :: Bool
                     , shouldRemoveQuotes :: Bool
                     , fontweightSettings :: FontWeightSettings
                     , shouldMinifyTransformOrigin :: Bool
                     , shouldMinifyMicrosyntax :: Bool
                     , shouldMinifyKeyframeSelectors :: Bool
                     , shouldMinifyTransformFunction :: Bool
                     , shouldConvertEscaped :: Bool
                     , shouldConvertNullPercentages :: Bool
                     , shouldRemoveEmptyBlocks :: Bool
                     , shouldRemoveDuplicateSelectors :: Bool
                     , shouldNormalizeQuotes :: Bool
                     , letterCase :: LetterCase
                     , selectorSorting :: SortingMethod
                     , declarationSorting :: SortingMethod
                     } deriving (Show)

-- | A default config with most settings enabled. Used by the minify function,
-- mainly for testing purposes.
defaultConfig :: Config
defaultConfig = Config { colorSettings                  = ColorMinOn
                       , dimensionSettings              = DimMinOn
                       , gradientSettings               = GradientMinOn
                       , shouldUsePropertyTraits        = True
                       , shouldCleanRules               = True
                       , shouldMinifyTimingFunctions    = True
                       , shouldMinifyFilterFunctions    = True
                       , shouldRemoveQuotes             = True
                       , fontweightSettings             = FontWeightMinOn
                       , shouldMinifyTransformOrigin    = True
                       , shouldMinifyMicrosyntax        = True
                       , shouldMinifyKeyframeSelectors  = True
                       , shouldMinifyTransformFunction  = True
                       , shouldConvertEscaped           = True
                       , shouldConvertNullPercentages   = True
                       , shouldRemoveEmptyBlocks        = True
                       , shouldRemoveDuplicateSelectors = True
                       , shouldNormalizeQuotes          = True
                       , letterCase                     = Lowercase
                       , selectorSorting                = NoSorting
                       , declarationSorting             = NoSorting
                       }