// 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,
			"imports": 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,
			},
		},
	}
}
