module Text.PrettyPrint.MPPPC.OneDim.Pretty where

import Prelude
  hiding
    ( length )
import Data.String
import Data.Text
  hiding
    ( length )

import Text.PrettyPrint.MPPPC.Printable

import System.Console.ANSI
  ( Color
  , ColorIntensity
  , ConsoleIntensity
  , ConsoleLayer
  , SGR
  , Underlining )

data FormatState
  =  FormatState
       { stForeground  :: Maybe (ColorIntensity, Color)
       , stBackground  :: Maybe (ColorIntensity, Color)
       , stIntensity   :: Maybe ConsoleIntensity
       , stUnderlining :: Maybe Underlining }

data Pretty s t
  = Empty
  | Printable s t => Char t
  | Printable s t => Text !Int s
  | Line Bool
  | Cat (Pretty s t) (Pretty s t)
  | Nest Int (Pretty s t)
  | Union (Pretty s t) (Pretty s t)
  | Column  (Int -> Pretty s t)
  | Nesting (Int -> Pretty s t)
  | Color ConsoleLayer ColorIntensity Color (Pretty s t)
  | Intensify ConsoleIntensity (Pretty s t)
  | Underline Underlining (Pretty s t)
  | RestoreFormat FormatState

data SimplePretty s t
  = SimpleEmpty
  | Printable s t => SimpleChar t     (SimplePretty s t)
  | Printable s t => SimpleText Int s (SimplePretty s t)
  | SimpleLine Int (SimplePretty s t)
  | SimpleSGR [SGR] (SimplePretty s t)

instance IsString (Pretty (Seq String Char) (Tok String Char)) where
  fromString = text . fromString
    where
      text s
        | s == seqEmpty = Empty
        | otherwise     = Text (length s) s

instance IsString (Pretty (Seq Text   Char) (Tok Text   Char)) where
  fromString = text . fromString
    where
      text s
        | s == seqEmpty = Empty
        | otherwise     = Text (length s) s