-- | Detailed information about the specific repositories such as
-- debian or seereason - in particular how cabal names are mapped to
-- debian.
{-# LANGUAGE CPP #-}
{-# OPTIONS -Wall #-}
module Debian.Debianize.Details
    ( debianDefaults
    ) where

import Control.Lens
import Data.Map as Map (insert)
import Debian.Debianize.DebianName (mapCabal, splitCabal)
import Debian.Debianize.Monad (CabalT)
import Debian.Debianize.CabalInfo as A (epochMap, debInfo)
import Debian.Debianize.DebInfo as D (execMap)
import Debian.Debianize.VersionSplits (DebBase(DebBase))
import Debian.Relation (BinPkgName(BinPkgName), Relation(Rel))
import Distribution.Package (mkPackageName)
import Distribution.Version (mkVersion)

-- | Update the CabalInfo value in the CabalT state with some details about
-- the debian repository - special cases for how some cabal packages
-- are mapped to debian package names.
debianDefaults :: Monad m => CabalT m ()
debianDefaults :: forall (m :: * -> *). Monad m => CabalT m ()
debianDefaults =
    do -- These are the two epoch names I know about in the debian repo
       Lens' CabalInfo (Map PackageName Int)
A.epochMap forall s (m :: * -> *) a b.
MonadState s m =>
ASetter s s a b -> (a -> b) -> m ()
%= forall k a. Ord k => k -> a -> Map k a -> Map k a
Map.insert (String -> PackageName
mkPackageName String
"HaXml") Int
1
       Lens' CabalInfo (Map PackageName Int)
A.epochMap forall s (m :: * -> *) a b.
MonadState s m =>
ASetter s s a b -> (a -> b) -> m ()
%= forall k a. Ord k => k -> a -> Map k a -> Map k a
Map.insert (String -> PackageName
mkPackageName String
"HTTP") Int
1
       -- Associate some build tools and their corresponding
       -- (eponymous) debian package names
       forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ (\String
name -> (Lens' CabalInfo DebInfo
A.debInfo forall b c a. (b -> c) -> (a -> b) -> a -> c
. Lens' DebInfo (Map String Relations)
D.execMap) forall s (m :: * -> *) a b.
MonadState s m =>
ASetter s s a b -> (a -> b) -> m ()
%= forall k a. Ord k => k -> a -> Map k a -> Map k a
Map.insert String
name [[BinPkgName -> Maybe VersionReq -> Maybe ArchitectureReq -> Relation
Rel (String -> BinPkgName
BinPkgName String
name) forall a. Maybe a
Nothing forall a. Maybe a
Nothing]])
            [String
"alex", String
"c2hs", String
"ghc", String
"happy", String
"hsx2hs"]
       forall (m :: * -> *).
Monad m =>
PackageName -> DebBase -> CabalT m ()
mapCabal (String -> PackageName
mkPackageName String
"QuickCheck") (String -> DebBase
DebBase String
"quickcheck2")
       -- Something was required for this package at one time - it
       -- looks like a no-op now
       forall (m :: * -> *).
Monad m =>
PackageName -> DebBase -> CabalT m ()
mapCabal (String -> PackageName
mkPackageName String
"gtk2hs-buildtools") (String -> DebBase
DebBase String
"gtk2hs-buildtools")
       forall (m :: * -> *).
Monad m =>
PackageName -> DebBase -> CabalT m ()
mapCabal (String -> PackageName
mkPackageName String
"haskell-src-exts") (String -> DebBase
DebBase String
"src-exts")
       forall (m :: * -> *).
Monad m =>
PackageName -> DebBase -> CabalT m ()
mapCabal (String -> PackageName
mkPackageName String
"haskell-src-exts-simple") (String -> DebBase
DebBase String
"src-exts-simple")
       forall (m :: * -> *).
Monad m =>
PackageName -> DebBase -> CabalT m ()
mapCabal (String -> PackageName
mkPackageName String
"haskell-src-exts-util") (String -> DebBase
DebBase String
"src-exts-util")
       forall (m :: * -> *).
Monad m =>
PackageName -> DebBase -> CabalT m ()
mapCabal (String -> PackageName
mkPackageName String
"haskell-src-meta") (String -> DebBase
DebBase String
"src-meta")
       forall (m :: * -> *).
Monad m =>
PackageName -> DebBase -> CabalT m ()
mapCabal (String -> PackageName
mkPackageName String
"Cabal") (String -> DebBase
DebBase String
"cabal")

       forall (m :: * -> *).
Monad m =>
PackageName -> DebBase -> CabalT m ()
mapCabal (String -> PackageName
mkPackageName String
"happstack-authenticate") (String -> DebBase
DebBase String
"happstack-authenticate")
       forall (m :: * -> *).
Monad m =>
PackageName -> DebBase -> Version -> CabalT m ()
splitCabal (String -> PackageName
mkPackageName String
"happstack-authenticate") (String -> DebBase
DebBase String
"happstack-authenticate-0") ([Int] -> Version
mkVersion [Int
2])