package rulematcher

import (
	"context"
	"strings"
)

// NetworkRuleMatcher handles matching of network-based rules
type NetworkRuleMatcher struct{}

// Match evaluates network rules against the source IP address
func (n *NetworkRuleMatcher) Match(ctx context.Context, req *MatchRequest) *MatchResult {
	if req.Policy == nil || len(req.Policy.Networks) == 0 {
		return &MatchResult{Matched: false, RuleType: RuleTypeNetwork}
	}

	for _, rule := range req.Policy.Networks {
		for source, targets := range rule {
			networkNum := strings.TrimPrefix(source, "network.")
			nc := req.Config.Network[networkNum]
			if nc == nil {
				continue
			}
			for _, ipNet := range nc.IPNets {
				if ipNet.Contains(req.SourceIP) {
					return &MatchResult{
						Matched:     true,
						Targets:     targets,
						MatchedRule: source,
						RuleType:    RuleTypeNetwork,
					}
				}
			}
		}
	}

	return &MatchResult{Matched: false, RuleType: RuleTypeNetwork}
}
