package analyzer

import (
	"jirasop/model"
	reasonhandler "jirasop/pkg/analyzer/process/reasonHandler"
	kubepersistentvolumefillingup "jirasop/pkg/analyzer/process/reasonHandler/KubePersistentVolumeFillingUp"
	"jirasop/pkg/infra/cliniccli"
	"jirasop/pkg/infra/config"
	"jirasop/pkg/infra/log"

	"github.com/go-logr/logr"
)

type KubePersistentVolumeFillingUpAnalyzer struct {
	logger                              logr.Logger
	reasonHandlers                      map[string]reasonhandler.ReasonHandler
	kubePersistentVolumeFillingUpConfig config.AlertReasons
}

func NewKubePersistentVolumeFillingUpAnalyzer(logconf config.LogConfig,
	kubePersistentVolumeFillingUpConfig config.AlertReasons,
	clinicCli *cliniccli.ClinicClient) *KubePersistentVolumeFillingUpAnalyzer {
	loggr := log.Logger.WithName("KubePersistentVolumeFillingUpAnalyzer")

	reasonHandlers := make(map[string]reasonhandler.ReasonHandler)
	bc := kubepersistentvolumefillingup.NewBigCompactionHandler(logconf, kubePersistentVolumeFillingUpConfig[`BigCompactionJob`].Params, clinicCli)
	reasonHandlers["BigCompactionJob"] = bc

	gc := kubepersistentvolumefillingup.NewGCLifeHandler(logconf, kubePersistentVolumeFillingUpConfig[`GCLifeConfig`].Params, clinicCli)
	reasonHandlers["GCLifeConfig"] = gc

	ij := kubepersistentvolumefillingup.NewImportJobHandler(logconf, kubePersistentVolumeFillingUpConfig[`ImportJob`].Params, clinicCli)
	reasonHandlers["ImportJob"] = ij

	su := kubepersistentvolumefillingup.NewSpaceUsageTrendHandler(logconf, kubePersistentVolumeFillingUpConfig[`SpaceUsageTrend`].Params, clinicCli)
	reasonHandlers["SpaceUsageTrend"] = su

	return &KubePersistentVolumeFillingUpAnalyzer{logger: loggr, reasonHandlers: reasonHandlers, kubePersistentVolumeFillingUpConfig: kubePersistentVolumeFillingUpConfig}
}

func (ka *KubePersistentVolumeFillingUpAnalyzer) AnalyzeIssue(issue *model.JiraWebhookEvent) (*model.AnalyzeResult, error) {
	analyzeRes := &model.AnalyzeResult{Reasons: make([]*model.AnalyzeReason, 0)}
	for k, v := range ka.reasonHandlers {
		res, err := v.AnalyzeReason(issue)
		if err != nil {
			ka.logger.Error(err, "error when analyze KubePersistentVolumeFillingUp", "reason", k)
			continue
		}
		if res.Is {
			res.Description += `
The *action* for Optional Reason *` + res.Name + `* is: ` + ka.kubePersistentVolumeFillingUpConfig[res.Name].Action + `
`
		}
		analyzeRes.Reasons = append(analyzeRes.Reasons, res)
	}
	return analyzeRes, nil
}
