// Copyright 2020 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

package checklicenses

import (
	"fmt"
	"sync"
)

// Metrics is used for instrumentation
type Metrics struct {
	values map[string]uint
	order  []string

	sync.RWMutex
}

func NewMetrics() *Metrics {
	m := &Metrics{
		values: make(map[string]uint),
		order: []string{
			"num_extensions_excluded",
			"num_licensed",
			"num_non_single_license_files",
			"num_one_file_matched_to_multiple_single_licenses",
			"num_one_file_matched_to_one_single_license",
			"num_single_license_file_match",
			"num_single_license_files",
			"num_unlicensed",
			"num_with_project_license",
		},
	}

	for _, key := range m.order {
		m.values[key] = 0
	}
	return m
}

func (metrics *Metrics) increment(key string) {
	metrics.Lock()
	metrics.values[key]++
	metrics.Unlock()
}

func (metrics *Metrics) print() {
	fmt.Println("Metrics:")
	for _, value := range metrics.order {
		fmt.Printf("%s: %d\n", value, metrics.values[value])
	}
}
