// Copyright 2021 Google LLC
//
// Licensed 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 compliance

import (
	"fmt"
)

// LicenseCondition identifies a recognized license condition by setting the
// corresponding bit.
type LicenseCondition uint16

// LicenseConditionMask is a bitmask for the recognized license conditions.
const LicenseConditionMask = LicenseCondition(0x3ff)

const (
	// UnencumberedCondition identifies public domain or public domain-
	// like license that disclaims copyright.
	UnencumberedCondition = LicenseCondition(0x0001)
	// PermissiveCondition identifies a license without notice or other
	// significant requirements.
	PermissiveCondition = LicenseCondition(0x0002)
	// NoticeCondition identifies a typical open-source license with only
	// notice or attribution requirements.
	NoticeCondition = LicenseCondition(0x0004)
	// ReciprocalCondition identifies a license with requirement to share
	// the module's source only.
	ReciprocalCondition = LicenseCondition(0x0008)
	// RestrictedCondition identifies a license with requirement to share
	// all source code linked to the module's source.
	RestrictedCondition = LicenseCondition(0x0010)
	// RestrictedClasspathExceptionCondition identifies RestrictedCondition
	// waived for dynamic linking from independent modules.
	RestrictedClasspathExceptionCondition = LicenseCondition(0x0020)
	// WeaklyRestrictedCondition identifies a RestrictedCondition waived
	// for dynamic linking.
	WeaklyRestrictedCondition = LicenseCondition(0x0040)
	// ProprietaryCondition identifies a license with source privacy
	// requirements.
	ProprietaryCondition = LicenseCondition(0x0080)
	// ByExceptionOnly identifies a license where policy requires product
	// counsel review prior to use.
	ByExceptionOnlyCondition = LicenseCondition(0x0100)
	// NotAllowedCondition identifies a license with onerous conditions
	// where policy prohibits use.
	NotAllowedCondition = LicenseCondition(0x0200)
)

var (
	// RecognizedConditionNames maps condition strings to LicenseCondition.
	RecognizedConditionNames = map[string]LicenseCondition{
		"unencumbered":                        UnencumberedCondition,
		"permissive":                          PermissiveCondition,
		"notice":                              NoticeCondition,
		"reciprocal":                          ReciprocalCondition,
		"restricted":                          RestrictedCondition,
		"restricted_with_classpath_exception": RestrictedClasspathExceptionCondition,
		"restricted_allows_dynamic_linking":   WeaklyRestrictedCondition,
		"proprietary":                         ProprietaryCondition,
		"by_exception_only":                   ByExceptionOnlyCondition,
		"not_allowed":                         NotAllowedCondition,
	}
)

// Name returns the condition string corresponding to the LicenseCondition.
func (lc LicenseCondition) Name() string {
	switch lc {
	case UnencumberedCondition:
		return "unencumbered"
	case PermissiveCondition:
		return "permissive"
	case NoticeCondition:
		return "notice"
	case ReciprocalCondition:
		return "reciprocal"
	case RestrictedCondition:
		return "restricted"
	case RestrictedClasspathExceptionCondition:
		return "restricted_with_classpath_exception"
	case WeaklyRestrictedCondition:
		return "restricted_allows_dynamic_linking"
	case ProprietaryCondition:
		return "proprietary"
	case ByExceptionOnlyCondition:
		return "by_exception_only"
	case NotAllowedCondition:
		return "not_allowed"
	}
	panic(fmt.Errorf("unrecognized license condition: %04x", lc))
}
