{- Types
Gregory W. Schwartz

Collects the types used in the program
-}

{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE DuplicateRecordFields #-}

module Types where

-- Standard
import GHC.Generics

-- Cabal
import qualified Data.ByteString.Lazy.Char8 as B
import Data.Csv

-- Local

newtype ID        = ID Int
newtype Wiggle    = Wiggle Double
newtype Label     = Label B.ByteString deriving (Eq, Ord)
newtype Frequency = Frequency Double

-- Algebraic
data Entity = Clone | Read
data FilterType = Substring | Position deriving (Read)
data Method = Hierarchical | CompareAll deriving (Read)
data AbsoluteOrFraction = Absolute | Fraction

data CurrentMinMax = CurrentMinMax
    { minMaxDLocationNum :: !(Maybe Int, Maybe Int)
    , minMaxSLocationNum :: !(Maybe Int, Maybe Int)
    , minMaxDSubstringLen :: !(Int, Int)
    , minMaxSSubstringLen :: !(Int, Int)
    } deriving (Eq,Ord,Show)

data PrintITD = PrintITD { label           :: !B.ByteString
                         , fHeader         :: !B.ByteString
                         , fSequence       :: !B.ByteString
                         , dSubstring      :: !B.ByteString
                         , dLocations      :: !B.ByteString
                         , dMutations      :: !B.ByteString
                         , sSubstring      :: !B.ByteString
                         , sLocation       :: !B.ByteString
                         , sOtherLocations :: !B.ByteString
                         , classification  :: !B.ByteString
                         }
                deriving (Eq, Ord, Show, Generic)

instance FromNamedRecord PrintITD
instance ToNamedRecord PrintITD
instance DefaultOrdered PrintITD

data ITDInfo = ITDInfo { label           :: !B.ByteString
                       , fHeader         :: !B.ByteString
                       , fSequence       :: !B.ByteString
                       , dSubstring      :: !B.ByteString
                       , dLocations      :: !B.ByteString
                       , dMutations      :: !B.ByteString
                       , sSubstring      :: !B.ByteString
                       , sLocation       :: !B.ByteString
                       , sOtherLocations :: !B.ByteString
                       , classification  :: !B.ByteString
                       , dLocationNum    :: !(Maybe Int)
                       , sLocationNum    :: !(Maybe Int)
                       , dSubstringLen   :: !Int
                       , sSubstringLen   :: !Int
                       }
                deriving (Eq, Ord, Show)

data PrintCollapsedITD = PrintCollapsedITD
    { label           :: !B.ByteString
    , fHeader         :: !B.ByteString
    , fSequence       :: !B.ByteString
    , dSubstring      :: !B.ByteString
    , dLocations      :: !B.ByteString
    , dMutations      :: !B.ByteString
    , sSubstring      :: !B.ByteString
    , sLocation       :: !B.ByteString
    , sOtherLocations :: !B.ByteString
    , classification  :: !B.ByteString
    , frequency       :: !Double
    } deriving (Eq, Ord, Show, Generic)

instance FromNamedRecord PrintCollapsedITD
instance ToNamedRecord PrintCollapsedITD
instance DefaultOrdered PrintCollapsedITD

data PrintWithCloneID = PrintWithCloneID
    { label           :: !B.ByteString
    , fHeader         :: !B.ByteString
    , fSequence       :: !B.ByteString
    , dSubstring      :: !B.ByteString
    , dLocations      :: !B.ByteString
    , dMutations      :: !B.ByteString
    , sSubstring      :: !B.ByteString
    , sLocation       :: !B.ByteString
    , sOtherLocations :: !B.ByteString
    , classification  :: !B.ByteString
    , frequency       :: !Double
    , cloneID         :: !B.ByteString
    } deriving (Eq, Ord, Show, Generic)

instance FromNamedRecord PrintWithCloneID
instance ToNamedRecord PrintWithCloneID
instance DefaultOrdered PrintWithCloneID