-- | Some schemes you can use.

module Penny.Cabin.Scheme.Schemes where

import qualified Penny.Cabin.Scheme as E
import qualified System.Console.Rainbow as R
import System.Console.Rainbow ((.+.))

-- | The light color scheme. You can change various values below to
-- affect the color scheme.
light :: E.Scheme
light = E.Scheme "light" "for light background terminals"
              lightLabels

lightLabels :: E.Labels (E.EvenAndOdd (R.Chunk -> R.Chunk))
lightLabels = E.Labels
  { E.debit = E.EvenAndOdd { E.eoEven = lightDebit lightEvenTextSpec
                           , E.eoOdd = lightDebit lightOddTextSpec }
  , E.credit = E.EvenAndOdd { E.eoEven = lightCredit lightEvenTextSpec
                            , E.eoOdd = lightCredit lightOddTextSpec }
  , E.zero = E.EvenAndOdd { E.eoEven = lightZero lightEvenTextSpec
                          , E.eoOdd = lightZero lightOddTextSpec }
  , E.other = E.EvenAndOdd { E.eoEven = lightEvenTextSpec
                           , E.eoOdd = lightOddTextSpec }
  }

lightEvenTextSpec :: R.Chunk -> R.Chunk
lightEvenTextSpec = id

lightOddTextSpec :: R.Chunk -> R.Chunk
lightOddTextSpec = id .+. R.color8_b_default .+. R.color256_b_255

lightDebit :: (R.Chunk -> R.Chunk) -> R.Chunk -> R.Chunk
lightDebit f = f .+. R.color8_f_magenta .+. R.color256_f_52

lightCredit :: (R.Chunk -> R.Chunk) -> R.Chunk -> R.Chunk
lightCredit f = f .+. R.color8_f_cyan .+. R.color256_f_21

lightZero :: (R.Chunk -> R.Chunk) -> R.Chunk -> R.Chunk
lightZero f = f .+. R.color8_f_black .+. R.color256_f_0

-- | The dark color scheme. You can change various values below to
-- affect the color scheme.
dark :: E.Scheme
dark = E.Scheme "dark" "for dark background terminals"
              darkLabels

darkLabels :: E.Labels (E.EvenAndOdd (R.Chunk -> R.Chunk))
darkLabels = E.Labels
  { E.debit = E.EvenAndOdd { E.eoEven = darkDebit darkEvenTextSpec
                           , E.eoOdd = darkDebit darkOddTextSpec }
  , E.credit = E.EvenAndOdd { E.eoEven = darkCredit darkEvenTextSpec
                            , E.eoOdd = darkCredit darkOddTextSpec }
  , E.zero = E.EvenAndOdd { E.eoEven = darkZero darkEvenTextSpec
                          , E.eoOdd = darkZero darkOddTextSpec }
  , E.other = E.EvenAndOdd { E.eoEven = darkEvenTextSpec
                           , E.eoOdd = darkOddTextSpec }
  }

darkEvenTextSpec :: R.Chunk -> R.Chunk
darkEvenTextSpec = id

darkOddTextSpec :: R.Chunk -> R.Chunk
darkOddTextSpec = id .+. R.color8_b_default .+. R.color256_b_235

darkDebit :: (R.Chunk -> R.Chunk) -> R.Chunk -> R.Chunk
darkDebit f = f .+. R.color8_f_magenta .+. R.color256_f_208

darkCredit :: (R.Chunk -> R.Chunk) -> R.Chunk -> R.Chunk
darkCredit f = f .+. R.color8_f_cyan .+. R.color256_f_45

darkZero :: (R.Chunk -> R.Chunk) -> R.Chunk -> R.Chunk
darkZero f = f .+. R.color8_f_white .+. R.color256_f_15

-- | Plain scheme has no colors at all.
plain :: E.Scheme
plain = E.Scheme "plain" "uses default terminal colors"
              plainLabels

plainLabels :: E.Labels (E.EvenAndOdd (R.Chunk -> R.Chunk))
plainLabels = E.Labels
  { E.debit = E.EvenAndOdd id id
  , E.credit = E.EvenAndOdd id id
  , E.zero = E.EvenAndOdd id id
  , E.other = E.EvenAndOdd id id
  }