package plugin

import (
	"git.apinb.com/bsm-tools/protoc-gen-ts/internal/codegen"
	"git.apinb.com/bsm-tools/protoc-gen-ts/internal/protowalk"
	"google.golang.org/protobuf/reflect/protoreflect"
)

type packageGenerator struct {
	pkg   protoreflect.FullName
	files []protoreflect.FileDescriptor
}

func (p packageGenerator) Generate(f *codegen.File) error {
	p.generateHeader(f)
	var seenService bool
	var walkErr error
	protowalk.WalkFiles(p.files, func(desc protoreflect.Descriptor) bool {
		if wkt, ok := WellKnownType(desc); ok {
			f.P(wkt.TypeDeclaration())
			return false
		}
		switch v := desc.(type) {
		case protoreflect.MessageDescriptor:
			if v.IsMapEntry() {
				return false
			}
			messageGenerator{pkg: p.pkg, message: v}.Generate(f)
		case protoreflect.EnumDescriptor:
			enumGenerator{pkg: p.pkg, enum: v}.Generate(f)
		case protoreflect.ServiceDescriptor:
			if err := (serviceGenerator{pkg: p.pkg, service: v, genHandler: !seenService}).Generate(f); err != nil {
				walkErr = err
				return false
			}

			
			seenService = true
		}
		return true
	})
	if walkErr != nil {
		return walkErr
	}
	return nil
}

func (p packageGenerator) generateHeader(f *codegen.File) {
	f.P("// Code generated by protoc-gen-typescript-http. DO NOT EDIT.")
	f.P("/* eslint-disable camelcase */")
	f.P("// @ts-nocheck")
	f.P()
}