module Unison.Codebase.Editor.HandleInput.MoveAll (handleMoveAll) where

import Unison.Cli.Monad (Cli)
import Unison.Cli.Monad qualified as Cli
import Unison.Cli.MonadUtils qualified as Cli
import Unison.Codebase.Editor.HandleInput.MoveBranch (moveBranchFunc)
import Unison.Codebase.Editor.HandleInput.MoveTerm (moveTermSteps)
import Unison.Codebase.Editor.HandleInput.MoveType (moveTypeSteps)
import Unison.Codebase.Editor.Output qualified as Output
import Unison.Codebase.Path qualified as Path
import Unison.HashQualifiedPrime qualified as HQ'
import Unison.Prelude

handleMoveAll :: Bool -> Path.Path' -> Path.Path' -> Text -> Cli ()
handleMoveAll :: Bool -> Path' -> Path' -> Text -> Cli ()
handleMoveAll Bool
hasConfirmed Path'
src' Path'
dest' Text
description = do
  moveBranchFunc <- Bool
-> Path' -> Path' -> Cli (Maybe (Absolute, Branch IO -> Branch IO))
moveBranchFunc Bool
hasConfirmed Path'
src' Path'
dest'
  moveTermTypeSteps <- case (,) <$> Path.split src' <*> Path.split dest' of
    Maybe (Split Path', Split Path')
Nothing -> [(Absolute, Branch0 IO -> Branch0 IO)]
-> Cli [(Absolute, Branch0 IO -> Branch0 IO)]
forall a. a -> Cli a
forall (f :: * -> *) a. Applicative f => a -> f a
pure []
    Just (Split Path' -> HashQualified (Split Path')
forall n. n -> HashQualified n
HQ'.NameOnly -> HashQualified (Split Path')
src, Split Path'
dest) -> do
      termSteps <- HashQualified (Split Path')
-> Split Path' -> Cli [(Absolute, Branch0 IO -> Branch0 IO)]
forall (m :: * -> *).
HashQualified (Split Path')
-> Split Path' -> Cli [(Absolute, Branch0 m -> Branch0 m)]
moveTermSteps HashQualified (Split Path')
src Split Path'
dest
      typeSteps <- moveTypeSteps src dest
      pure (termSteps ++ typeSteps)
  case (moveBranchFunc, moveTermTypeSteps) of
    (Maybe (Absolute, Branch IO -> Branch IO)
Nothing, []) -> Output -> Cli ()
Cli.respond (Path' -> Output
Output.MoveNothingFound Path'
src')
    (Maybe (Absolute, Branch IO -> Branch IO)
mupdates, [(Absolute, Branch0 IO -> Branch0 IO)]
steps) -> do
      pp <- Cli ProjectPath
Cli.getCurrentProjectPath
      Cli.updateAndStepAt description (pp ^. #branch) (maybeToList mupdates) steps
      Cli.respond Output.Success