// Copyright 2023 The Bazel Authors. All rights reserved.
//
// 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 python

import (
	"fmt"

	"github.com/bazelbuild/bazel-gazelle/rule"
)

const (
	pyBinaryKind       = "py_binary"
	pyLibraryKind      = "py_library"
	pyProtoLibraryKind = "py_proto_library"
	pyTestKind         = "py_test"
)

// Kinds returns a map that maps rule names (kinds) and information on how to
// match and merge attributes that may be found in rules of those kinds.
func (*Python) Kinds() map[string]rule.KindInfo {
	return pyKinds
}

var pyKinds = map[string]rule.KindInfo{
	pyBinaryKind: {
		MatchAny:   false,
		MatchAttrs: []string{"srcs"},
		NonEmptyAttrs: map[string]bool{
			"deps":    true,
			"main":    true,
			"srcs":    true,
			"imports": true,
		},
		SubstituteAttrs: map[string]bool{},
		MergeableAttrs: map[string]bool{
			"srcs": true,
		},
		ResolveAttrs: map[string]bool{
			"deps":     true,
			"pyi_deps": true,
		},
	},
	pyLibraryKind: {
		MatchAny:   false,
		MatchAttrs: []string{"srcs"},
		NonEmptyAttrs: map[string]bool{
			"deps":    true,
			"srcs":    true,
			"imports": true,
		},
		SubstituteAttrs: map[string]bool{},
		MergeableAttrs: map[string]bool{
			"srcs": true,
		},
		ResolveAttrs: map[string]bool{
			"deps":     true,
			"pyi_deps": true,
		},
	},
	pyProtoLibraryKind: {
		NonEmptyAttrs: map[string]bool{
			"deps": true,
		},
		ResolveAttrs: map[string]bool{"deps": true},
	},
	pyTestKind: {
		MatchAny: false,
		NonEmptyAttrs: map[string]bool{
			"deps":    true,
			"main":    true,
			"srcs":    true,
			"imports": true,
		},
		SubstituteAttrs: map[string]bool{},
		MergeableAttrs: map[string]bool{
			"srcs": true,
		},
		ResolveAttrs: map[string]bool{
			"deps":     true,
			"pyi_deps": true,
		},
	},
}

func (py *Python) Loads() []rule.LoadInfo {
	panic("ApparentLoads should be called instead")
}

// Loads returns .bzl files and symbols they define. Every rule generated by
// GenerateRules, now or in the past, should be loadable from one of these
// files.
func (py *Python) ApparentLoads(moduleToApparentName func(string) string) []rule.LoadInfo {
	return apparentLoads(moduleToApparentName)
}

func apparentLoads(moduleToApparentName func(string) string) []rule.LoadInfo {
	protobuf := moduleToApparentName("protobuf")
	if protobuf == "" {
		protobuf = "com_google_protobuf"
	}

	return []rule.LoadInfo{
		{
			Name: "@rules_python//python:defs.bzl",
			Symbols: []string{
				pyBinaryKind,
				pyLibraryKind,
				pyTestKind,
			},
		},
		{
			Name: fmt.Sprintf("@%s//bazel:py_proto_library.bzl", protobuf),
			Symbols: []string{
				pyProtoLibraryKind,
			},
		},
	}
}
