-- | Some schemes you can use.

module Penny.Cabin.Scheme.Schemes where

import Data.Monoid ( (<>) )
import qualified Penny.Cabin.Scheme as E
import qualified System.Console.Rainbow as R

-- | 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 = (<> (R.c8_b_default <> R.c256_b_255))

lightDebit :: (R.Chunk -> R.Chunk) -> R.Chunk -> R.Chunk
lightDebit f c = f c <> R.c8_f_magenta <> R.c256_f_52

lightCredit :: (R.Chunk -> R.Chunk) -> R.Chunk -> R.Chunk
lightCredit f c = f c <> R.c8_f_cyan <> R.c256_f_21

lightZero :: (R.Chunk -> R.Chunk) -> R.Chunk -> R.Chunk
lightZero f c = f c <> R.c8_f_black <> R.c256_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 = (<> (R.c8_b_default <> R.c256_b_235))

darkDebit :: (R.Chunk -> R.Chunk) -> R.Chunk -> R.Chunk
darkDebit f c = f c <> R.c8_f_magenta <> R.c256_f_208

darkCredit :: (R.Chunk -> R.Chunk) -> R.Chunk -> R.Chunk
darkCredit f c = f c <> R.c8_f_cyan <> R.c256_f_45

darkZero :: (R.Chunk -> R.Chunk) -> R.Chunk -> R.Chunk
darkZero f c = f c <> R.c8_f_white <> R.c256_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
  }