package config

// ReportingParams holds reporting parameters
type ReportingParams struct {
	Parameters []StepParameters
}

// ReportingParameters is a global variable with values of reporting parameters
var ReportingParameters = ReportingParams{
	Parameters: []StepParameters{
		{
			Name:    "gcpJsonKeyFilePath",
			Aliases: []Alias{{Name: "jsonKeyFilePath"}},
			ResourceRef: []ResourceReference{
				{
					Name:    "gcpFileVaultSecretName",
					Type:    "vaultSecretFile",
					Default: "gcp",
				},
			},
		},
		{
			Name: "gcsFolderPath",
			ResourceRef: []ResourceReference{
				{
					Name:  "commonPipelineEnvironment",
					Param: "custom/gcsFolderPath",
				},
			},
		},
		{
			Name:    "gcsBucketId",
			Aliases: []Alias{{Name: "pipelineId"}},
		},
		{
			Name: "gcsSubFolder",
		},
	},
}

// GetResourceParameters retrieves reporting parameters from a named pipeline resource with a defined path
func (r ReportingParams) GetResourceParameters(path, name string) map[string]interface{} {
	resourceParams := map[string]interface{}{}

	for _, param := range r.Parameters {
		for _, res := range param.ResourceRef {
			if res.Name == name {
				if val := getParameterValue(path, res, param); val != nil {
					resourceParams[param.Name] = val
				}
			}
		}
	}
	return resourceParams
}

func (r ReportingParams) getStepFilters() StepFilters {
	var filters StepFilters
	reportingFilter := r.getReportingFilter()
	filters.All = append(filters.All, reportingFilter...)
	filters.General = append(filters.General, reportingFilter...)
	filters.Steps = append(filters.Steps, reportingFilter...)
	filters.Stages = append(filters.Stages, reportingFilter...)
	return filters
}

func (r ReportingParams) getReportingFilter() []string {
	var reportingFilter []string
	for _, param := range r.Parameters {
		reportingFilter = append(reportingFilter, param.Name)
	}
	reportingFilter = append(reportingFilter, getFilterForResourceReferences(r.Parameters)...)
	return reportingFilter
}

func (s *StepConfig) mixinReportingConfig(configs ...map[string]interface{}) {
	reportingFilter := ReportingParameters.getReportingFilter()
	for _, config := range configs {
		s.mixIn(config, reportingFilter)
	}
}
