{-# LANGUAGE DeriveGeneric #-}

-- |
-- Module      :  TLynx.Compare.Options
-- Description :  Options for the compare subcommand
-- Copyright   :  (c) Dominik Schrempf 2020
-- License     :  GPL-3.0-or-later
--
-- Maintainer  :  dominik.schrempf@gmail.com
-- Stability   :  unstable
-- Portability :  portable
--
-- Creation date: Thu Sep 19 15:02:21 2019.
module TLynx.Compare.Options
  ( CompareArguments (..),
    compareArguments,
  )
where

import ELynx.Tools
import Options.Applicative
import TLynx.Parsers

-- | Arguments of compare command.
data CompareArguments = CompareArguments
  { argsNormalize :: Bool,
    argsBipartitions :: Bool,
    argsIntersect :: Bool,
    argsNewickFormat :: NewickFormat,
    argsInFiles :: [FilePath]
  }
  deriving (Eq, Show, Generic)

instance Reproducible CompareArguments where
  inFiles = argsInFiles

  -- XXX: The plots are not checked with the ELynx file, because they are not
  -- always created and this is hard with the actual setup.
  outSuffixes _ = [".out"]

  -- outSuffixes a = ".out" : if argsBipartitions a then [".eps", ".pdf"] else []
  getSeed _ = Nothing
  setSeed a _ = a
  parser = compareArguments
  cmdName = "compare"
  cmdDsc =
    [ "Compare two phylogenetic trees (compute distances and branch-wise differences)."
    ]

instance FromJSON CompareArguments

instance ToJSON CompareArguments

-- | Parse arguments of compare command.
compareArguments :: Parser CompareArguments
compareArguments =
  CompareArguments
    <$> normalize
    <*> bipartitions
    <*> intersect
    <*> newickFormat
    <*> file

normalize :: Parser Bool
normalize =
  switch $
    long "normalize" <> short 'n'
      <> help
        "Normalize trees before comparison"

bipartitions :: Parser Bool
bipartitions =
  switch $
    long "bipartitions" <> short 'b'
      <> help
        "Print and plot common and missing bipartitions"

intersect :: Parser Bool
intersect =
  switch $
    long "intersect"
      <> short 't'
      <> help
        "Compare intersections; i.e., before comparison, drop leaves that are not present in the other tree"

file :: Parser [FilePath]
file = some $ strArgument $ metavar "NAMES" <> help "Tree files"