import type { Api, Model } from "../src/types.js";

export function renderModelsFile(providers: Record<string, Record<string, Model<Api>>>): string {
	let output = `// This file is auto-generated by scripts/generate-models.ts
// Do not edit manually - run 'npm run generate-models' to update

import type { Model } from "./types.js";

export const MODELS = {
`;

	for (const providerId of Object.keys(providers).sort()) {
		const models = providers[providerId];
		output += `\t${JSON.stringify(providerId)}: {\n`;

		for (const modelId of Object.keys(models).sort()) {
			const model = models[modelId];
			output += `\t\t${JSON.stringify(model.id)}: {\n`;
			output += `\t\t\tid: ${JSON.stringify(model.id)},\n`;
			output += `\t\t\tname: ${JSON.stringify(model.name)},\n`;
			output += `\t\t\tapi: ${JSON.stringify(model.api)},\n`;
			output += `\t\t\tprovider: ${JSON.stringify(model.provider)},\n`;
			if (model.baseUrl !== undefined) {
				output += `\t\t\tbaseUrl: ${JSON.stringify(model.baseUrl)},\n`;
			}
			if (model.headers) output += `\t\t\theaders: ${JSON.stringify(model.headers)},\n`;
			if (model.compat) output += `\t\t\tcompat: ${JSON.stringify(model.compat)},\n`;
			output += `\t\t\treasoning: ${model.reasoning},\n`;
			if (model.thinkingLevelMap) {
				output += `\t\t\tthinkingLevelMap: ${JSON.stringify(model.thinkingLevelMap)},\n`;
			}
			output += `\t\t\tinput: [${model.input.map((input) => JSON.stringify(input)).join(", ")}],\n`;
			output += `\t\t\tcost: {\n`;
			output += `\t\t\t\tinput: ${model.cost.input},\n`;
			output += `\t\t\t\toutput: ${model.cost.output},\n`;
			output += `\t\t\t\tcacheRead: ${model.cost.cacheRead},\n`;
			output += `\t\t\t\tcacheWrite: ${model.cost.cacheWrite},\n`;
			output += `\t\t\t},\n`;
			output += `\t\t\tcontextWindow: ${model.contextWindow},\n`;
			output += `\t\t\tmaxTokens: ${model.maxTokens},\n`;
			if (model.featured) output += `\t\t\tfeatured: true,\n`;
			output += `\t\t} satisfies Model<${JSON.stringify(model.api)}>,\n`;
		}

		output += `\t},\n`;
	}

	return `${output}} as const;\n`;
}
