package networkpolicy

import (
	"context"

	netv1 "k8s.io/api/networking/v1"
	"k8s.io/apimachinery/pkg/api/errors"

	"github.com/tidbcloud/infra-provider/network-policy-controller/pkg/apply"
)

func (r *Reconciler) sync(ctx context.Context, ns, name string) error {
	var np *netv1.NetworkPolicy
	switch name {
	case PolicyDefaultDeny:
		np = r.NewPolicyDefaultDeny(ns)
	case PolicyAllowAllInNamespace:
		np = r.NewPolicyAllowAllInNamespce(ns)
	case PolicyAllowToDNS:
		np = r.NewPolicyAllowToDNS(ns)
	case PolicyAllowFromDBaaSProxy:
		np = r.NewPolicyAllowFromDBaaSProxy(ns)
	case PolicyAllowFromSliReporter:
		np = r.NewPolicyAllowFromSliReporter(ns)
	case PolicyForO11yVectorAgent:
		np = r.NewPolicyForO11yVectorAgent(ns)
	case PolicyForO11yVMAgent:
		np = r.NewPolicyForO11yVMAgent(ns)
	case PolicyForTiDBDiscovery:
		np = r.NewPolicyForTiDBDiscovery(ns)
	case PolicyForPD:
		np = r.NewPolicyForPD(ns)
	case PolicyForTiDB:
		np = r.NewPolicyForTiDB(ns)
	case PolicyForTiKV:
		np = r.NewPolicyForTiKV(ns)
	case PolicyForTiFlash:
		np = r.NewPolicyForTiFlash(ns)
	case PolicyForBR:
		np = r.NewPolicyForBR(ns)
	case PolicyForTiDBLightning:
		np = r.NewPolicyForTiDBLightning(ns)
	case PolicyForTiDBMonitor:
		np = r.NewPolicyForTiDBMonitor(ns)
	default:
		if err := r.Applier.Delete(ctx, apply.NewObject[*netv1.NetworkPolicy](ns, name)); err != nil {
			if errors.IsNotFound(err) {
				return nil
			}

			return err
		}

		return nil
	}

	if _, err := apply.Expected(r.Applier, np).Apply(ctx); err != nil {
		return err
	}

	return nil
}
