package config_parser

import (
	"config"
	"flag"
	"fmt"
	"privacy"
)

var privacyEncodingParamsFile = flag.String("privacy_encoding_params_file", "", "File containing precomputed privacy encoding parameters.")

func PopulatePrivacyParams(configs []ProjectConfig) error {
	if *privacyEncodingParamsFile == "" {
		return fmt.Errorf("Missing required flag --privacy_encoding_params_file.")
	}

	calc, err := privacy.NewPrivacyEncodingParamsCalculator(*privacyEncodingParamsFile)
	if err != nil {
		return err
	}

	for _, c := range configs {
		if err := populateParamsForConfig(calc, &c); err != nil {
			return err
		}
	}

	return nil
}

func populateParamsForConfig(calc *privacy.PrivacyEncodingParamsCalculator, c *ProjectConfig) error {
	for _, metric := range c.ProjectConfig.MetricDefinitions {
		if !Cobalt11MetricTypesSet[metric.MetricType] {
			continue
		}
		for _, report := range metric.Reports {
			if !Cobalt11ReportTypesSet[report.ReportType] {
				continue
			}

			err := populateParamsForReport(calc, metric, report)
			if err != nil {
				return err
			}
		}
	}
	return nil
}

func populateParamsForReport(calc *privacy.PrivacyEncodingParamsCalculator, metric *config.MetricDefinition, report *config.ReportDefinition) (err error) {
	if report.PrivacyLevel <= config.ReportDefinition_NO_ADDED_PRIVACY {
		return nil
	}

	params, err := calc.GetPrivacyEncodingParamsForReport(metric, report)
	if err != nil {
		return err
	}

	report.ProbBitFlip = params.ProbBitFlip
	report.NumIndexPoints = params.NumIndexPoints

	if report.ReportType == config.ReportDefinition_STRING_COUNTS {
		err = populateParamsForStringReport(calc, report)
	}

	return err
}

func populateParamsForStringReport(calc *privacy.PrivacyEncodingParamsCalculator, report *config.ReportDefinition) (err error) {
	report.StringSketchParams, err = calc.GetStringSketchParameters(report)
	return err
}
