import { z } from "zod";
import { camelCase, snakeCase } from 'lodash';

const convertKeys = (
    obj: any,
    callback: (str?: string) => string
): any => {
  if (Array.isArray(obj)) {
    return obj.map((item) => convertKeys(item, callback));
  } else if (obj !== null && obj.constructor === Object) {
    return Object.keys(obj).reduce((acc, key) => {
      const caseKey = callback(key);
      acc[caseKey] = convertKeys(obj[key], callback);
      return acc;
    }, {} as any);
  }
  return obj;
};

export const toCamelCase = (obj: any): any => convertKeys(obj, camelCase);
export const toSnakeCase = (obj: any): any => convertKeys(obj, snakeCase);


{{#if imports}}
    {{#each imports}}
        import { {{{@key}}} } from "./{{{this}}}"
    {{/each}}
{{/if}}

/**
 * The [Name]SnakeCase zod schemas have snake_case named fields.
 * The [Name] zod schemas have a transform to convert field names to camelCase.
 * The [Name]T types are the inferred types from transformed schemas.
 */
{{#each schemas}}
    // {{@key}}
    {{#ifeq @key "TenantType"}}
        export const {{@key}} = {{{this}}};
        export type {{@key}}T = z.infer<typeof {{@key}}>;

    {{else}}
        export const {{@key}}SnakeCase = {{{this}}};
        export const {{{@key}}} = {{{@key}}}SnakeCase.transform(toCamelCase);
        export type {{@key}}T = z.infer<typeof {{@key}}>;

    {{/ifeq}}
{{/each}}
