package netfilterHelper

import (
	"fmt"
	"strings"
)

func (nh *NetfilterHelper) CleanIPTables(chainPrefix string) error {
	jumpToChainPrefix := fmt.Sprintf("-j %s", chainPrefix)
	for _, table := range []string{"nat", "mangle", "filter"} {
		chainListToDelete := make([]string, 0)

		chains, err := nh.IPTables.ListChains(table)
		if err != nil {
			return fmt.Errorf("listing chains error: %w", err)
		}

		for _, chain := range chains {
			if strings.HasPrefix(chain, chainPrefix) {
				chainListToDelete = append(chainListToDelete, chain)
				continue
			}

			rules, err := nh.IPTables.List(table, chain)
			if err != nil {
				return fmt.Errorf("listing rules error: %w", err)
			}

			for _, rule := range rules {
				if !strings.Contains(rule, jumpToChainPrefix) {
					continue
				}

				ruleSlice := strings.Split(rule, " ")
				if len(ruleSlice) < 2 || ruleSlice[0] != "-A" || ruleSlice[1] != chain {
					continue
				}

				err = nh.IPTables.Delete(table, chain, ruleSlice[2:]...)
				if err != nil {
					return fmt.Errorf("rule deletion error: %w", err)
				}
			}
		}

		for _, chain := range chainListToDelete {
			err = nh.IPTables.ClearAndDeleteChain(table, chain)
			if err != nil {
				return fmt.Errorf("deleting chain error: %w", err)
			}
		}
	}

	return nil
}