/**
 * 📋 Schema Type Definitions v2.0.0
 *
 * Tipagens TypeScript para validar estrutura dos schemas JSON
 * Baseado no formato Entity Schema v2.0.0
 */

/**
 * Metadados de relação com outras entidades
 */
export interface RelationMetadata {
  /** Nome do modelo Prisma relacionado */
  model: string;
  /** Campo de ligação (FK) */
  field: string;
  /** Campo para exibição (label) */
  labelField: string;
  /** Template opcional para exibição (ex: "{{name}} - {{creci}}") */
  displayTemplate?: string;
  /** Coluna FK nesta entidade que contém o valor (para campos virtualizados) */
  foreignKey?: string;
}

/**
 * Metadados de UI e apresentação
 */
export interface UIMetadata {
  /** Label de exibição do campo */
  label: string;
  /** Descrição detalhada */
  description?: string;
  /** Placeholder para inputs */
  placeholder?: string;
  /** Se pode ser buscado por texto */
  searchable?: boolean;
  /** Se pode ser filtrado */
  filterable?: boolean;
  /** Se pode ser ordenado */
  sortable?: boolean;
  /** Se pode ser usado em facetas */
  facetable?: boolean;
  /** Se é visível na UI */
  visible?: boolean;
  /** Template de exibição (ex: "{{area}} m²") */
  displayTemplate?: string;
  /** Ícone associado */
  iconName?: string;
}

/**
 * Metadados de auditoria
 */
export interface AuditMetadata {
  /** Origem do campo (ex: "hb:property", "publisher:property") */
  origin: string;
  /** Descrição de onde o dado foi captado no CRM original (ex: "features.bedroom", "values.saleValue (REAIS)") */
  source?: string;
}

/**
 * Regras de negócio e dependências
 */
export interface RulesMetadata {
  /** Condições para exibição (ex: ["operacao:venda"]) */
  conditions?: string[];
  /** Campo pai (dependência hierárquica) */
  parent?: string;
}

/**
 * Validações do campo
 */
export interface ValidationRules {
  /** Campo obrigatório */
  required?: boolean;
  /** Valor mínimo (números) */
  min?: number;
  /** Valor máximo (números) */
  max?: number;
  /** Comprimento mínimo (strings) */
  minLength?: number;
  /** Comprimento máximo (strings) */
  maxLength?: number;
  /** Precisão decimal */
  precision?: number;
  /** Padrão regex */
  pattern?: string;
}

/**
 * Metadados de banco de dados
 */
export interface DBMetadata {
  /** Tipo do campo no DB (ex: "varchar(255)", "decimal(10,8)") */
  type?: string;
  /** Valor padrão */
  default?: string | number | boolean;
  /** Se tem índice */
  index?: boolean | string; // true, "gin", "fulltext", "geo"
  /** Se é unique */
  unique?: boolean;
}

/**
 * Definição de um campo do schema
 */
export interface FieldSchema {
  /** Chave única do campo */
  key: string;
  /** Tipo do campo (String, Number, Boolean, Json, Json[], String[], Number[], Relation) */
  type: string;
  /** Tipo dos itens em arrays */
  itemType?: string;
  /** Categorias do campo */
  categories: string[];
  /** Validações */
  validation?: ValidationRules;
  /** Metadados de banco de dados */
  db?: DBMetadata;
  /** Metadados de UI */
  ui: UIMetadata;
  /** Metadados de auditoria */
  audit: AuditMetadata;
  /** Enum de valores possíveis */
  enum?: Record<string, string>;
  /** Formato do campo (currency, area, count, datetime, year, distance, etc) */
  format?: string;
  /** Unidade (BRL, m2, m, etc) */
  unit?: string;
  /** Máscara de formatação frontend (cpf, cnpj, cep, phone, email, url) */
  mask?: string;
  /** Regras de negócio */
  rules?: RulesMetadata;
  /** Metadados de relação (para FKs) */
  relation?: RelationMetadata;
}

/**
 * Schema completo de uma entidade
 */
export interface EntitySchema {
  /** Nome da entidade */
  entity: string;
  /** Versão do schema */
  version: string;
  /** Descrição da entidade */
  description?: string;
  /** Lista de campos */
  fields: FieldSchema[];
}

/**
 * Tipo auxiliar: chave de campo
 */
export type FieldKey = string;

/**
 * Tipo auxiliar: mapa de campos
 */
export type FieldsMap = Record<FieldKey, FieldSchema>;
