-- | Common things among reports

module OrgStat.Outputs.Class
       ( ReportOutput (..)
       ) where

import           Universum

import qualified Data.Text.IO          as T
import qualified Diagrams.Backend.SVG  as DB
import qualified Diagrams.Prelude      as D
import           System.FilePath       (replaceExtension)

import           OrgStat.Outputs.Types (BlockOutput (..), SummaryOutput (..),
                                        TimelineOutput (..))

-- | Things that reporters output an what we can do with them.
class ReportOutput a where
    -- | Writes report to the disk, given path to file.
    writeReport :: (MonadIO m) => FilePath -> a -> m ()

instance ReportOutput TimelineOutput where
    writeReport path (TimelineOutput diagram) =
        liftIO $ DB.renderSVG (replaceExtension path "svg") size diagram
      where
        size = D.dims2D (D.width diagram) (D.height diagram)

instance ReportOutput SummaryOutput where
    writeReport path (SummaryOutput text) =
        liftIO $ T.writeFile (replaceExtension path "txt") text

instance ReportOutput BlockOutput where
    writeReport path (BlockOutput text) =
        liftIO $ T.writeFile (replaceExtension path "txt") text