module Debian.Debianize.Changelog
    ( filterEntries
    , dropFutureEntries
    , findChangelogEntry
    , mergeChangelogEntries
    ) where

import Debian.Changes (ChangeLog(..), ChangeLogEntry(..))
import Debian.Version (DebianVersion)
import Prelude hiding (log)

-- | Apply a filter to the version numbers of the changelog entries.
filterEntries :: (DebianVersion -> Bool) -> ChangeLog -> ChangeLog
filterEntries p (ChangeLog entries) = ChangeLog $ filter (p . logVersion) $ entries

-- | Filter out versions newer than the given one.
dropFutureEntries :: DebianVersion -> ChangeLog -> ChangeLog
dropFutureEntries ver log = filterEntries (<= ver) log

-- | Find the log entry with the given version.
findChangelogEntry :: DebianVersion -> ChangeLog -> Maybe ChangeLogEntry
findChangelogEntry ver log =
    case filterEntries (== ver) log of
      ChangeLog [] -> Nothing
      ChangeLog [x] -> Just x
      _ -> error $ "Multiple version " ++ show ver ++ " changelog entries"

mergeChangelogEntries :: ChangeLogEntry -> ChangeLogEntry -> ChangeLogEntry
mergeChangelogEntries old new =
    old { logComments = logComments old ++ logComments new
        , logDate = logDate new }