{-# LANGUAGE DeriveAnyClass #-}
{-# LANGUAGE DeriveGeneric  #-}

-- gcc ats-src/libnumbertheory.o -shared -o ats-src/libnumbertheory.so
-- gcc number-theory-ffi_dats.c -c -fPIC -o ats-src/libnumbertheory.o -IATS2-Postiats-include-0.3.8/ -IATS2-Postiats-include-0.3.8/ccomp/runtime/

module Development.Shake.ATS.Type ( ForeignCabal (..)
                                  , Version (..)
                                  , BinaryTarget (..)
                                  ) where

import           Data.Binary    (Binary (..))
import           Data.List      (intercalate)
import qualified Data.Text.Lazy as TL
import           GHC.Generics   (Generic)

-- We should have four build types:
--
-- 1. Static library
--
-- 2. Dynamic library
--
-- 3. Binary
--
-- 4. C sources
--
-- AND variations on these where a Haskell library is to be built
-- Or a C library.

data BinaryTarget = BinaryTarget { cc          :: String -- ^ C compiler to be used.
                                 , cFlags      :: [String] -- ^ Flags to be passed to the C compiler
                                 , libVersion  :: Version
                                 , compilerVer :: Version
                                 , gc          :: Bool -- ^ Whether to configure build for use with the garbage collector.
                                 , libs        :: [String] -- ^ Libraries against which to link
                                 , src         :: String -- ^ Source file for binary.
                                 , hsLibs      :: [ForeignCabal] -- ^ Cabal-based Haskell libraries
                                 , genTargets  :: [(String, String)] -- ^ Files to be run through @hs2ats@.
                                 , binTarget   :: String -- ^ Binary target
                                 }

-- | Data type containing information about Haskell components of a build.
data ForeignCabal = ForeignCabal { cabalFile  :: TL.Text -- ^ @.cabal@ file associated with the library
                                 , objectFile :: TL.Text -- ^ Object file to be generated
                                 }

newtype Version = Version [Integer]
    deriving (Eq, Generic, Binary)

instance Show Version where
    show (Version is) = intercalate "." (show <$> is)