//
// Licensed to Apache Software Foundation (ASF) under one or more contributor
// license agreements. See the NOTICE file distributed with
// this work for additional information regarding copyright
// ownership. Apache Software Foundation (ASF) licenses this file to you under
// the Apache License, Version 2.0 (the "License"); you may
// not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied.  See the License for the
// specific language governing permissions and limitations
// under the License.
package deps

import (
	"fmt"
	"math"
	"strings"
)

type SpdxID string

const (
	Unknown string = "Unknown"
)

// Result is a single item that represents a resolved dependency license.
type Result struct {
	Dependency      string
	LicenseFilePath string
	LicenseContent  string
	LicenseSpdxID   string
}

// Report is a collection of resolved Result.
type Report struct {
	Resolved []*Result
	Skipped  []*Result
}

// Resolve marks the dependency's license is resolved.
func (report *Report) Resolve(result *Result) {
	report.Resolved = append(report.Resolved, result)
}

// Skip marks the dependency's license is skipped for some reasons.
func (report *Report) Skip(result *Result) {
	report.Skipped = append(report.Skipped, result)
}

func (report *Report) String() string {
	dWidth, lWidth := .0, .0
	for _, r := range report.Skipped {
		dWidth = math.Max(float64(len(r.Dependency)), dWidth)
		lWidth = math.Max(float64(len(r.LicenseSpdxID)), lWidth)
	}
	for _, r := range report.Resolved {
		dWidth = math.Max(float64(len(r.Dependency)), dWidth)
		lWidth = math.Max(float64(len(r.LicenseSpdxID)), lWidth)
	}

	rowTemplate := fmt.Sprintf("%%-%dv | %%%dv\n", int(dWidth), int(lWidth))
	s := fmt.Sprintf(rowTemplate, "Dependency", "License")
	s += fmt.Sprintf(rowTemplate, strings.Repeat("-", int(dWidth)), strings.Repeat("-", int(lWidth)))
	for _, r := range report.Resolved {
		s += fmt.Sprintf(rowTemplate, r.Dependency, r.LicenseSpdxID)
	}
	for _, r := range report.Skipped {
		s += fmt.Sprintf(rowTemplate, r.Dependency, Unknown)
	}

	return s
}
