content: {-# LANGUAGE DeriveGeneric #-}
  
  module FFICXX.Generate.Type.Cabal where
  
  import Data.Aeson
    ( FromJSON (..),
      ToJSON (..),
      defaultOptions,
      genericParseJSON,
      genericToJSON,
    )
  import Data.Aeson.Types (fieldLabelModifier)
  import Data.Text (Text)
  import GHC.Generics (Generic)
  
  -- | additionally embedded include files
  data AddCInc
    = AddCInc
        FilePath
        -- ^ target file path
        String
        -- ^ content
  
  -- | additionally embedded C/C++ source files
  data AddCSrc
    = AddCSrc
        FilePath
        -- ^ target file path
        String
        -- ^ content
  
  -- TODO: change String to Text
  newtype CabalName = CabalName {unCabalName :: String}
    deriving (Show, Eq, Ord)
  
  data BuildType
    = Simple
    | -- | dependencies
      Custom [CabalName]
  
  -- TODO: change String to Text
  data Cabal = Cabal
    { cabal_pkgname :: CabalName,
      cabal_version :: String,
      cabal_cheaderprefix :: String,
      cabal_moduleprefix :: String,
      cabal_additional_c_incs :: [AddCInc],
      cabal_additional_c_srcs :: [AddCSrc],
      cabal_additional_pkgdeps :: [CabalName],
      cabal_license :: Maybe String,
      cabal_licensefile :: Maybe String,
      cabal_extraincludedirs :: [FilePath],
      cabal_extralibdirs :: [FilePath],
      cabal_extrafiles :: [FilePath],
      cabal_pkg_config_depends :: [String],
      cabal_buildType :: BuildType
    }
  
  data GeneratedCabalInfo = GeneratedCabalInfo
    { gci_pkgname :: Text,
      gci_version :: Text,
      gci_synopsis :: Text,
      gci_description :: Text,
      gci_homepage :: Text,
      gci_license :: Text,
      gci_licenseFile :: Text,
      gci_author :: Text,
      gci_maintainer :: Text,
      gci_category :: Text,
      gci_buildtype :: Text,
      gci_extraFiles :: [Text],
      gci_csrcFiles :: [Text],
      gci_sourcerepository :: Text,
      gci_cxxOptions :: [Text],
      gci_pkgdeps :: [Text],
      gci_exposedModules :: [Text],
      gci_otherModules :: [Text],
      gci_extraLibDirs :: [Text],
      gci_extraLibraries :: [Text],
      gci_extraIncludeDirs :: [Text],
      gci_pkgconfigDepends :: [Text],
      gci_includeFiles :: [Text],
      gci_cppFiles :: [Text]
    }
    deriving (Show, Generic)
  
  instance ToJSON GeneratedCabalInfo where
    toJSON = genericToJSON defaultOptions {fieldLabelModifier = drop 4}
  
  instance FromJSON GeneratedCabalInfo where
    parseJSON = genericParseJSON defaultOptions {fieldLabelModifier = drop 4}
  