module Mensam.API.Pretty where

import Data.Kind
import Data.Text qualified as Text
import Data.Text.Encoding qualified as Text.Encoding
import Data.Time.Format.ISO8601 qualified as Time
import Data.Time.LocalTime qualified as Time
import Data.Time.Zones.All qualified as Time
import Text.Blaze.Html5 qualified as Html5

type ToPrettyText :: Type -> Constraint
class ToPrettyText a where
  toPrettyText :: a -> Text.Text

type ToPrettyHtml5 :: Type -> Constraint
class ToPrettyHtml5 a where
  toPrettyHtml5 :: a -> Html5.Html

type PrettyTextViaShow :: Type -> Type
newtype PrettyTextViaShow a = MkPrettyTextViaShow {forall a. PrettyTextViaShow a -> a
unPrettyTextViaShow :: a}

instance Show a => ToPrettyText (PrettyTextViaShow a) where
  toPrettyText :: PrettyTextViaShow a -> Text
toPrettyText = String -> Text
Text.pack (String -> Text)
-> (PrettyTextViaShow a -> String) -> PrettyTextViaShow a -> Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> String
forall a. Show a => a -> String
show (a -> String)
-> (PrettyTextViaShow a -> a) -> PrettyTextViaShow a -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. PrettyTextViaShow a -> a
forall a. PrettyTextViaShow a -> a
unPrettyTextViaShow

type PrettyHtml5ViaPrettyText :: Type -> Type
newtype PrettyHtml5ViaPrettyText a = MkPrettyHtml5ViaPrettyText {forall a. PrettyHtml5ViaPrettyText a -> a
unPrettyHtml5ViaPrettyText :: a}

instance ToPrettyText a => ToPrettyHtml5 (PrettyHtml5ViaPrettyText a) where
  toPrettyHtml5 :: PrettyHtml5ViaPrettyText a -> Html
toPrettyHtml5 = Text -> Html
forall a. ToMarkup a => a -> Html
Html5.toHtml (Text -> Html)
-> (PrettyHtml5ViaPrettyText a -> Text)
-> PrettyHtml5ViaPrettyText a
-> Html
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> Text
forall a. ToPrettyText a => a -> Text
toPrettyText (a -> Text)
-> (PrettyHtml5ViaPrettyText a -> a)
-> PrettyHtml5ViaPrettyText a
-> Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. PrettyHtml5ViaPrettyText a -> a
forall a. PrettyHtml5ViaPrettyText a -> a
unPrettyHtml5ViaPrettyText

instance ToPrettyText Time.TZLabel where
  toPrettyText :: TZLabel -> Text
toPrettyText = ByteString -> Text
Text.Encoding.decodeUtf8 (ByteString -> Text) -> (TZLabel -> ByteString) -> TZLabel -> Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. TZLabel -> ByteString
Time.toTZName

deriving via PrettyHtml5ViaPrettyText Time.TZLabel instance ToPrettyHtml5 Time.TZLabel

instance ToPrettyText Time.LocalTime where
  toPrettyText :: LocalTime -> Text
toPrettyText = String -> Text
Text.pack (String -> Text) -> (LocalTime -> String) -> LocalTime -> Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. LocalTime -> String
forall t. ISO8601 t => t -> String
Time.iso8601Show

deriving via PrettyHtml5ViaPrettyText Time.LocalTime instance ToPrettyHtml5 Time.LocalTime