-- | @release.draft@ input handler
module Unison.Codebase.Editor.HandleInput.ReleaseDraft
  ( handleReleaseDraft,
  )
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.Branch (CreateFrom (..), createBranch)
import Unison.Codebase.Editor.Output qualified as Output
import Unison.Prelude
import Unison.Project (Semver)
import Witch (unsafeFrom)

-- | Handle a @release.draft@ command.
handleReleaseDraft :: Semver -> Cli ()
handleReleaseDraft :: Semver -> Cli ()
handleReleaseDraft Semver
ver = do
  ProjectAndBranch Project ProjectBranch
currentProjectAndBranch <- Cli (ProjectAndBranch Project ProjectBranch)
Cli.getCurrentProjectAndBranch

  let branchName :: ProjectBranchName
branchName = forall source target.
(HasCallStack, TryFrom source target, Show source, Typeable source,
 Typeable target) =>
source -> target
unsafeFrom @Text (Text
"releases/drafts/" Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> forall target source. From source target => source -> target
into @Text Semver
ver)

  (ProjectBranchId, ProjectBranchName)
_ <-
    Text
-> CreateFrom
-> Project
-> Transaction ProjectBranchName
-> Cli (ProjectBranchId, ProjectBranchName)
createBranch
      (Text
"release.draft " Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> forall target source. From source target => source -> target
into @Text Semver
ver)
      (ProjectBranch -> CreateFrom
CreateFrom'ParentBranch (ProjectAndBranch Project ProjectBranch
currentProjectAndBranch ProjectAndBranch Project ProjectBranch
-> Getting
     ProjectBranch
     (ProjectAndBranch Project ProjectBranch)
     ProjectBranch
-> ProjectBranch
forall s a. s -> Getting a s a -> a
^. Getting
  ProjectBranch
  (ProjectAndBranch Project ProjectBranch)
  ProjectBranch
#branch))
      (ProjectAndBranch Project ProjectBranch
currentProjectAndBranch ProjectAndBranch Project ProjectBranch
-> Getting Project (ProjectAndBranch Project ProjectBranch) Project
-> Project
forall s a. s -> Getting a s a -> a
^. Getting Project (ProjectAndBranch Project ProjectBranch) Project
#project)
      (ProjectBranchName -> Transaction ProjectBranchName
forall a. a -> Transaction a
forall (f :: * -> *) a. Applicative f => a -> f a
pure ProjectBranchName
branchName)

  Output -> Cli ()
Cli.respond (ProjectBranchName -> Semver -> Output
Output.DraftingRelease ProjectBranchName
branchName Semver
ver)