
module IptAdmin.DelChainPage where

import Control.Monad.Error
import Happstack.Server.SimpleHTTP
import IptAdmin.DelChainPage.Render
import IptAdmin.Render
import IptAdmin.System
import IptAdmin.Template
import IptAdmin.Types
import IptAdmin.Utils
import Iptables
import Iptables.Types
import Text.Blaze.Renderer.Pretty (renderHtml)

pageHandlers :: IptAdmin Response
pageHandlers = msum [ methodSP GET pageHandlerGet
                    , methodSP POST pageHandlerPost
                    ]

pageHandlerGet :: IptAdmin Response
pageHandlerGet = do
    tableName <- getInputNonEmptyString "table"
    chainName <- getInputNonEmptyString "chain"
    table <- getTable tableName
    let chainMay = getChainByName chainName table

    case chainMay of
        Nothing -> throwError $ "Invalid chain name: " ++ chainName
        Just chain ->
            if not $ null $ cRules chain
                then
                    return $ buildResponse $ renderHtml $ htmlWrapper $
                        header tableName $ "'" ++ chainName
                                         ++ "' chain is not empty. Please, remove all rules before deleting a chain"
                else
                    let linkedChains = scanTableForLink (cName chain) table
                    in
                    if not $ null linkedChains
                        then return $ buildResponse $ renderHtml $ htmlWrapper $
                            header tableName $ "There are links to the '" ++ chainName
                                             ++ "' chain from chains : " ++ show linkedChains
                                             ++ ". Please, remove all links before deleting a chain"
                        else
                            return $ buildResponse $ renderHtml $ htmlWrapper $ do
                                header tableName $ "Delete '" ++ chainName
                                                 ++ "' user defined chain from '"
                                                 ++ tableName ++ "' table"
                                delChainForm tableName chainName

pageHandlerPost :: IptAdmin Response
pageHandlerPost = do
    tableName <- getInputNonEmptyString "table"
    chainName <- getInputNonEmptyString "chain"
    table <- getTable tableName
    let chainMay = getChainByName chainName table

    case chainMay of
        Nothing -> throwError $ "Ivalid chain name: " ++ chainName
        Just chain ->
            if not $ null $ cRules chain
                then throwError $ "Chain " ++ chainName
                                ++ " is not empty. Please, remove all rules before deleting a chain"
                else
                    let linkedChains = scanTableForLink (cName chain) table
                    in
                    if not $ null linkedChains
                        then throwError $ "There are links to the '"
                                        ++ chainName ++ "' chain from chains : "
                                        ++ show linkedChains
                        else do
                            tryChange $ deleteChain tableName chainName
                            -- redir $ "/show?table=" ++ tableName
                            return $ buildResponse "ok"
