// Copyright 2018 The Go 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 prototype

import (
	"fmt"
	"reflect"
	"sync"

	"github.com/golang/protobuf/v2/internal/typefmt"
	"github.com/golang/protobuf/v2/internal/value"
	"github.com/golang/protobuf/v2/reflect/protoreflect"
)

// GoEnum creates a new protoreflect.EnumType by combining the provided
// protoreflect.EnumDescriptor with the provided constructor function.
func GoEnum(ed protoreflect.EnumDescriptor, fn func(protoreflect.EnumType, protoreflect.EnumNumber) protoreflect.ProtoEnum) protoreflect.EnumType {
	if ed.IsPlaceholder() {
		panic("enum descriptor must not be a placeholder")
	}
	return &goEnum{EnumDescriptor: ed, new: fn}
}

type goEnum struct {
	protoreflect.EnumDescriptor
	new func(protoreflect.EnumType, protoreflect.EnumNumber) protoreflect.ProtoEnum

	once sync.Once
	typ  reflect.Type
}

func (t *goEnum) GoType() reflect.Type {
	t.New(0) // initialize t.typ
	return t.typ
}
func (t *goEnum) New(n protoreflect.EnumNumber) protoreflect.ProtoEnum {
	e := t.new(t, n)
	t.once.Do(func() { t.typ = reflect.TypeOf(e) })
	if t.typ != reflect.TypeOf(e) {
		panic(fmt.Sprintf("mismatching types for enum: got %T, want %v", e, t.typ))
	}
	return e
}
func (t *goEnum) Format(s fmt.State, r rune) {
	typefmt.FormatDesc(s, r, t)
}

// GoMessage creates a new protoreflect.MessageType by combining the provided
// protoreflect.MessageDescriptor with the provided constructor function.
func GoMessage(md protoreflect.MessageDescriptor, fn func(protoreflect.MessageType) protoreflect.ProtoMessage) protoreflect.MessageType {
	if md.IsPlaceholder() {
		panic("message descriptor must not be a placeholder")
	}
	// NOTE: Avoid calling fn in the constructor since fn itself may depend on
	// this function returning (for cyclic message dependencies).
	return &goMessage{MessageDescriptor: md, new: fn}
}

type goMessage struct {
	protoreflect.MessageDescriptor
	new func(protoreflect.MessageType) protoreflect.ProtoMessage

	once sync.Once
	typ  reflect.Type
}

func (t *goMessage) GoType() reflect.Type {
	t.New() // initialize t.typ
	return t.typ
}
func (t *goMessage) New() protoreflect.ProtoMessage {
	m := t.new(t)
	t.once.Do(func() { t.typ = reflect.TypeOf(m) })
	if t.typ != reflect.TypeOf(m) {
		panic(fmt.Sprintf("mismatching types for message: got %T, want %v", m, t.typ))
	}
	return m
}
func (t *goMessage) Format(s fmt.State, r rune) {
	typefmt.FormatDesc(s, r, t)
}

// GoExtension creates a new protoreflect.ExtensionType.
//
// An enum type must be provided for enum extension fields if
// ExtensionDescriptor.EnumType does not implement protoreflect.EnumType,
// in which case it replaces the original enum in ExtensionDescriptor.
//
// Similarly, a message type must be provided for message extension fields if
// ExtensionDescriptor.MessageType does not implement protoreflect.MessageType,
// in which case it replaces the original message in ExtensionDescriptor.
//
// The Go type is currently determined automatically.
// The type is T for scalars and *[]T for lists (maps are not allowed).
// The type T is determined as follows:
//
//	+------------+-------------------------------------+
//	| Go type    | Protobuf kind                       |
//	+------------+-------------------------------------+
//	| bool       | BoolKind                            |
//	| int32      | Int32Kind, Sint32Kind, Sfixed32Kind |
//	| int64      | Int64Kind, Sint64Kind, Sfixed64Kind |
//	| uint32     | Uint32Kind, Fixed32Kind             |
//	| uint64     | Uint64Kind, Fixed64Kind             |
//	| float32    | FloatKind                           |
//	| float64    | DoubleKind                          |
//	| string     | StringKind                          |
//	| []byte     | BytesKind                           |
//	| E          | EnumKind                            |
//	| M          | MessageKind, GroupKind              |
//	+------------+-------------------------------------+
//
// The type E is the concrete enum type returned by NewEnum,
// which is often, but not required to be, a named int32 type.
// The type M is the concrete message type returned by NewMessage,
// which is often, but not required to be, a pointer to a named struct type.
func GoExtension(xd protoreflect.ExtensionDescriptor, et protoreflect.EnumType, mt protoreflect.MessageType) protoreflect.ExtensionType {
	if xd.ExtendedType() == nil {
		panic("field descriptor does not extend a message")
	}
	switch xd.Kind() {
	case protoreflect.EnumKind:
		if et2, ok := xd.EnumType().(protoreflect.EnumType); ok && et == nil {
			et = et2
		}
		if et == nil {
			panic("enum type not provided for enum kind")
		}
		if mt != nil {
			panic("message type provided for enum kind")
		}
	case protoreflect.MessageKind, protoreflect.GroupKind:
		if mt2, ok := xd.MessageType().(protoreflect.MessageType); ok && mt == nil {
			mt = mt2
		}
		if et != nil {
			panic("enum type provided for message kind")
		}
		if mt == nil {
			panic("message type not provided for message kind")
		}
	default:
		if et != nil || mt != nil {
			panic(fmt.Sprintf("enum or message type provided for %v kind", xd.Kind()))
		}
	}
	return &goExtension{ExtensionDescriptor: xd, enumType: et, messageType: mt}
}

type goExtension struct {
	protoreflect.ExtensionDescriptor
	enumType    protoreflect.EnumType
	messageType protoreflect.MessageType

	once        sync.Once
	typ         reflect.Type
	new         func() interface{}
	valueOf     func(v interface{}) protoreflect.Value
	interfaceOf func(v protoreflect.Value) interface{}
}

func (t *goExtension) EnumType() protoreflect.EnumDescriptor {
	return t.enumType
}
func (t *goExtension) MessageType() protoreflect.MessageDescriptor {
	return t.messageType
}
func (t *goExtension) GoType() reflect.Type {
	t.lazyInit()
	return t.typ
}
func (t *goExtension) New() interface{} {
	t.lazyInit()
	v := t.new()
	if reflect.TypeOf(v) != t.typ {
		panic(fmt.Sprintf("invalid type: got %T, want %v", v, t.typ))
	}
	return v
}
func (t *goExtension) ValueOf(v interface{}) protoreflect.Value {
	t.lazyInit()
	if reflect.TypeOf(v) != t.typ {
		panic(fmt.Sprintf("invalid type: got %T, want %v", v, t.typ))
	}
	return t.valueOf(v)
}
func (t *goExtension) InterfaceOf(pv protoreflect.Value) interface{} {
	t.lazyInit()
	v := t.interfaceOf(pv)
	if reflect.TypeOf(v) != t.typ {
		panic(fmt.Sprintf("invalid type: got %T, want %v", v, t.typ))
	}
	return v
}
func (t *goExtension) Format(s fmt.State, r rune) {
	typefmt.FormatDesc(s, r, t)
}
func (t *goExtension) lazyInit() {
	t.once.Do(func() {
		switch t.Cardinality() {
		case protoreflect.Optional:
			switch t.Kind() {
			case protoreflect.EnumKind:
				t.typ = t.enumType.GoType()
				t.new = func() interface{} {
					return t.enumType.New(t.Default().Enum())
				}
				t.valueOf = func(v interface{}) protoreflect.Value {
					ev := v.(protoreflect.ProtoEnum).ProtoReflect()
					return protoreflect.ValueOf(ev.Number())
				}
				t.interfaceOf = func(pv protoreflect.Value) interface{} {
					return t.enumType.New(pv.Enum())
				}
			case protoreflect.MessageKind, protoreflect.GroupKind:
				t.typ = t.messageType.GoType()
				t.new = func() interface{} {
					return t.messageType.New()
				}
				t.valueOf = func(v interface{}) protoreflect.Value {
					mv := v.(protoreflect.ProtoMessage).ProtoReflect()
					return protoreflect.ValueOf(mv)
				}
				t.interfaceOf = func(pv protoreflect.Value) interface{} {
					return pv.Message().Interface()
				}
			default:
				t.typ = goTypeForPBKind[t.Kind()]
				t.new = func() interface{} {
					return t.Default().Interface()
				}
				t.valueOf = func(v interface{}) protoreflect.Value {
					return protoreflect.ValueOf(v)
				}
				t.interfaceOf = func(pv protoreflect.Value) interface{} {
					return pv.Interface()
				}
			}
		case protoreflect.Repeated:
			var typ reflect.Type
			switch t.Kind() {
			case protoreflect.EnumKind:
				typ = t.enumType.GoType()
			case protoreflect.MessageKind, protoreflect.GroupKind:
				typ = t.messageType.GoType()
			default:
				typ = goTypeForPBKind[t.Kind()]
			}
			c := value.NewConverter(typ, t.Kind())
			t.typ = reflect.PtrTo(reflect.SliceOf(typ))
			t.new = func() interface{} {
				return reflect.New(t.typ.Elem()).Interface()
			}
			t.valueOf = func(v interface{}) protoreflect.Value {
				return protoreflect.ValueOf(value.ListOf(v, c))
			}
			t.interfaceOf = func(pv protoreflect.Value) interface{} {
				return pv.List().(value.Unwrapper).ProtoUnwrap()
			}
		default:
			panic(fmt.Sprintf("invalid cardinality: %v", t.Cardinality()))
		}
	})
}

var goTypeForPBKind = map[protoreflect.Kind]reflect.Type{
	protoreflect.BoolKind:     reflect.TypeOf(bool(false)),
	protoreflect.Int32Kind:    reflect.TypeOf(int32(0)),
	protoreflect.Sint32Kind:   reflect.TypeOf(int32(0)),
	protoreflect.Fixed32Kind:  reflect.TypeOf(int32(0)),
	protoreflect.Int64Kind:    reflect.TypeOf(int64(0)),
	protoreflect.Sint64Kind:   reflect.TypeOf(int64(0)),
	protoreflect.Fixed64Kind:  reflect.TypeOf(int64(0)),
	protoreflect.Uint32Kind:   reflect.TypeOf(uint32(0)),
	protoreflect.Sfixed32Kind: reflect.TypeOf(uint32(0)),
	protoreflect.Uint64Kind:   reflect.TypeOf(uint64(0)),
	protoreflect.Sfixed64Kind: reflect.TypeOf(uint64(0)),
	protoreflect.FloatKind:    reflect.TypeOf(float32(0)),
	protoreflect.DoubleKind:   reflect.TypeOf(float64(0)),
	protoreflect.StringKind:   reflect.TypeOf(string("")),
	protoreflect.BytesKind:    reflect.TypeOf([]byte(nil)),
}
