-- | 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
       (Map PackageName Int -> Identity (Map PackageName Int))
-> CabalInfo -> Identity CabalInfo
Lens' CabalInfo (Map PackageName Int)
A.epochMap ((Map PackageName Int -> Identity (Map PackageName Int))
 -> CabalInfo -> Identity CabalInfo)
-> (Map PackageName Int -> Map PackageName Int) -> CabalT m ()
forall s (m :: * -> *) a b.
MonadState s m =>
ASetter s s a b -> (a -> b) -> m ()
%= PackageName -> Int -> Map PackageName Int -> Map PackageName Int
forall k a. Ord k => k -> a -> Map k a -> Map k a
Map.insert (String -> PackageName
mkPackageName String
"HaXml") Int
1
       (Map PackageName Int -> Identity (Map PackageName Int))
-> CabalInfo -> Identity CabalInfo
Lens' CabalInfo (Map PackageName Int)
A.epochMap ((Map PackageName Int -> Identity (Map PackageName Int))
 -> CabalInfo -> Identity CabalInfo)
-> (Map PackageName Int -> Map PackageName Int) -> CabalT m ()
forall s (m :: * -> *) a b.
MonadState s m =>
ASetter s s a b -> (a -> b) -> m ()
%= PackageName -> Int -> Map PackageName Int -> Map PackageName Int
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
       (String -> CabalT m ()) -> [String] -> CabalT m ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ (\String
name -> ((DebInfo -> Identity DebInfo) -> CabalInfo -> Identity CabalInfo
Lens' CabalInfo DebInfo
A.debInfo ((DebInfo -> Identity DebInfo) -> CabalInfo -> Identity CabalInfo)
-> ((Map String Relations -> Identity (Map String Relations))
    -> DebInfo -> Identity DebInfo)
-> (Map String Relations -> Identity (Map String Relations))
-> CabalInfo
-> Identity CabalInfo
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Map String Relations -> Identity (Map String Relations))
-> DebInfo -> Identity DebInfo
Lens' DebInfo (Map String Relations)
D.execMap) ((Map String Relations -> Identity (Map String Relations))
 -> CabalInfo -> Identity CabalInfo)
-> (Map String Relations -> Map String Relations) -> CabalT m ()
forall s (m :: * -> *) a b.
MonadState s m =>
ASetter s s a b -> (a -> b) -> m ()
%= String -> Relations -> Map String Relations -> Map String Relations
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) Maybe VersionReq
forall a. Maybe a
Nothing Maybe ArchitectureReq
forall a. Maybe a
Nothing]])
            [String
"alex", String
"c2hs", String
"ghc", String
"happy", String
"hsx2hs"]
       PackageName -> DebBase -> CabalT m ()
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
       PackageName -> DebBase -> CabalT m ()
forall (m :: * -> *).
Monad m =>
PackageName -> DebBase -> CabalT m ()
mapCabal (String -> PackageName
mkPackageName String
"gtk2hs-buildtools") (String -> DebBase
DebBase String
"gtk2hs-buildtools")
       PackageName -> DebBase -> CabalT m ()
forall (m :: * -> *).
Monad m =>
PackageName -> DebBase -> CabalT m ()
mapCabal (String -> PackageName
mkPackageName String
"haskell-src-exts") (String -> DebBase
DebBase String
"src-exts")
       PackageName -> DebBase -> CabalT m ()
forall (m :: * -> *).
Monad m =>
PackageName -> DebBase -> CabalT m ()
mapCabal (String -> PackageName
mkPackageName String
"haskell-src-exts-simple") (String -> DebBase
DebBase String
"src-exts-simple")
       PackageName -> DebBase -> CabalT m ()
forall (m :: * -> *).
Monad m =>
PackageName -> DebBase -> CabalT m ()
mapCabal (String -> PackageName
mkPackageName String
"haskell-src-exts-util") (String -> DebBase
DebBase String
"src-exts-util")
       PackageName -> DebBase -> CabalT m ()
forall (m :: * -> *).
Monad m =>
PackageName -> DebBase -> CabalT m ()
mapCabal (String -> PackageName
mkPackageName String
"haskell-src-meta") (String -> DebBase
DebBase String
"src-meta")
       PackageName -> DebBase -> CabalT m ()
forall (m :: * -> *).
Monad m =>
PackageName -> DebBase -> CabalT m ()
mapCabal (String -> PackageName
mkPackageName String
"Cabal") (String -> DebBase
DebBase String
"cabal")

       PackageName -> DebBase -> CabalT m ()
forall (m :: * -> *).
Monad m =>
PackageName -> DebBase -> CabalT m ()
mapCabal (String -> PackageName
mkPackageName String
"happstack-authenticate") (String -> DebBase
DebBase String
"happstack-authenticate")
       PackageName -> DebBase -> Version -> CabalT m ()
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])