module Hix.Managed.Cabal.Print where

import qualified Distribution.Client.SolverInstallPlan as SolverInstallPlan
import Distribution.Client.SolverInstallPlan (ResolverPackage (..), SolverInstallPlan, SolverPlanPackage)
import Distribution.InstalledPackageInfo (InstalledPackageInfo (InstalledPackageInfo, sourcePackageId))
import Distribution.Pretty (pretty)
import Distribution.Solver.Types.InstSolverPackage (InstSolverPackage (InstSolverPackage, instSolverPkgIPI))
import Distribution.Solver.Types.SolverPackage (SolverPackage (..))
import Distribution.Solver.Types.SourcePackage (SourcePackage (..))
import Exon (exon)

import Hix.Data.Monad (M)
import qualified Hix.Log as Log

showPackage :: SolverPlanPackage -> String
showPackage :: SolverPlanPackage -> String
showPackage = \case
  PreExisting InstSolverPackage {instSolverPkgIPI :: InstSolverPackage -> InstalledPackageInfo
instSolverPkgIPI = InstalledPackageInfo {PackageId
sourcePackageId :: InstalledPackageInfo -> PackageId
sourcePackageId :: PackageId
sourcePackageId}} ->
    String
"existing: " String -> String -> String
forall a. Semigroup a => a -> a -> a
<> Doc -> String
forall b a. (Show a, IsString b) => a -> b
show (PackageId -> Doc
forall a. Pretty a => a -> Doc
pretty PackageId
sourcePackageId)
  Configured SolverPackage {solverPkgSource :: forall loc. SolverPackage loc -> SourcePackage loc
solverPkgSource = SourcePackage {PackageId
srcpkgPackageId :: PackageId
srcpkgPackageId :: forall loc. SourcePackage loc -> PackageId
srcpkgPackageId}} ->
    String
"configured: " String -> String -> String
forall a. Semigroup a => a -> a -> a
<> Doc -> String
forall b a. (Show a, IsString b) => a -> b
show (PackageId -> Doc
forall a. Pretty a => a -> Doc
pretty PackageId
srcpkgPackageId)

printPlan :: SolverInstallPlan -> M ()
printPlan :: SolverInstallPlan -> M ()
printPlan SolverInstallPlan
plan = do
  Text -> M ()
Log.info Text
"Plan:"
  [SolverPlanPackage] -> (SolverPlanPackage -> M ()) -> M ()
forall (t :: * -> *) (f :: * -> *) a b.
(Foldable t, Applicative f) =>
t a -> (a -> f b) -> f ()
for_ (SolverInstallPlan -> [SolverPlanPackage]
SolverInstallPlan.toList SolverInstallPlan
plan) \ SolverPlanPackage
pkg ->
    Text -> M ()
Log.infoCont [exon|📦 #{toText (showPackage pkg)}|]