module Data.Graph.Visualize
    ( plotIO
    , plotXdgIO
    ) where

import Data.GraphViz
import Data.GraphViz.Attributes.Complete
import Data.Hashable
import Data.Monoid                       ((<>))
import System.Process

import qualified Data.Graph.Graph as G
import           Data.Graph.Types

-- | Plot an undirected 'Graph' to a PNG image file
plotIO :: (Show e) => G.Graph Int e -> FilePath -> IO FilePath
plotIO g fp = addExtension (runGraphvizCommand Sfdp $ toDot' g) Png fp

-- | Same as 'plotIO' but open the resulting image with /xdg-open/
plotXdgIO :: (Show e) => G.Graph Int e -> FilePath -> IO ()
plotXdgIO g fp = do
    fp' <- plotIO g fp
    _ <- system $ "xdg-open " <> fp'
    return ()

labeledNodes :: (Show v) => G.Graph v e -> [(v, String)]
labeledNodes g = fmap (\v -> (v, show v)) $ G.vertices g

labeledEdges :: (Hashable v, Eq v, Show e) => G.Graph v e -> [(v, v, String)]
labeledEdges g = fmap (\(Edge v1 v2 attr) -> (v1, v2, show attr)) $ G.edges g

toDot' :: (Show e) => G.Graph Int e -> DotGraph Int
toDot' g = graphElemsToDot params (labeledNodes g) (labeledEdges g)
    where params = nonClusteredParams
            { isDirected = False
            , globalAttributes = [GraphAttrs
                [ NodeSep 1, Overlap ScaleOverlaps
                , Shape Circle
                ]]
            }