{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE TypeSynonymInstances #-}

module DataFlow.PlantUML.Renderer (
    renderPlantUML
  ) where

import Text.Printf
import DataFlow.PrettyRenderer
import DataFlow.PlantUML

class Renderable t where
  render :: t -> Renderer ()

instance Renderable Stmt where
  render (SkinParam name value) = do
    write "skinparam "
    write name
    write " "
    writeln value
  render (Box name stmts) = do
    writeln $ printf "box \"%s\"" name
    withIndent $ render stmts
    writeln "end box"
  render (Participant id' name) =
    writeln $ printf "participant \"%s\" as %s" name id'
  render (Database id' name) =
    writeln $ printf "database \"%s\" as %s" name id'
  render (Entity id' name) =
    writeln $ printf "entity \"%s\" as %s" name id'
  render (Edge i1 i2 description) =
    writeln $ printf "%s -> %s : %s" i1 i2 description


instance Renderable StmtList where
  render = mapM_ render

instance Renderable Diagram where
  render (SequenceDiagram stmts) = do
    writeln "@startuml"
    render stmts
    writeln "@enduml"

renderPlantUML :: Diagram -> String
renderPlantUML = renderWithIndent . render