// SPDX-License-Identifier: Apache-2.0
// Copyright Authors of K9s

package view

import (
	"github.com/derailed/k9s/internal/client"
)

func loadCustomViewers() MetaViewers {
	m := make(MetaViewers, 30)
	coreViewers(m)
	miscViewers(m)
	appsViewers(m)
	rbacViewers(m)
	batchViewers(m)
	crdViewers(m)
	helmViewers(m)

	return m
}

func helmViewers(vv MetaViewers) {
	vv[client.HmGVR] = MetaViewer{
		viewerFn: NewHelmChart,
	}
}

func coreViewers(vv MetaViewers) {
	vv[client.NsGVR] = MetaViewer{
		viewerFn: NewNamespace,
	}
	vv[client.EvGVR] = MetaViewer{
		viewerFn: NewEvent,
	}
	vv[client.PodGVR] = MetaViewer{
		viewerFn: NewPod,
	}
	vv[client.SvcGVR] = MetaViewer{
		viewerFn: NewService,
	}
	vv[client.NodeGVR] = MetaViewer{
		viewerFn: NewNode,
	}
	vv[client.SecGVR] = MetaViewer{
		viewerFn: NewSecret,
	}
	vv[client.PcGVR] = MetaViewer{
		viewerFn: NewPriorityClass,
	}
	vv[client.CmGVR] = MetaViewer{
		viewerFn: NewConfigMap,
	}
	vv[client.SaGVR] = MetaViewer{
		viewerFn: NewServiceAccount,
	}
	vv[client.PvcGVR] = MetaViewer{
		viewerFn: NewPersistentVolumeClaim,
	}
}

func miscViewers(vv MetaViewers) {
	vv[client.WkGVR] = MetaViewer{
		viewerFn: NewWorkload,
	}
	vv[client.CtGVR] = MetaViewer{
		viewerFn: NewContext,
	}
	vv[client.CoGVR] = MetaViewer{
		viewerFn: NewContainer,
	}
	vv[client.ScGVR] = MetaViewer{
		viewerFn: NewImageScan,
	}
	vv[client.PfGVR] = MetaViewer{
		viewerFn: NewPortForward,
	}
	vv[client.SdGVR] = MetaViewer{
		viewerFn: NewScreenDump,
	}
	vv[client.BeGVR] = MetaViewer{
		viewerFn: NewBenchmark,
	}
	vv[client.AliGVR] = MetaViewer{
		viewerFn: NewAlias,
	}
	vv[client.RefGVR] = MetaViewer{
		viewerFn: NewReference,
	}
	vv[client.PuGVR] = MetaViewer{
		viewerFn: NewPulse,
	}
}

func appsViewers(vv MetaViewers) {
	vv[client.DpGVR] = MetaViewer{
		viewerFn: NewDeploy,
	}
	vv[client.RsGVR] = MetaViewer{
		viewerFn: NewReplicaSet,
	}
	vv[client.StsGVR] = MetaViewer{
		viewerFn: NewStatefulSet,
	}
	vv[client.DsGVR] = MetaViewer{
		viewerFn: NewDaemonSet,
	}
}

func rbacViewers(vv MetaViewers) {
	vv[client.RbacGVR] = MetaViewer{
		enterFn: showRules,
	}
	vv[client.UsrGVR] = MetaViewer{
		viewerFn: NewUser,
	}
	vv[client.GrpGVR] = MetaViewer{
		viewerFn: NewGroup,
	}
	vv[client.CrGVR] = MetaViewer{
		enterFn: showRules,
	}
	vv[client.CrbGVR] = MetaViewer{
		enterFn: showRules,
	}
	vv[client.RoGVR] = MetaViewer{
		enterFn: showRules,
	}
	vv[client.RobGVR] = MetaViewer{
		enterFn: showRules,
	}
}

func batchViewers(vv MetaViewers) {
	vv[client.CjGVR] = MetaViewer{
		viewerFn: NewCronJob,
	}
	vv[client.JobGVR] = MetaViewer{
		viewerFn: NewJob,
	}
}

func crdViewers(vv MetaViewers) {
	vv[client.CrdGVR] = MetaViewer{
		viewerFn: NewCRD,
	}
}
