import { FieldDefinitions } from '#spruce/schemas/fields/fields.types'

import fieldClassMap from '#spruce/schemas/fields/fieldClassMap'
import { TemplateRenderAs, FieldTemplateDetailOptions } from '@sprucelabs/schema'


{{#each imports}}
// @ts-ignore
import * as {{importAs}} from '{{package}}'
{{/each}}

const schemaTemplateItems = {{{json schemaTemplateItems}}}
// @ts-ignore
const generateTypeLiteral = (definition: FieldDefinitions, renderAs: TemplateRenderAs, importAs: string) => {
	const options: FieldTemplateDetailOptions<FieldDefinitions> = {
		language: 'ts',
		// @ts-ignore
		templateItems: schemaTemplateItems,
		globalNamespace: '{{globalSchemaNamespace}}',
		definition,
		importAs,
		renderAs
	}

	const FieldClass = fieldClassMap[definition.type]
	const details = FieldClass.generateTemplateDetails(
		options as any
	)
	
	return details.valueType
}


const valueTypes = {
	{{#each schemaTemplatesByNamespaceAndName}}
	"{{@key}}": {
		{{#each this}}
		"{{@key}}": {
			{{#each this}} 
			"{{schema.version}}{{#unless schema.version}}{{../../../SCHEMA_VERSION_FALLBACK}}{{/unless}}":{
				{{#if schema.dynamicFieldSignature}}
				__dynamicFieldSignature: {
					valueTypes: {
						{{#each ../../../rendersAs}}
						{{this}}: {{{ valueTypeGenerator ../schema.dynamicFieldSignature this 'generateTypeLiteral'}}},
						{{/each}}
					}
				},	
				{{/if}}
				{{#each schema.fields}}
				"{{@key}}": {
					valueTypes: {
						{{#each ../../../../rendersAs}}
						{{this}}: {{{ valueTypeGenerator ../this this 'generateTypeLiteral'}}},
						{{/each}}
					}
				},
				{{/each}}
			},
			{{/each}}
		},
		{{/each}}
	},
	{{/each}}
}

export default valueTypes
