module Changelogged.Bump.Local where

import Turtle
import Prelude hiding (FilePath)

import Control.Exception
import qualified Control.Foldl as Fold

import Data.Maybe (fromMaybe, listToMaybe)
import Data.Text (Text)

import Filesystem.Path.CurrentOS (encodeString)
import System.Console.ANSI (Color(..))

import Changelogged.Types
import Changelogged.Utils
import Changelogged.Pure
import Changelogged.Pattern
import Changelogged.Bump.Common
import Changelogged.Config

-- |Get current local version.
currentLocalVersion :: VersionFile -> IO Text
currentLocalVersion VersionFile{..} = do
  ver <- fold (grep (has (text versionFileVersionPattern)) (input versionFilePath)) Fold.head
  return $ case ver of
    Just realVer -> fromMaybe
      (throw (PatternMatchFail $ "cannot get local version. Given variable " <> show versionFileVersionPattern <> " doesn't store version. Check config.\n"))
      (versionMatch . lineToText $ realVer)
    Nothing -> throw (PatternMatchFail $ "cannot get local version. Cannot find given variable " <> show versionFileVersionPattern <> " in file " <> encodeString versionFilePath <> ". Check config.\n")

-- |Generate new local version.
generateLocalVersion :: Level -> VersionFile -> IO Text
generateLocalVersion lev indicator = do
  current <- currentLocalVersion indicator
  -- This print must not be here but I think it's better than throw current vrsion to main.
  printf ("Version: "%s%" -> ") current
  coloredPrint Yellow (new current <> "\n")
  return (new current)
  where
    new current = bump (delimited current) lev

-- |Infer new local version.
generateLocalVersionByChangelog :: ChangelogConfig -> IO (Maybe Text)
generateLocalVersionByChangelog ChangelogConfig{..} = do
  versionedChanges <- getChangelogEntries changelogChangelog
  case versionedChanges of
    Just lev -> do
      case changelogVersionFiles of
        Nothing -> error "No file version files specified for changelog."
        Just versionFiles -> do
          localVersions <- mapM (generateLocalVersion lev) versionFiles
          return (listToMaybe localVersions) -- FIXME: don't ignore other version files
    Nothing -> do
      warning $ "keeping current version since " <> showPath changelogChangelog <> " apparently does not contain any new entries"
      return Nothing