{-# LANGUAGE OverloadedStrings #-}

-- |
-- Module: BDCS.RPM.Scripts
-- Copyright: (c) 2016-2017 Red Hat, Inc.
-- License: LGPL
--
-- Maintainer: https://github.com/weldr
-- Stability: alpha
-- Portability: portable
--
-- 'Scripts' record support for RPM packages.

module BDCS.RPM.Scripts(mkScripts,
                        mkTriggerScripts)
 where

import Codec.RPM.Tags(Tag, findStringListTag, findTag, findWord32ListTag, tagValue)
import Data.List(zip6)
import Data.Maybe(catMaybes)
import Data.Text(pack)

import BDCS.DB(Scripts(..))

-- | Return a list of 'Scripts' records
mkScripts :: [Tag] -> [Scripts]
mkScripts tags = catMaybes [
    findTag "PreIn"  tags >>= \t -> (tagValue t :: Maybe String) >>= \body -> Just $ Scripts "PreIn"  (pack body) Nothing Nothing Nothing Nothing Nothing,
    findTag "PostIn" tags >>= \t -> (tagValue t :: Maybe String) >>= \body -> Just $ Scripts "PostIn" (pack body) Nothing Nothing Nothing Nothing Nothing,
    findTag "PreUn"  tags >>= \t -> (tagValue t :: Maybe String) >>= \body -> Just $ Scripts "PreUn"  (pack body) Nothing Nothing Nothing Nothing Nothing,
    findTag "PostUn" tags >>= \t -> (tagValue t :: Maybe String) >>= \body -> Just $ Scripts "PostUn" (pack body) Nothing Nothing Nothing Nothing Nothing,

    findTag "PreTrans" tags  >>= \t -> (tagValue t :: Maybe String) >>= \body -> Just $ Scripts "PreTrans" (pack body) Nothing Nothing Nothing Nothing Nothing,
    findTag "PostTrans" tags >>= \t -> (tagValue t :: Maybe String) >>= \body -> Just $ Scripts "PostTrans" (pack body) Nothing Nothing Nothing Nothing Nothing
 ]

-- | Return a list of trigger scripts
mkTriggerScripts :: [Tag] -> [Scripts]
mkTriggerScripts tags = let
    bodies = map pack         $ findStringListTag "TriggerScripts"    tags
    names  = map pack         $ findStringListTag "TriggerName"       tags
    vers   = map pack         $ findStringListTag "TriggerVersion"    tags
    flags  = map fromIntegral $ findWord32ListTag "TriggerFlags"      tags
    ndxs   = map fromIntegral $ findWord32ListTag "TriggerIndex"      tags
    progs  = map pack         $ findStringListTag "TriggerScriptProg" tags
 in
    map (\(b, n, v, f, x, p) -> Scripts "Trigger" b (Just p) (Just x) (Just n) (Just v) (Just f))
        (zip6 bodies names vers flags ndxs progs)