{"version":3,"sources":["../src/models/property-type.schema.ts","../src/models/property-attributes-model.ts","../src/models/property-attributes-fields-list-model.ts","../src/utils/index.ts","../src/services/fake-data-generator/index.ts","../src/services/profiler/index.ts","../src/services/api-client/index.ts","../src/services/property-customizer/index.ts","../src/data/json-schema/property-model.json","../src/models/property-type.schema.json"],"sourcesContent":["import { z } from \"zod\"\n\n// Schemas para Media Types\nexport const ImageMediaSchema = z.object({\n  full: z.string(),\n  md: z.string().optional(),\n  sm: z.string().optional(),\n  cover: z.boolean().optional(),\n})\n\nexport const VideoMediaSchema = z.object({\n  provider: z.string().optional(),\n  id: z.string().optional(),\n  embed_url: z.string().optional(),\n})\n\nexport const DocumentMediaSchema = z.object({\n  name: z.string(),\n  url: z.string(),\n})\n\nexport const VirtualTourMediaSchema = z.object({\n  embed_url: z.string(),\n})\n\n// Schema para MediaAssets\nexport const MediaAssetsSchema = z.object({\n  images: z.array(ImageMediaSchema).optional(),\n  videos: z.array(VideoMediaSchema).optional(),\n  virtual_tours: z.array(VirtualTourMediaSchema).optional(),\n  documents: z.array(DocumentMediaSchema).optional(),\n})\n\n// Schema para Settings\nexport const SettingsFormatSchema = z.object({\n  currency_unit: z.union([z.literal(\"BRL\"), z.literal(\"USD\")]).optional(),\n  area_unit: z.union([z.literal(\"m2\"), z.literal(\"ft2\")]).optional(),\n  distance_unit: z.union([z.literal(\"km\"), z.literal(\"mi\"), z.literal(\"meters\")]).optional(),\n  exibir_no_mapa: z.boolean().optional(),\n})\n\n// Schema para SEO\nexport const SEOSchema = z.object({\n  meta_title: z.string().optional(),\n  meta_description: z.string().optional(),\n})\n\n// Schema principal para PropertyModel\nexport const PropertyModelSchema = z.object({\n  reference: z.string(),\n  title: z.string(),\n  description: z.string(),\n  media_assets: MediaAssetsSchema,\n  attributes: z.record(z.string(), z.any()),\n  settings: SettingsFormatSchema.optional(),\n  seo: SEOSchema.optional(),\n  updated_at: z.string().optional(),\n})\n\n// Tipos inferidos a partir dos schemas\nexport type ImageMedia = z.infer<typeof ImageMediaSchema>\nexport type VideoMedia = z.infer<typeof VideoMediaSchema>\nexport type DocumentMedia = z.infer<typeof DocumentMediaSchema>\nexport type VirtualTourMedia = z.infer<typeof VirtualTourMediaSchema>\nexport type MediaAssets = z.infer<typeof MediaAssetsSchema>\nexport type SettingsFormat = z.infer<typeof SettingsFormatSchema>\nexport type SEO = z.infer<typeof SEOSchema>\nexport type PropertyModel = z.infer<typeof PropertyModelSchema>\n\n// Função helper para validação\nexport const validatePropertyModel = (data: unknown): PropertyModel => {\n  return PropertyModelSchema.parse(data)\n}\n\n// Função helper para validação safe (retorna resultado com sucesso/erro)\nexport const safeValidatePropertyModel = (data: unknown) => {\n  return PropertyModelSchema.safeParse(data)\n}\n\n// Tipos legados para compatibilidade\nexport const AttributeSchema = z.object({\n  key: z.string(),\n  value: z.any(),\n  valueLabel: z.union([z.string(), z.array(z.string())]).optional(),\n  composedLabel: z.string().optional(),\n  type: z.string().optional(),\n  unit: z.string().optional(),\n  format: z.string().optional(),\n})\n\nexport type Attribute = z.infer<typeof AttributeSchema>\nexport type PropertyType = PropertyModel // Alias para compatibilidade\nexport const PropertyTypeSchema = PropertyModelSchema // Alias para compatibilidade\nexport const validatePropertyType = validatePropertyModel // Alias para compatibilidade\nexport const safeValidatePropertyType = safeValidatePropertyModel // Alias para compatibilidade","/* prettier-ignore */\n\nexport const PropertyAttributesModel = [\n  // Comercial\n  { key: \"operacao\", \t\t\t\t\t\t\t        label: \"Operação\",                         type: \"String[]\",                                                                                            cat: \"comercial\",                                                                                                               order: 1, },\n  { key: \"etapa_lancamento\",              label: \"Etapa do lançamento\",              type: \"String[]\",                                                                                            cat: \"comercial\",                                                                                                               order: 2, },\n  { key: \"status_comercial\",              label: \"Status comercial\",                 type: \"String[]\",                                                                                            cat: \"comercial\",                                                                                                               order: 3, },\n  { key: \"destaque\",                      label: \"Imóvel em destaque\",               type: \"Boolean\",                                                                                             cat: \"comercial\",                                                                                                               order: 4, },\n  { key: \"exclusividade\",                 label: \"Exclusividade do imóvel\",          type: \"Boolean\",                                                                                             cat: \"comercial\",                                                                                                               order: 5, },\n  { key: \"financiavel\",                   label: \"Financiável\",                      type: \"Boolean\",                                                                                             cat: \"comercial\",                                                                                                               order: 6, },\n  { key: \"seguro_fianca\",                 label: \"Seguro fiança\",                    type: \"Boolean\",                                                                                             cat: \"comercial\",                                                                                                               order: 7, },\n  { key: \"aceita_permuta\",                label: \"Aceita permuta\",                   type: \"Boolean\",                                                                                             cat: \"comercial\",                                                                                                               order: 8, },\n  { key: \"aceita_parcelamento\",           label: \"Aceita parcelamento\",              type: \"Boolean\",                                                                                             cat: \"comercial\",                                                                                                               order: 9, },\n\n  // Valores\n  { key: \"valor_condominio\",              label: \"Valor do condomínio\",              type: \"Number\",       role:\"currency\",      unit: \"BRL\",                                                     cat: \"valores\",                                                                                                                 order: 20, },\n  { key: \"valor_total_venda\",             label: \"Valor total de venda\",             type: \"Number\",       role:\"currency\",      unit: \"BRL\",                                                     cat: \"valores\",               composedLabel: \"{{valueLabel}}\",                                                                  order: 21, },\n  { key: \"valor_total_mensal\",            label: \"Valor total de locação\",           type: \"Number\",       role:\"currency\",      unit: \"BRL\",                                                     cat: \"valores\",               composedLabel: \"{{valueLabel}} /mês\",                                                             order: 22, },\n  { key: \"valor_venda\",                   label: \"Valor de venda\",                   type: \"Number\",       role:\"currency\",      unit: \"BRL\",                                                     cat: \"valores\",               composedLabel: \"{{valueLabel}}\",                                                                  order: 23, },\n  { key: \"valor_locacao\",                 label: \"Valor de locação mensal\",          type: \"Number\",       role:\"currency\",      unit: \"BRL\",                                                     cat: \"valores\",               composedLabel: \"{{valueLabel}} /mês\",                                                             order: 24, },\n  { key: \"valor_diaria\",                  label: \"Valor da diária\",                  type: \"Number\",       role:\"currency\",      unit: \"BRL\",                                                     cat: \"valores\",               composedLabel: \"{{valueLabel}} /dia\",                                                             order: 25, },\n  { key: \"valor_pacote_dias\",             label: \"Valor do pacote de dias\",          type: \"Number\",       role:\"currency\",      unit: \"BRL\",                                                     cat: \"valores\",                                                                                                                 order: 26, },\n  { key: \"valor_iptu\",                    label: \"Valor do IPTU\",                    type: \"Number\",       role:\"currency\",      unit: \"BRL\",                                                     cat: \"valores\",                                                                                                                 order: 27, },\n  { key: \"valor_fci\",                     label: \"Valor do Fundo de conservação\",    type: \"Number\",       role:\"currency\",      unit: \"BRL\",                                                     cat: \"valores\",                                                                                                                 order: 28, },\n  { key: \"valor_seguro_incendio\",         label: \"Valor do seguro incêndio\",         type: \"Number\",       role:\"currency\",      unit: \"BRL\",                                                     cat: \"valores\",                                                                                                                 order: 29, },\n  { key: \"valor_m2\",                      label: \"Valor do m²\",                      type: \"Number\",       role:\"currency\",      unit: \"BRL\",                                                     cat: \"valores\",                                                                                                                 order: 30, },\n  { key: \"valor_taxa_limpeza\",            label: \"Valor da taxa de limpeza\",         type: \"Number\",       role:\"currency\",      unit: \"BRL\",                                                     cat: \"valores\",                                                                                                                 order: 31, },\n  { key: \"valor_taxa_esgoto\",             label: \"Valor da taxa de esgoto\",          type: \"Number\",       role:\"currency\",      unit: \"BRL\",                                                     cat: \"valores\",                                                                                                                 order: 32, },\n\n  // Situações\n  { key: \"alugado\",                       label: \"Alugado\",                          type: \"Boolean\",                                                                                             cat: \"situacoes\",                                                                                                               order: 40, },\n  { key: \"vendido\",                       label: \"Vendido\",                          type: \"Boolean\",                                                                                             cat: \"situacoes\",                                                                                                               order: 41, },\n  { key: \"reservado\",                     label: \"Reservado\",                        type: \"Boolean\",                                                                                             cat: \"situacoes\",                                                                                                               order: 42, },\n  { key: \"situacao_ocupacao\",             label: \"Situação de ocupação\",             type: \"String\",                                                                                              cat: \"situacoes\",                                                                                                               order: 43, },\n  { key: \"financiado\",                    label: \"Financiado\",                       type: \"Boolean\",                                                                                             cat: \"situacoes\",                                                                                                               order: 44, },\n\n  // Legal / Documental\n  { key: \"averbado\",                      label: \"Averbado\",                         type: \"Boolean\",                                                                                             cat: \"legal\",                                                                                                                   order: 60, },\n  { key: \"escriturado\",                   label: \"Escriturado\",                      type: \"Boolean\",                                                                                             cat: \"legal\",                                                                                                                   order: 61, },\n  { key: \"incorporado\",                   label: \"Incorporado\",                      type: \"Boolean\",                                                                                             cat: \"legal\",                                                                                                                   order: 62, },\n\n  // Normas / Permissões / Exigências\n  { key: \"numero_pessoas\",                label: \"Número de pessoas\",                type: \"Number\",       role:\"count\",                                                                          cat: \"normas\",                                                                                                                  order: 81, },\n\n  // Localização\n  { key: \"endereco_pais\",                 label: \"País\",                             type: \"String\",                                                                                              cat: \"localizacao\",                                                                                                             order: 101, },\n  { key: \"endereco_cep\",                  label: \"CEP\",                              type: \"String\",                                                                                              cat: \"localizacao\",                                                                                                             order: 102, },\n  { key: \"endereco_estado\",               label: \"Estado\",                           type: \"String\",                                                                                              cat: \"localizacao\",                                                                                                             order: 103, },\n  { key: \"endereco_cidade\",               label: \"Cidade\",                           type: \"String\",                                                                                              cat: \"localizacao\",                                                                                                             order: 104, },\n  { key: \"endereco_bairro\",               label: \"Bairro\",                           type: \"String\",                                                                                              cat: \"localizacao\",                                                                                                             order: 105, },\n  { key: \"endereco_logradouro\",           label: \"Logradouro\",                       type: \"String\",                                                                                              cat: \"localizacao\",                                                                                                             order: 106, },\n  { key: \"endereco_numero\",               label: \"Número do imóvel\",                 type: \"String\",                                                                                              cat: \"localizacao\",                                                                                                             order: 107, },\n  { key: \"endereco_complemento\",          label: \"Complemento\",                      type: \"String\",                                                                                              cat: \"localizacao\",                                                                                                             order: 108, },\n  { key: \"endereco_referencia\",           label: \"Referência (endereço)\",            type: \"String\",                                                                                              cat: \"localizacao\",                                                                                                             order: 109, },\n  { key: \"latitude\",                      label: \"Latitude\",                         type: \"Number\",                                                                                              cat: \"localizacao\",                                                                                                             order: 110, },\n  { key: \"longitude\",                     label: \"Longitude\",                        type: \"Number\",                                                                                              cat: \"localizacao\",                                                                                                             order: 111, },\n\n  // Condomínio\n  { key: \"condominio_nome\",               label: \"Nome do condomínio\",               type: \"String\",                                                                                              cat: \"condominio\",                                                                                                              order: 120, },\n  { key: \"condominio_tipo\",               label: \"Tipo do condomínio\",               type: \"String\",                                                                                              cat: \"condominio\",                                                                                                              order: 121, },\n  { key: \"condominio_fechado\",            label: \"Condomínio fechado\",               type: \"Boolean\",                                                                                             cat: \"condominio\",                                                                                                              order: 122, },\n\n  // Localidade\n  { key: \"distancia_mar\",                 label: \"Distância do mar\",                 type: \"Number\",       role:\"distance\",      unit: \"m\",                                                       cat: \"localidade\",                                                                                                              order: 141, },\n  { key: \"imovel_no_litoral\",             label: \"Imóvel no litoral\",                type: \"Boolean\",                                                                                             cat: \"localidade\",                                                                                                              order: 142, },\n  { key: \"frente_mar\",                    label: \"Frente para o mar\",                type: \"Boolean\",                                                                                             cat: \"localidade\",                                                                                                              order: 144, },\n  { key: \"vista_mar\",                     label: \"Vista para o mar\",                 type: \"Boolean\",                                                                                             cat: \"localidade\",                                                                                                              order: 146, },\n\n  // Estrutura do imóvel\n  { key: \"tipo\",                          label: \"Tipo\",                             type: \"String\",                                                                                              cat: \"estrutura\",                                                                                                               order: 160, },\n  { key: \"subtipo\",                       label: \"Subtipo\",                          type: \"String\",                                                                                              cat: \"estrutura\",                                                                                                               order: 161, },\n  { key: \"area_privativa\",                label: \"Área privativa\",                   type: \"Number\",       role:\"area\",          unit: \"m²\",                                                      cat: \"estrutura\",            composedLabel: \"{{valueLabel}} priv.\",                                 iconName: \"area\" ,          order: 163, },\n  { key: \"area_total\",                    label: \"Área Total\",                       type: \"Number\",       role:\"area\",          unit: \"m²\",                                                      cat: \"estrutura\",            composedLabel: \"{{valueLabel}} total\",                                 iconName: \"area\" ,          order: 164, },\n  { key: \"area_terreno\",                  label: \"Área do terreno\",                  type: \"Number\",       role:\"area\",          unit: \"m²\",                                                      cat: \"estrutura\",            composedLabel: \"{{valueLabel}} terreno\",                               iconName: \"area\" ,          order: 165, },\n  { key: \"padrao_imovel\",                 label: \"Padrão do imóvel\",                 type: \"String\",                                                                                              cat: \"estrutura\",                                                                                                               order: 166, },\n  { key: \"fase_obra\",                     label: \"Fase da obra\",                     type: \"String\",                                                                                              cat: \"estrutura\",                                                                                                               order: 167, },\n  { key: \"em_condominio\",                 label: \"Em condomínio\",                    type: \"Boolean\",                                                                                             cat: \"estrutura\",                                                                                                               order: 168, },\n  { key: \"finalidade\",                    label: \"Finalidade (propósito)\",           type: \"String\",                                                                                              cat: \"estrutura\",                                                                                                               order: 169, },\n  { key: \"estado_conservacao\",            label: \"Estado da conservação do imóvel\",  type: \"String\",                                                                                              cat: \"estrutura\",                                                                                                               order: 170, },\n  { key: \"estado_imovel\",                 label: \"Status da obra + uso do imóvel\",   type: \"String\",                                                                                              cat: \"estrutura\",                                                                                                               order: 171, },\n  { key: \"posicao_solar\",                 label: \"Posição solar\",                    type: \"String\",                                                                                              cat: \"estrutura\",                                                                                                               order: 172, },\n  { key: \"posicao_no_terreno\",            label: \"Posição do imóvel no terreno\",     type: \"String\",                                                                                              cat: \"estrutura\",                                                                                                               order: 173, },\n  { key: \"tipo_piso\",                     label: \"Tipo de piso\",                     type: \"String\",                                                                                              cat: \"estrutura\",                                                                                                               order: 174, },\n  { key: \"tipos_piso\",                    label: \"Tipos de piso\",                    type: \"String[]\",                                                                                            cat: \"estrutura\",                                                                                                               order: 175, },\n  { key: \"material_imovel\",               label: \"Material do imóvel\",               type: \"String\",                                                                                              cat: \"estrutura\",                                                                                                               order: 176, },\n  { key: \"materiais_imovel\",              label: \"Materiais do imóvel\",              type: \"String[]\",                                                                                            cat: \"estrutura\",                                                                                                               order: 177, },\n  { key: \"area_construida\",               label: \"Área construída\",                  type: \"Number\",       role:\"area\",          unit: \"m²\",                                                      cat: \"estrutura\",                                                                                                               order: 178, },\n  { key: \"area_util\",                     label: \"Área útil\",                        type: \"Number\",       role:\"area\",          unit: \"m²\",                                                      cat: \"estrutura\",                                                                                                               order: 179, },\n  { key: \"data_entrega_obra\",             label: \"Data de entrega da obra\",          type: \"String\",       role: \"date\",                                                                          cat: \"estrutura\",                                                                                                               order: 180, },\n  { key: \"ano_construcao\",                label: \"Ano da construção\",                type: \"String\",       role: \"year\",                                                                          cat: \"estrutura\",                                                                                                               order: 181, },\n  { key: \"topografia_terreno\",            label: \"Topografia do terreno\",            type: \"String\",                                                                                              cat: \"estrutura\",                                                                                                               order: 182, },\n  { key: \"pintura\",                       label: \"Pintura\",                          type: \"String\",                                                                                              cat: \"estrutura\",                                                                                                               order: 183, },\n  { key: \"pinturas_revestimentos\",        label: \"Pinturas e revestimentos\",         type: \"String[]\",                                                                                            cat: \"estrutura\",                                                                                                               order: 184, },\n  { key: \"tipo_esquadria\",                label: \"Tipo de esquadrias\",               type: \"String\",                                                                                              cat: \"estrutura\",                                                                                                               order: 185, },\n  { key: \"tipos_esquadrias\",              label: \"Tipos de esquadrias\",              type: \"String[]\",                                                                                            cat: \"estrutura\",                                                                                                               order: 186, },\n  { key: \"tipo_forro\",                    label: \"Tipo do forro\",                    type: \"String\",                                                                                              cat: \"estrutura\",                                                                                                               order: 187, },\n  { key: \"tipos_forros\",                  label: \"Tipos de forros\",                  type: \"String[]\",                                                                                            cat: \"estrutura\",                                                                                                               order: 188, },\n  { key: \"tipos_coberturas\",              label: \"Tipos de coberturas\",              type: \"String[]\",                                                                                            cat: \"estrutura\",                                                                                                               order: 189, },\n  { key: \"terreno_comprimento\",           label: \"Comprimento do terreno\",           type: \"Number\",       role:\"distance\",      unit: \"m\",                                                       cat: \"estrutura\",                                                                                                               order: 190, },\n  { key: \"terreno_largura\",               label: \"Largura do Terreno\",               type: \"Number\",       role:\"distance\",      unit: \"m\",                                                       cat: \"estrutura\",                                                                                                               order: 191, },\n  { key: \"cores\",                         label: \"Cores do imóvel\",                  type: \"String[]\",                                                                                            cat: \"estrutura\",                                                                                                               order: 192, },\n  { key: \"andares\",                       label: \"Número de andares\",                type: \"Number\",       role:\"count\",                                                                          cat: \"estrutura\",                                                                                                               order: 193, },\n  { key: \"medida_distancia\",              label: \"Tipo de medida de distância\",      type: \"String\",                                                                                              cat: \"estrutura\",                                                                                                               order: 194, },\n  { key: \"medida_area\",                   label: \"Tipo de medida de área\",           type: \"String\",                                                                                              cat: \"estrutura\",                                                                                                               order: 195, },\n\n  // Corretor\n  { key: \"corretor_id\",                   label: \"Corretor → ID\",                    type: \"String\",                                                                                              cat: \"corretor\",                                                                                                                order: 210, },\n  { key: \"corretor_nome\",                 label: \"Corretor → Nome\",                  type: \"String\",                                                                                              cat: \"corretor\",                                                                                                                order: 211, },\n\n  // Dependências\n  { key: \"dormitorios\",                   label: \"Dormitórios\",                      type: \"Number\",       role:\"count\",                                                                          cat: \"dependencias\",          composedLabel: \"{{valueLabel}} dormitório{{p:s}}\",    iconName: \"bedroom\",       order: 230, },\n  { key: \"banheiros\",                     label: \"Banheiros\",                        type: \"Number\",       role:\"count\",                                                                          cat: \"dependencias\",          composedLabel: \"{{valueLabel}} banheiro{{p:s}}\",        iconName: \"bathroom\",        order: 231, },\n  { key: \"suites\",                        label: \"Suítes\",                           type: \"Number\",       role:\"count\",                                                                          cat: \"dependencias\",          composedLabel: \"Sendo {{valueLabel}} suíte{{p:s}}\",        iconName: \"suite\",          order: 232, },\n  { key: \"vagas_garagem\",                 label: \"Vagas na garagem\",                 type: \"Number\",       role:\"count\",                                                                          cat: \"dependencias\",          composedLabel: \"{{valueLabel}} vaga{{p:s}}\",                iconName: \"garage\",         order: 233, },\n\n  // Características em geral\n  { key: \"mobiliado\",                     label: \"Mobiliado\",                        type: \"Boolean\",                                                                                             cat: \"caracteristicas\",                                                                                                         order: 250, },\n  // { key: \"caracteristicas\",               label: \"Características (lista)\",       type: \"String[]\",                                                                                            cat: \"caracteristicas\"                                                                                                          order: 1, },\n];","export const unitListModel = {\n\tarea: [\n\t\t{\n\t\t\tkey: \"m²\",\n\t\t\taliases: [\"m2\"],\n\t\t\tlabel: \"m²\",\n\t\t\tlabelDisplay: \"Metros quadrados\",\n\t\t},\n\t\t{\n\t\t\tkey: \"ha\",\n\t\t\taliases: [\"hectare\", \"hectares\"],\n\t\t\tlabel: \"ha\",\n\t\t\tlabelDisplay: \"Hectares\",\n\t\t},\n\t\t{\n\t\t\tkey: \"km²\",\n\t\t\taliases: [\"km2\"],\n\t\t\tlabel: \"km²\",\n\t\t\tlabelDisplay: \"Quilômetros quadrados\",\n\t\t},\n\t],\n\n\tlength: [\n\t\t{\n\t\t\tkey: \"m\",\n\t\t\taliases: [\"metro\", \"meter\", \"meters\"],\n\t\t\tlabel: \"m\",\n\t\t\tlabelDisplay: \"Metros\",\n\t\t},\n\t\t{\n\t\t\tkey: \"km\",\n\t\t\taliases: [\"quilometro\", \"kilometer\", \"kilometers\"],\n\t\t\tlabel: \"km\",\n\t\t\tlabelDisplay: \"Quilômetros\",\n\t\t},\n\t],\n\n\tcurrency: [\n\t\t{\n\t\t\tkey: \"BRL\",\n\t\t\taliases: [],\n\t\t\tlabel: \"R$\",\n\t\t\tlabelDisplay: \"Real Brasileiro\",\n\t\t\tlocale: \"pt-BR\",\n\t\t},\n\t],\n};\n\n// {\n// \tkey: \"cm\",\n// \taliases: [\"centimetro\", \"centimeter\", \"centimeters\"],\n// \tlabel: \"cm\",\n// \tlabelDisplay: \"Centímetros\",\n// },\n// {\n// \tkey: \"mm\",\n// \taliases: [\"milimetro\", \"millimeter\", \"millimeters\"],\n// \tlabel: \"mm\",\n// \tlabelDisplay: \"Milímetros\",\n// },\n// {\n// \tkey: \"ft\",\n// \taliases: [\"foot\", \"feet\"],\n// \tlabel: \"ft\",\n// \tlabelDisplay: \"Pés\",\n// },\n// {\n// \tkey: \"in\",\n// \taliases: [\"inch\", \"inches\"],\n// \tlabel: \"in\",\n// \tlabelDisplay: \"Polegadas\",\n// },\n// {\n// \tkey: \"USD\",\n// \taliases: [\"$\", \"dolar\", \"dólar\", \"usd\"],\n// \tlabel: \"US$\",\n// \tlabelDisplay: \"Dólar Americano\",\n// \tlocale: \"en-US\",\n// },\n// {\n// \tkey: \"EUR\",\n// \taliases: [\"€\", \"euro\", \"eur\"],\n// \tlabel: \"€\",\n// \tlabelDisplay: \"Euro\",\n// \tlocale: \"de-DE\",\n// },\n// {\n// \tkey: \"GBP\",\n// \taliases: [\"£\", \"libra\", \"pound\", \"gbp\"],\n// \tlabel: \"£\",\n// \tlabelDisplay: \"Libra Esterlina\",\n// \tlocale: \"en-GB\",\n// },\n\nexport const formatListModel = {\n\tnumber: [\n\t\t{\n\t\t\tkey: \"integer\",\n\t\t\tlabel: \"Inteiro\",\n\t\t\tlabelDisplay: \"Número inteiro\",\n\t\t\tpattern: \"0\",\n\t\t},\n\t\t{\n\t\t\tkey: \"decimal\",\n\t\t\tlabel: \"Decimal\",\n\t\t\tlabelDisplay: \"Número decimal\",\n\t\t\tpattern: \"0.00\",\n\t\t},\n\t\t{\n\t\t\tkey: \"percentage\",\n\t\t\tlabel: \"Porcentagem\",\n\t\t\tlabelDisplay: \"Porcentagem\",\n\t\t\tpattern: \"0.00%\",\n\t\t},\n\t],\n\n\tcurrency: [\n\t\t{\n\t\t\tkey: \"currency\",\n\t\t\tlabel: \"Moeda\",\n\t\t\tlabelDisplay: \"Formato monetário\",\n\t\t\tpattern: \"¤#,##0.00\",\n\t\t},\n\t\t{\n\t\t\tkey: \"currency_compact\",\n\t\t\tlabel: \"Moeda compacta\",\n\t\t\tlabelDisplay: \"Formato monetário compacto\",\n\t\t\tpattern: \"¤#,##0\",\n\t\t},\n\t],\n\n\tdate: [\n\t\t{\n\t\t\tkey: \"date\",\n\t\t\tlabel: \"Data\",\n\t\t\tlabelDisplay: \"Data (DD/MM/AAAA)\",\n\t\t\tpattern: \"dd/MM/yyyy\",\n\t\t},\n\t\t{\n\t\t\tkey: \"datetime\",\n\t\t\tlabel: \"Data e hora\",\n\t\t\tlabelDisplay: \"Data e hora completa\",\n\t\t\tpattern: \"dd/MM/yyyy HH:mm\",\n\t\t},\n\t\t{\n\t\t\tkey: \"year\",\n\t\t\tlabel: \"Ano\",\n\t\t\tlabelDisplay: \"Apenas ano\",\n\t\t\tpattern: \"yyyy\",\n\t\t},\n\t\t{\n\t\t\tkey: \"month_year\",\n\t\t\tlabel: \"Mês/Ano\",\n\t\t\tlabelDisplay: \"Mês e ano\",\n\t\t\tpattern: \"MM/yyyy\",\n\t\t},\n\t],\n\n\ttext: [\n\t\t{\n\t\t\tkey: \"uppercase\",\n\t\t\tlabel: \"Maiúscula\",\n\t\t\tlabelDisplay: \"Texto em maiúscula\",\n\t\t},\n\t\t{\n\t\t\tkey: \"lowercase\",\n\t\t\tlabel: \"Minúscula\",\n\t\t\tlabelDisplay: \"Texto em minúscula\",\n\t\t},\n\t\t{\n\t\t\tkey: \"capitalize\",\n\t\t\tlabel: \"Capitalizado\",\n\t\t\tlabelDisplay: \"Primeira letra maiúscula\",\n\t\t},\n\t\t{\n\t\t\tkey: \"title\",\n\t\t\tlabel: \"Título\",\n\t\t\tlabelDisplay: \"Cada palavra capitalizada\",\n\t\t},\n\t],\n\n\t// Em desenvolvimento futuro\n\t// color: [\n\t// \t{\n\t// \t\tkey: \"rgb\",\n\t// \t\tlabel: \"RGB\",\n\t// \t},\n\t// \t{\n\t// \t\tkey: \"cmyk\",\n\t// \t\tlabel: \"CMYK\",\n\t// \t},\n\t// ],\n};","import { PropertyAttributesModel } from \"../models/property-attributes-model\";\nimport { mergeDeepLeft } from \"ramda\";\n\nexport function verifyAttrKeyInPropertyV3Model(key: string) {\n\treturn PropertyAttributesModel.find((attr) => attr.key == key);\n}\n\n// Mescla dados estendidos sobre o model de atributos padrão do Property V3\n\nexport function mergePropertyAttributesModel(base: any[], overrides: any[]) {\n\t// Indexa os atributos da base por key\n\tconst map = new Map(base.map((attr) => [attr.key, { ...attr }]));\n\n\tfor (const overrideAttr of overrides) {\n\t\tconst baseAttr = map.get(overrideAttr.key);\n\n\t\tif (baseAttr) {\n\t\t\t// Atualiza apenas os campos existentes no overrideAttr\n\t\t\tfor (const field in overrideAttr) {\n\t\t\t\t// Sobrescreve campo do base apenas se estiver presente no override\n\t\t\t\t(baseAttr as any)[field] = overrideAttr[field];\n\t\t\t}\n\t\t\tmap.set(overrideAttr.key, baseAttr);\n\t\t} else {\n\t\t\t// Novo atributo que não existe no base\n\t\t\tmap.set(overrideAttr.key, { ...overrideAttr });\n\t\t}\n\t}\n\n\treturn Array.from(map.values());\n}\n\nexport function sortAttributes(attributes: any[], sortKeys: string[] = []) {\n\treturn [...attributes].sort((a, b) => {\n\t\tfor (const rule of sortKeys) {\n\t\t\tconst [field, direction] = rule.split(\":\");\n\t\t\tconst valA = a[field];\n\t\t\tconst valB = b[field];\n\n\t\t\tif (valA === undefined || valB === undefined) continue;\n\n\t\t\tconst isAsc = direction === \"asc\";\n\t\t\tconst isDesc = direction === \"desc\";\n\n\t\t\tif (!isAsc && !isDesc) {\n\t\t\t\tconsole.warn(`Direção inválida: \"${direction}\". Use \"asc\" ou \"desc\".`);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (valA < valB) return isAsc ? -1 : 1;\n\t\t\tif (valA > valB) return isAsc ? 1 : -1;\n\t\t}\n\t\treturn 0;\n\t});\n}\n\nexport const preparaAttrValueLabel = function (valor: any) {\n\treturn Array.isArray(valor)\n\t\t? `${valor.slice(0, -1).join(\", \")} e ${valor[valor.length - 1]}`\n\t\t: valor;\n};","import type { PropertyModel, Attribute } from \"../../models/property-type.schema\"\nimport * as fs from 'fs'\nimport * as path from 'path'\n\n// Utilitários para randomização\nfunction randomInt(min: number, max: number): number {\n  return Math.floor(Math.random() * (max - min + 1)) + min\n}\n\nfunction randomChoice<T>(array: T[]): T {\n  return array[Math.floor(Math.random() * array.length)]\n}\n\nfunction randomBoolean(probability = 0.5): boolean {\n  return Math.random() < probability\n}\n\nfunction randomFromArray<T>(array: T[], count: number): T[] {\n  const shuffled = [...array].sort(() => 0.5 - Math.random())\n  return shuffled.slice(0, count)\n}\n\n// Carrega e cache do profiling report\nlet profilingCache: Record<string, any[]> | null = null\n\nfunction loadProfilingReport(): Record<string, any[]> {\n  if (profilingCache) {\n    return profilingCache\n  }\n\n  try {\n    const reportPath = path.join(__dirname, '..', '..', '..', '__dev__', 'data', 'property-v3-profiling', 'profiling-report.json')\n    const reportData = fs.readFileSync(reportPath, 'utf8')\n    profilingCache = JSON.parse(reportData)\n    return profilingCache!\n  } catch (error) {\n    console.warn('Não foi possível carregar o profiling report, usando valores padrão')\n    return {}\n  }\n}\n\n// Cidades brasileiras expandidas\nconst CITIES = [\n  { \n    cidade: \"São Paulo\", estado: \"SP\", cep: \"01000-000\",\n    bairros: [\"Vila Madalena\", \"Pinheiros\", \"Moema\", \"Itaim Bibi\", \"Jardins\", \"Vila Olímpia\", \"Brooklin\", \"Campo Belo\"]\n  },\n  { \n    cidade: \"Rio de Janeiro\", estado: \"RJ\", cep: \"20000-000\",\n    bairros: [\"Copacabana\", \"Ipanema\", \"Barra da Tijuca\", \"Botafogo\", \"Leblon\", \"Flamengo\", \"Tijuca\", \"Vila Isabel\"]\n  },\n  { \n    cidade: \"Belo Horizonte\", estado: \"MG\", cep: \"30000-000\",\n    bairros: [\"Savassi\", \"Funcionários\", \"Lourdes\", \"Belvedere\", \"Santo Agostinho\", \"Carmo\", \"Serra\", \"Buritis\"]\n  },\n  { \n    cidade: \"Curitiba\", estado: \"PR\", cep: \"80000-000\",\n    bairros: [\"Batel\", \"Água Verde\", \"Centro\", \"Bigorrilho\", \"Cabral\", \"Ahú\", \"Juvevê\", \"Rebouças\"]\n  },\n  { \n    cidade: \"Florianópolis\", estado: \"SC\", cep: \"88000-000\",\n    bairros: [\"Centro\", \"Trindade\", \"Lagoa da Conceição\", \"Jurerê\", \"Canasvieiras\", \"Ingleses\", \"Córrego Grande\", \"Santa Mônica\"]\n  },\n]\n\n// Características adicionais para casas\nconst HOUSE_FEATURES = [\n  \"Jardim\", \"Quintal amplo\", \"Área gourmet\", \"Churrasqueira\", \"Piscina\", \"Sauna\", \"Academia\",\n  \"Escritório\", \"Biblioteca\", \"Lavabo\", \"Dispensa\", \"Closet\", \"Varanda\", \"Terraço\",\n  \"Edícula\", \"Casa de caseiro\", \"Playground\", \"Quadra\", \"Campo de futebol\", \"Horta\",\n  \"Pomar\", \"Gazebo\", \"Deck\", \"Spa\", \"Cinema\", \"Adega\", \"Bar\", \"Sala de jogos\"\n]\n\nconst SECURITY_FEATURES = [\n  \"Portão eletrônico\", \"Interfone\", \"Câmeras de segurança\", \"Alarme\", \"Cerca elétrica\",\n  \"Portaria 24h\", \"Guarita\", \"Rondas\", \"Controle de acesso\", \"Monitoramento\"\n]\n\nconst FINISHING_TYPES = [\n  \"Alto padrão\", \"Médio padrão\", \"Padrão popular\", \"Luxo\", \"Ultra luxo\",\n  \"Rústico\", \"Moderno\", \"Clássico\", \"Contemporâneo\", \"Minimalista\"\n]\n\nconst ORIENTATION_TYPES = [\n  \"Norte\", \"Sul\", \"Leste\", \"Oeste\", \"Nordeste\", \"Noroeste\", \"Sudeste\", \"Sudoeste\"\n]\n\nconst CONSERVATION_STATES = [\n  \"Novo\", \"Excelente\", \"Muito bom\", \"Bom\", \"Regular\", \"A reformar\", \"Em obras\"\n]\n\n// Gerador de atributos baseado no profiling report\nfunction generateEnhancedAttributes(tipo: string): Attribute[] {\n  const attributes: Attribute[] = []\n  const profiling = loadProfilingReport()\n  \n  // Função helper para pegar valor do profiling\n  function getProfilingValue(key: string): any {\n    const profilingKey = `attributes.${key}`\n    const values = profiling[profilingKey]\n    return values && values.length > 0 ? randomChoice(values) : null\n  }\n\n  // Função helper para pegar valor numérico do profiling  \n  function getProfilingNumber(key: string, fallbackMin: number, fallbackMax: number): number {\n    const value = getProfilingValue(key)\n    if (typeof value === 'number') {\n      return value\n    }\n    return randomInt(fallbackMin, fallbackMax)\n  }\n\n  // Tipo (obrigatório)\n  attributes.push({ key: \"tipo\", value: tipo })\n\n  // Operação baseada no profiling\n  const operacao = getProfilingValue(\"operacao\") || [\"venda\"]\n  attributes.push({ key: \"operacao\", value: Array.isArray(operacao) ? operacao : [operacao] })\n\n  // Localização baseada no profiling\n  const cidade = getProfilingValue(\"endereco_cidade\") || \"São Paulo\"\n  const estado = getProfilingValue(\"endereco_estado\") || \"SP\"\n  const bairro = getProfilingValue(\"endereco_bairro\") || \"Centro\"\n  const cep = getProfilingValue(\"endereco_cep\") || \"01000-000\"\n  \n  attributes.push(\n    { key: \"endereco_cidade\", value: cidade },\n    { key: \"endereco_estado\", value: estado },\n    { key: \"endereco_bairro\", value: bairro },\n    { key: \"endereco_cep\", value: cep },\n    { key: \"endereco_numero\", value: getProfilingNumber(\"endereco_numero\", 10, 9999) }\n  )\n\n  // Adicionar outros campos do profiling se existirem\n  const logradouro = getProfilingValue(\"endereco_logradouro\")\n  if (logradouro) {\n    attributes.push({ key: \"endereco_logradouro\", value: logradouro })\n  }\n\n  const complemento = getProfilingValue(\"endereco_complemento\")\n  if (complemento) {\n    attributes.push({ key: \"endereco_complemento\", value: complemento })\n  }\n\n  // Valores baseados no profiling\n  const valorVenda = getProfilingNumber(\"valor_venda\", 200000, 2000000)\n  if (valorVenda && (Array.isArray(operacao) ? operacao.includes(\"venda\") : operacao === \"venda\")) {\n    attributes.push({ key: \"valor_venda\", value: valorVenda })\n  }\n\n  const valorLocacao = getProfilingNumber(\"valor_locacao\", 800, 8000)\n  if (valorLocacao && (Array.isArray(operacao) ? operacao.includes(\"locacao\") : operacao === \"locacao\")) {\n    attributes.push({ key: \"valor_locacao\", value: valorLocacao })\n  }\n\n  // Características físicas baseadas no profiling\n  if (tipo !== \"Terreno\") {\n    const dormitorios = getProfilingNumber(\"dormitorios\", 1, 5)\n    const banheiros = getProfilingNumber(\"banheiros\", 1, 4)\n    const suites = getProfilingNumber(\"suites\", 0, 3)\n    const areaUtil = getProfilingNumber(\"area_util\", 40, 400)\n    \n    attributes.push(\n      { key: \"dormitorios\", value: dormitorios },\n      { key: \"banheiros\", value: banheiros },\n      { key: \"suites\", value: suites },\n      { key: \"area_util\", value: areaUtil }\n    )\n  }\n\n  // Área total baseada no profiling\n  const areaTotal = getProfilingNumber(\"area_total\", 50, 500)\n  if (areaTotal) {\n    attributes.push({ key: \"area_total\", value: areaTotal })\n  }\n\n  // Vagas baseadas no profiling\n  const vagas = getProfilingNumber(\"vagas\", 1, 4)\n  if (vagas) {\n    attributes.push({ key: \"vagas\", value: vagas })\n  }\n\n  // Características específicas baseadas no profiling\n  const caracteristicas = profiling[\"attributes.caracteristicas\"]\n  if (caracteristicas && caracteristicas.length > 0) {\n    const selectedCaracteristicas = randomFromArray(caracteristicas, randomInt(2, 6))\n    attributes.push({ key: \"caracteristicas\", value: selectedCaracteristicas })\n  }\n\n  // Outros campos do profiling\n  const mobiliado = getProfilingValue(\"mobiliado\")\n  if (mobiliado !== null) {\n    attributes.push({ key: \"mobiliado\", value: mobiliado })\n  }\n\n  const financiavel = getProfilingValue(\"financiavel\")\n  if (financiavel !== null) {\n    attributes.push({ key: \"financiavel\", value: financiavel })\n  }\n\n  const aceitaPermuta = getProfilingValue(\"aceita_permuta\")\n  if (aceitaPermuta !== null) {\n    attributes.push({ key: \"aceita_permuta\", value: aceitaPermuta })\n  }\n\n  // Valor do condomínio\n  const valorCondominio = getProfilingNumber(\"valor_condominio\", 150, 1500)\n  if (valorCondominio) {\n    attributes.push({ key: \"valor_condominio\", value: valorCondominio })\n  }\n\n  // Valor do IPTU\n  const valorIptu = getProfilingNumber(\"valor_iptu\", 500, 5000)\n  if (valorIptu) {\n    attributes.push({ key: \"valor_iptu\", value: valorIptu })\n  }\n\n  // Campos do corretor se existirem no profiling\n  const corretorId = getProfilingValue(\"corretor_id\")\n  if (corretorId) {\n    attributes.push({ key: \"corretor_id\", value: corretorId })\n  }\n\n  const corretorNome = getProfilingValue(\"corretor_nome\")\n  if (corretorNome) {\n    attributes.push({ key: \"corretor_nome\", value: corretorNome })\n  }\n\n  return attributes\n}\n\n// Gerador principal - AGORA É O ÚNICO\nexport function generateFakeProperty(\n  options: {\n    tipo?: string\n    exteriorPhotos?: number\n    interiorPhotos?: number\n  } = {}\n): PropertyModel {\n  const { \n    tipo = randomChoice([\"Casa\", \"Apartamento\", \"Sobrado\", \"Terreno\", \"Cobertura\"]),\n    exteriorPhotos = 1,\n    interiorPhotos = 3\n  } = options\n\n  const reference = `${tipo.substring(0, 3).toUpperCase()}${randomInt(1000, 9999)}_FK`\n  \n  // Gerar atributos expandidos\n  const attributes = generateEnhancedAttributes(tipo)\n  \n  // Tipo já foi adicionado na função generateEnhancedAttributes\n  \n  // Determinar operação para o título\n  const operacaoAttr = attributes.find(a => a.key === \"operacao\")\n  const operacao = operacaoAttr?.value.join(\" e \") || \"venda\"\n  \n  // Determinar localização para descrição\n  const cidadeAttr = attributes.find(a => a.key === \"endereco_cidade\")\n  const bairroAttr = attributes.find(a => a.key === \"endereco_bairro\")\n  \n  // Gerar URLs do Unsplash baseadas no tipo\n  const unsplashImages = generateUnsplashImages(tipo, exteriorPhotos + interiorPhotos)\n  const images = unsplashImages.map((url: string, index: number) => ({\n    full: url,\n    md: url.replace('w=800', 'w=640').replace('h=600', 'h=480'),\n    sm: url.replace('w=800', 'w=320').replace('h=600', 'h=240'),\n    cover: index === 0\n  }))\n  \n  // Gerar título dinâmico\n  const dormitoriosAttr = attributes.find(a => a.key === \"dormitorios\")\n  const areaAttr = attributes.find(a => a.key === \"area_util\" || a.key === \"area_total\")\n  \n  let title = `${tipo} para ${operacao}`\n  if (dormitoriosAttr) {\n    title += `, ${dormitoriosAttr.value} dormitórios`\n  }\n  if (areaAttr) {\n    title += `, ${areaAttr.value}m²`\n  }\n\n  // Gerar descrição mais rica\n  const caracteristicasAttr = attributes.find(a => a.key === \"caracteristicas\")\n  const caracteristicas = caracteristicasAttr?.value || []\n  \n  const featuresText = Array.isArray(caracteristicas) && caracteristicas.length > 0 \n    ? caracteristicas.slice(0, 5).join(', ')\n    : ''\n\n  const description = `Excelente ${tipo.toLowerCase()} em ${bairroAttr?.value}, ${cidadeAttr?.value}. ` +\n    `Imóvel com ótima localização e acabamento de qualidade. ` +\n    (featuresText ? `Características: ${featuresText}. ` : '') +\n    `Agende sua visita!`\n\n  // Converter attributes array para objeto flat\n  const attributesObj: Record<string, any> = {}\n  attributes.forEach(attr => {\n    attributesObj[attr.key] = attr.value\n  })\n\n  return {\n    reference,\n    title: title || `${tipo} para ${operacao}`,\n    description: description || `Imóvel disponível para ${operacao}`,\n    attributes: attributesObj,\n    media_assets: {\n      images,\n      videos: [],\n      virtual_tours: [],\n      documents: []\n    },\n    settings: {\n      currency_unit: \"BRL\",\n      area_unit: \"m2\",\n      exibir_no_mapa: true\n    },\n    updated_at: new Date().toISOString(),\n  }\n}\n\n// Gerador de múltiplas propriedades - AGORA É O ÚNICO\nexport function generateFakeProperties(\n  count: number = 20,\n  options: {\n    exteriorPhotos?: number\n    interiorPhotos?: number\n    tipos?: string[]\n  } = {}\n): PropertyModel[] {\n  const { tipos = [\"Casa\", \"Apartamento\", \"Sobrado\", \"Terreno\", \"Cobertura\"] } = options\n  const properties: PropertyModel[] = []\n  \n  for (let i = 0; i < count; i++) {\n    const tipo = randomChoice(tipos)\n    properties.push(generateFakeProperty({ ...options, tipo }))\n  }\n  \n  return properties\n}\n\n// Gerador por tipo específico - ATUALIZADO\nexport function generateFakePropertyByType(tipo: string): PropertyModel | null {\n  const tiposValidos = [\"Casa\", \"Apartamento\", \"Sobrado\", \"Terreno\", \"Cobertura\"]\n  if (!tiposValidos.includes(tipo)) return null\n  \n  return generateFakeProperty({ tipo })\n}\n\n// Lista dos tipos disponíveis\nexport function getAvailablePropertyTypes(): string[] {\n  return [\"Casa\", \"Apartamento\", \"Sobrado\", \"Terreno\", \"Cobertura\"]\n}\n\n// URLs do Unsplash por categoria\nconst UNSPLASH_IMAGES = {\n  apartamento: [\n    \"https://images.unsplash.com/photo-1502672260266-1c1ef2d93688?w=800&h=600&q=80\",\n    \"https://images.unsplash.com/photo-1522708323590-d24dbb6b0267?w=800&h=600&q=80\",\n    \"https://images.unsplash.com/photo-1560448204-e02f11c3d0e2?w=800&h=600&q=80\",\n    \"https://images.unsplash.com/photo-1565183997392-2f6f122e5912?w=800&h=600&q=80\"\n  ],\n  casa: [\n    \"https://images.unsplash.com/photo-1512917774080-9991f1c4c750?w=800&h=600&q=80\",\n    \"https://images.unsplash.com/photo-1568605114967-8130f3a36994?w=800&h=600&q=80\",\n    \"https://images.unsplash.com/photo-1570129477492-45c003edd2be?w=800&h=600&q=80\",\n    \"https://images.unsplash.com/photo-1583608205776-bfd35f0d9f83?w=800&h=600&q=80\"\n  ],\n  comercial: [\n    \"https://images.unsplash.com/photo-1497366216548-37526070297c?w=800&h=600&q=80\",\n    \"https://images.unsplash.com/photo-1524758631624-e2822e304c36?w=800&h=600&q=80\",\n    \"https://images.unsplash.com/photo-1462826303086-329426d1aef5?w=800&h=600&q=80\",\n    \"https://images.unsplash.com/photo-1497366811353-6870744d04b2?w=800&h=600&q=80\"\n  ],\n  terreno: [\n    \"https://images.unsplash.com/photo-1500382017468-9049fed747ef?w=800&h=600&q=80\",\n    \"https://images.unsplash.com/photo-1416331108676-a22ccb276e35?w=800&h=600&q=80\",\n    \"https://images.unsplash.com/photo-1564013799919-ab600027ffc6?w=800&h=600&q=80\",\n    \"https://images.unsplash.com/photo-1448630360428-65456885c650?w=800&h=600&q=80\"\n  ],\n  sobrado: [\n    \"https://images.unsplash.com/photo-1512917774080-9991f1c4c750?w=800&h=600&q=80\",\n    \"https://images.unsplash.com/photo-1568605114967-8130f3a36994?w=800&h=600&q=80\",\n    \"https://images.unsplash.com/photo-1570129477492-45c003edd2be?w=800&h=600&q=80\"\n  ],\n  cobertura: [\n    \"https://images.unsplash.com/photo-1502672260266-1c1ef2d93688?w=800&h=600&q=80\",\n    \"https://images.unsplash.com/photo-1560448204-e02f11c3d0e2?w=800&h=600&q=80\",\n    \"https://images.unsplash.com/photo-1565183997392-2f6f122e5912?w=800&h=600&q=80\"\n  ]\n}\n\nfunction generateUnsplashImages(tipo: string, count: number): string[] {\n  const tipoKey = tipo.toLowerCase() as keyof typeof UNSPLASH_IMAGES\n  const availableImages = UNSPLASH_IMAGES[tipoKey] || UNSPLASH_IMAGES.casa\n  const images: string[] = []\n  \n  for (let i = 0; i < count; i++) {\n    const randomImage = randomChoice(availableImages)\n    images.push(randomImage)\n  }\n  \n  return images\n}","import * as fs from 'fs'\nimport * as path from 'path'\nimport type { PropertyModel } from '../../models/property-type.schema'\n\nexport interface FieldConfig {\n  maxExamples?: number\n}\n\nexport interface ProfilerConfig {\n  inputDir?: string\n  inputData?: PropertyModel[]\n  outputDir?: string\n  outputFileName?: string\n  fieldConfigs?: Record<string, FieldConfig>\n  defaultMaxExamples?: number\n  verbose?: boolean\n}\n\nexport type ProfileResult = Record<string, any[]>\n\n/**\n * Serviço para fazer profiling (análise estatística) de dados PropertyModel\n * Pode ser usado com dados de arquivos locais ou dados em memória\n */\nexport class ProfilerService {\n  private config: Required<ProfilerConfig>\n  private fieldData: Map<string, Set<any>> = new Map()\n  private fieldExamples: Map<string, any[]> = new Map()\n  \n  constructor(config: ProfilerConfig) {\n    this.config = {\n      inputDir: config.inputDir || '',\n      inputData: config.inputData || [],\n      outputDir: config.outputDir || process.cwd(),\n      outputFileName: config.outputFileName || 'profiling-report.json',\n      fieldConfigs: config.fieldConfigs || {},\n      defaultMaxExamples: config.defaultMaxExamples || 10,\n      verbose: config.verbose ?? true\n    }\n  }\n\n  /**\n   * Executa o profiling dos dados\n   */\n  async profile(): Promise<ProfileResult> {\n    if (this.config.verbose) {\n      console.log('📊 Iniciando profiling dos dados PropertyModel...')\n    }\n\n    const data = await this.loadData()\n    this.processData(data)\n    const result = this.generateResult()\n    \n    if (this.config.outputDir) {\n      await this.saveResult(result)\n    }\n    \n    return result\n  }\n\n  /**\n   * Carrega dados de arquivos ou usa dados fornecidos\n   */\n  private async loadData(): Promise<PropertyModel[]> {\n    // Se dados foram fornecidos diretamente, usa eles\n    if (this.config.inputData.length > 0) {\n      if (this.config.verbose) {\n        console.log(`📂 Usando ${this.config.inputData.length} PropertyModel fornecidos`)\n      }\n      return this.config.inputData\n    }\n\n    // Senão, carrega de arquivos\n    if (!this.config.inputDir || !fs.existsSync(this.config.inputDir)) {\n      throw new Error(`Diretório de entrada não encontrado: ${this.config.inputDir}`)\n    }\n\n    const allData: PropertyModel[] = []\n    const files = fs.readdirSync(this.config.inputDir)\n      .filter(file => file.endsWith('.json'))\n\n    if (this.config.verbose) {\n      console.log(`📂 Carregando dados de ${files.length} arquivos...`)\n    }\n\n    for (const file of files) {\n      const filePath = path.join(this.config.inputDir, file)\n      const fileContent = fs.readFileSync(filePath, 'utf8')\n      const jsonData = JSON.parse(fileContent)\n      \n      // Detectar formato do arquivo\n      let properties: PropertyModel[] = []\n      \n      if (Array.isArray(jsonData)) {\n        properties = jsonData\n      } else if (jsonData.data && Array.isArray(jsonData.data)) {\n        properties = jsonData.data\n      } else if (typeof jsonData === 'object') {\n        // Pode ser um objeto com categorias\n        const allArrays = Object.values(jsonData).filter(Array.isArray)\n        properties = allArrays.flat() as PropertyModel[]\n      }\n\n      allData.push(...properties)\n\n      if (this.config.verbose) {\n        console.log(`   ✅ ${file}: ${properties.length} PropertyModel`)\n      }\n    }\n\n    if (this.config.verbose) {\n      console.log(`📊 Total carregado: ${allData.length} PropertyModel`)\n    }\n\n    return allData\n  }\n\n  /**\n   * Processa os dados coletados e extrai informações estatísticas\n   */\n  private processData(data: PropertyModel[]): void {\n    if (this.config.verbose) {\n      console.log('🔍 Processando dados...')\n    }\n\n    for (const property of data) {\n      this.processObject(property, '')\n    }\n\n    if (this.config.verbose) {\n      console.log(`🔍 ${this.fieldData.size} campos únicos encontrados`)\n    }\n  }\n\n  /**\n   * Processa recursivamente um objeto para extrair todos os campos\n   */\n  private processObject(obj: any, prefix: string): void {\n    if (obj === null || obj === undefined) return\n\n    if (Array.isArray(obj)) {\n      // Para arrays, adiciona cada item individual (concatena valores)\n      obj.forEach(item => {\n        if (item !== null && item !== undefined) {\n          this.addFieldValue(prefix, item)\n        }\n      })\n      return\n    }\n\n    if (typeof obj === 'object') {\n      // Para objetos, processa cada propriedade\n      Object.entries(obj).forEach(([key, value]) => {\n        const fullKey = prefix ? `${prefix}.${key}` : key\n        \n        // Se é array, só processa o array (não adiciona como valor único)\n        if (Array.isArray(value)) {\n          this.processObject(value, fullKey)\n        } else {\n          // Se não é array, adiciona como valor e processa recursivamente se for objeto\n          this.addFieldValue(fullKey, value)\n          \n          if (value && typeof value === 'object') {\n            this.processObject(value, fullKey)\n          }\n        }\n      })\n    } else {\n      // Para valores primitivos, adiciona diretamente\n      this.addFieldValue(prefix, obj)\n    }\n  }\n\n  /**\n   * Adiciona um valor para um campo específico\n   */\n  private addFieldValue(fieldName: string, value: any): void {\n    if (value === null || value === undefined) return\n\n    // Serializar arrays e objetos para comparação\n    const serializedValue = typeof value === 'object' ? JSON.stringify(value) : value\n\n    if (!this.fieldData.has(fieldName)) {\n      this.fieldData.set(fieldName, new Set())\n      this.fieldExamples.set(fieldName, [])\n    }\n\n    const fieldSet = this.fieldData.get(fieldName)!\n    const examples = this.fieldExamples.get(fieldName)!\n    \n    if (!fieldSet.has(serializedValue)) {\n      fieldSet.add(serializedValue)\n      \n      // Adicionar aos exemplos se ainda tem espaço\n      const fieldConfig = this.config.fieldConfigs[fieldName]\n      const maxExamples = fieldConfig?.maxExamples || this.config.defaultMaxExamples\n      \n      if (examples.length < maxExamples) {\n        examples.push(value)\n      }\n    }\n  }\n\n  /**\n   * Gera o resultado final do profiling\n   */\n  private generateResult(): ProfileResult {\n    const result: ProfileResult = {}\n\n    // Ordenar campos alfabeticamente\n    const sortedFields = Array.from(this.fieldData.keys()).sort()\n\n    for (const fieldName of sortedFields) {\n      const fieldConfig = this.config.fieldConfigs[fieldName]\n      const maxExamples = fieldConfig?.maxExamples !== undefined ? fieldConfig.maxExamples : this.config.defaultMaxExamples\n      \n      // Excluir campos com maxExamples = 0\n      if (maxExamples === 0) {\n        continue\n      }\n      \n      const examples = this.fieldExamples.get(fieldName) || []\n      // Ordenar exemplos alfabeticamente se forem strings\n      const sortedExamples = examples.slice().sort((a, b) => {\n        if (typeof a === 'string' && typeof b === 'string') {\n          return a.localeCompare(b)\n        }\n        if (typeof a === 'number' && typeof b === 'number') {\n          return a - b\n        }\n        // Para outros tipos, converter para string e ordenar\n        return String(a).localeCompare(String(b))\n      })\n      result[fieldName] = sortedExamples\n    }\n\n    if (this.config.verbose) {\n      console.log(`📈 Profiling concluído: ${Object.keys(result).length} campos analisados`)\n    }\n\n    return result\n  }\n\n  /**\n   * Salva o resultado em arquivo JSON\n   */\n  private async saveResult(result: ProfileResult): Promise<void> {\n    const outputPath = path.join(this.config.outputDir, this.config.outputFileName)\n    \n    // Criar diretório se não existir\n    const outputDir = path.dirname(outputPath)\n    if (!fs.existsSync(outputDir)) {\n      fs.mkdirSync(outputDir, { recursive: true })\n    }\n\n    fs.writeFileSync(outputPath, JSON.stringify(result, null, 2))\n\n    if (this.config.verbose) {\n      console.log(`📁 Relatório salvo em: ${outputPath}`)\n    }\n  }\n}\n\n/**\n * Função utilitária para fazer profiling rápido de dados em memória\n */\nexport async function profileProperties(\n  properties: PropertyModel[], \n  options: Omit<ProfilerConfig, 'inputData'> = {}\n): Promise<ProfileResult> {\n  const profiler = new ProfilerService({\n    inputData: properties,\n    ...options\n  })\n  \n  return profiler.profile()\n}\n\n/**\n * Função utilitária para fazer profiling de arquivos\n */\nexport async function profileFromFiles(\n  inputDir: string,\n  options: Omit<ProfilerConfig, 'inputDir'> = {}\n): Promise<ProfileResult> {\n  const profiler = new ProfilerService({\n    inputDir,\n    ...options\n  })\n  \n  return profiler.profile()\n}","import * as fs from 'fs'\nimport * as path from 'path'\nimport type { PropertyModel } from '../../models/property-type.schema'\n\nexport interface ApiClientConfig {\n  endpoint: string\n  headers?: Record<string, string>\n  timeout?: number\n  batchSize?: number\n}\n\n/**\n * Cliente simples para enviar dados PropertyModel para APIs externas\n */\nexport class ApiClientService {\n  private config: Required<ApiClientConfig>\n\n  constructor(config: ApiClientConfig) {\n    this.config = {\n      endpoint: config.endpoint,\n      headers: config.headers || { 'Content-Type': 'application/json' },\n      timeout: config.timeout || 30000,\n      batchSize: config.batchSize || 10\n    }\n  }\n\n  /**\n   * Envia uma propriedade para a API\n   */\n  async sendProperty(property: PropertyModel): Promise<boolean> {\n    try {\n      const response = await this.makeHttpRequest(property)\n      return response.ok\n    } catch (error) {\n      return false\n    }\n  }\n\n  /**\n   * Envia múltiplas propriedades\n   */\n  async sendProperties(properties: PropertyModel[]): Promise<void> {\n    for (const property of properties) {\n      await this.sendProperty(property)\n    }\n  }\n\n  /**\n   * Carrega propriedades de uma pasta com arquivos JSON\n   */\n  async sendPropertiesFromDir(inputDir: string): Promise<void> {\n    const properties = await this.loadPropertiesFromDir(inputDir)\n    await this.sendInBatches(properties)\n  }\n\n  /**\n   * Carrega propriedades de arquivos JSON\n   */\n  private async loadPropertiesFromDir(inputDir: string): Promise<PropertyModel[]> {\n    if (!fs.existsSync(inputDir)) {\n      throw new Error(`Diretório não encontrado: ${inputDir}`)\n    }\n\n    const allData: PropertyModel[] = []\n    const files = fs.readdirSync(inputDir)\n      .filter(file => file.endsWith('.json'))\n\n    for (const file of files) {\n      const filePath = path.join(inputDir, file)\n      const fileContent = fs.readFileSync(filePath, 'utf8')\n      const jsonData = JSON.parse(fileContent)\n      \n      // Detectar formato do arquivo\n      let properties: PropertyModel[] = []\n      \n      if (Array.isArray(jsonData)) {\n        properties = jsonData\n      } else if (jsonData.data && Array.isArray(jsonData.data)) {\n        properties = jsonData.data\n      } else if (typeof jsonData === 'object') {\n        // Pode ser um objeto com categorias\n        const allArrays = Object.values(jsonData).filter(Array.isArray)\n        properties = allArrays.flat() as PropertyModel[]\n      }\n\n      allData.push(...properties)\n    }\n\n    return allData\n  }\n\n  /**\n   * Envia propriedades em lotes\n   */\n  private async sendInBatches(properties: PropertyModel[]): Promise<void> {\n    const batches = this.createBatches(properties, this.config.batchSize)\n    \n    for (const batch of batches) {\n      await Promise.all(\n        batch.map(property => this.sendProperty(property))\n      )\n    }\n  }\n\n  /**\n   * Divide array em lotes menores\n   */\n  private createBatches<T>(array: T[], batchSize: number): T[][] {\n    const batches: T[][] = []\n    \n    for (let i = 0; i < array.length; i += batchSize) {\n      batches.push(array.slice(i, i + batchSize))\n    }\n    \n    return batches\n  }\n\n\n  /**\n   * Faz requisição HTTP para a API\n   */\n  private async makeHttpRequest(data: any): Promise<Response> {\n    const controller = new AbortController()\n    const timeout = setTimeout(() => controller.abort(), this.config.timeout)\n\n    try {\n      const response = await fetch(this.config.endpoint, {\n        method: 'POST',\n        headers: this.config.headers,\n        body: JSON.stringify(data),\n        signal: controller.signal\n      })\n\n      clearTimeout(timeout)\n      return response\n\n    } catch (error) {\n      clearTimeout(timeout)\n      throw error\n    }\n  }\n\n}","import { clone, union } from \"ramda\"\n\ninterface CustomAction {\n  fn: string\n  key: string\n  value?: any\n  type?: string\n  label?: string\n}\n\ninterface AttributeRule {\n  key: string\n  condition?: Record<string, any>\n  rules: CustomAction[]\n}\n\ninterface MapRules {\n  referenceRules?: Record<string, CustomAction[]>\n  attributesRules?: AttributeRule[]\n}\n\ninterface PropertyV3 {\n  id?: string\n  reference?: string\n  title?: string\n  description?: string\n  attributes: Record<string, any>\n  [key: string]: any\n}\n\nfunction upsertAttribute(attributes: Record<string, any>, key: string, value: any) {\n  attributes[key] = value\n}\n\nfunction addToArray(property: PropertyV3, action: CustomAction) {\n  const currentValue = property.attributes[action.key]\n  const newValues = Array.isArray(action.value) ? action.value : [action.value]\n  \n  if (!currentValue) {\n    // Criar novo array\n    property.attributes[action.key] = newValues\n  } else if (Array.isArray(currentValue)) {\n    // Adicionar ao array existente\n    property.attributes[action.key] = union(currentValue, newValues)\n  } else {\n    // Converter valor existente para array\n    property.attributes[action.key] = union([currentValue], newValues)\n  }\n}\n\nfunction removeAttr(attributes: Record<string, any>, key: string) {\n  delete attributes[key]\n}\n\nfunction removeFromArray(property: PropertyV3, action: CustomAction) {\n  const currentValue = property.attributes[action.key]\n  if (!currentValue || !Array.isArray(currentValue)) return\n  \n  property.attributes[action.key] = currentValue.filter(item => item !== action.value)\n  \n  // Remove atributo se array ficou vazio\n  if (property.attributes[action.key].length === 0) {\n    delete property.attributes[action.key]\n  }\n}\n\nconst actionRunner: Record<string, (property: PropertyV3, action: CustomAction) => void> = {\n  upsertAttr: (property: PropertyV3, action: CustomAction) => {\n    upsertAttribute(property.attributes, action.key, action.value)\n  },\n  removeAttr: (property: PropertyV3, action: CustomAction) => {\n    removeAttr(property.attributes, action.key)\n  },\n  addToArray: (property: PropertyV3, action: CustomAction) => {\n    addToArray(property, action)\n  },\n  removeFromArray: (property: PropertyV3, action: CustomAction) => {\n    removeFromArray(property, action)\n  },\n}\n\nfunction processDescriptionTags(property: PropertyV3) {\n  if (!property.description) return\n  \n  let description = property.description\n  const tagRegex = /\\[\\[([^\\]]+)\\]\\](.*?)\\[\\[\\/\\1\\]\\]/gs\n  const matches = [...description.matchAll(tagRegex)]\n  \n  // Processar todas as tags encontradas\n  for (const match of matches) {\n    const [, tagName, content] = match\n    const cleanTagName = tagName.replace(/-/g, '_') // description-en -> description_en\n    const cleanContent = content.trim()\n    \n    if (tagName === 'custom-attributes') {\n      // Para custom-attributes, tentamos fazer parse JSON\n      try {\n        const jsonData = JSON.parse(cleanContent)\n        if (jsonData && typeof jsonData === 'object') {\n          // Merge JSON attributes into property.attributes\n          Object.assign(property.attributes, jsonData)\n        }\n      } catch (error) {\n        console.warn(`⚠️ Erro ao processar JSON em custom-attributes: ${error instanceof Error ? error.message : String(error)}`)\n        // Se não for JSON válido, adiciona como string mesmo\n        property.attributes[cleanTagName] = cleanContent\n      }\n    } else {\n      // Tag simples: adicionar como atributo\n      property.attributes[cleanTagName] = cleanContent\n    }\n  }\n  \n  // Remover todas as tags da description\n  description = description.replace(tagRegex, '').trim()\n  // Limpar espaços duplos\n  description = description.replace(/  +/g, ' ')\n  // Limpar linhas vazias extras\n  description = description.replace(/\\n{3,}/g, '\\n\\n')\n  \n  // Atualizar description limpa\n  property.description = description\n}\n\nfunction applyReferenceRules(reference: string, rules: Record<string, CustomAction[]>, property: PropertyV3) {\n  const actions = rules?.[reference]\n  if (!actions) return\n\n  actions.forEach((action) => {\n    const fn = actionRunner[action.fn]\n    if (fn) fn(property, action)\n  })\n}\n\nfunction matchCondition(attrValue: any, condition: any): boolean {\n  if (!condition) return true\n\n  // Normalize attrValue como array quando necessário\n  const attrAsArray = Array.isArray(attrValue)\n    ? attrValue\n    : typeof attrValue === \"string\"\n    ? [attrValue]\n    : []\n\n  const attrAsString = typeof attrValue === \"string\" ? attrValue : String(attrValue)\n\n  for (const operator in condition) {\n    const expected = condition[operator]\n\n    switch (operator) {\n      // Igualdade\n      case \"eq\":\n        if (attrValue !== expected) return false\n        break\n      case \"not_eq\":\n        if (attrValue === expected) return false\n        break\n      \n      // Arrays\n      case \"has\": {\n        const attrAsArray = Array.isArray(attrValue) ? attrValue : [attrValue]\n        const expectedArray = Array.isArray(expected) ? expected : [expected]\n        if (!expectedArray.every((val) => attrAsArray.includes(val)))\n          return false\n        break\n      }\n      case \"has_any\": {\n        const attrAsArray = Array.isArray(attrValue) ? attrValue : [attrValue]\n        const expectedArray = Array.isArray(expected) ? expected : [expected]\n        if (!expectedArray.some((val) => attrAsArray.includes(val)))\n          return false\n        break\n      }\n      case \"not_has\":\n        if (Array.isArray(expected)) {\n          if (expected.some((val) => attrAsArray.includes(val))) return false\n        } else {\n          if (attrAsArray.includes(expected)) return false\n        }\n        break\n      \n      // Numéricos\n      case \"gt\":\n        if (!(Number(attrValue) > Number(expected))) return false\n        break\n      case \"gte\":\n        if (!(Number(attrValue) >= Number(expected))) return false\n        break\n      case \"lt\":\n        if (!(Number(attrValue) < Number(expected))) return false\n        break\n      case \"lte\":\n        if (!(Number(attrValue) <= Number(expected))) return false\n        break\n      \n      // Texto\n      case \"contains\":\n        if (!attrAsString.toLowerCase().includes(String(expected).toLowerCase())) return false\n        break\n      case \"starts_with\":\n        if (!attrAsString.toLowerCase().startsWith(String(expected).toLowerCase())) return false\n        break\n      case \"ends_with\":\n        if (!attrAsString.toLowerCase().endsWith(String(expected).toLowerCase())) return false\n        break\n      \n      // Booleanos\n      case \"is_true\":\n        if (attrValue !== true && attrValue !== \"true\" && attrValue !== 1) return false\n        break\n      case \"is_false\":\n        if (attrValue !== false && attrValue !== \"false\" && attrValue !== 0) return false\n        break\n      \n      // Existência\n      case \"exists\":\n        if (attrValue === null || attrValue === undefined || attrValue === \"\") return false\n        break\n      case \"not_exists\":\n        if (attrValue !== null && attrValue !== undefined && attrValue !== \"\") return false\n        break\n      \n      default:\n        return false // operador desconhecido\n    }\n  }\n\n  return true\n}\n\nfunction resolvePlaceholders(action: CustomAction, sourceAttr: { key: string; value: any }): CustomAction {\n  const resolved = { ...action }\n\n  if (resolved.value === \"{{value}}\") {\n    resolved.value = sourceAttr.value\n  } else if (\n    typeof resolved.value === \"string\" &&\n    resolved.value.includes(\"{{value}}\")\n  ) {\n    resolved.value = resolved.value.replace(\n      \"{{value}}\",\n      String(sourceAttr.value)\n    )\n  }\n\n  return resolved\n}\n\nfunction applyAttributesRules(attributes: Record<string, any>, rules: AttributeRule[], property: PropertyV3) {\n  for (const rule of rules) {\n    const attrValue = attributes[rule.key]\n    if (attrValue === undefined) continue\n\n    if (matchCondition(attrValue, rule.condition)) {\n      for (const action of rule.rules) {\n        const fn = actionRunner[action.fn]\n        if (fn) {\n          const resolvedAction = resolvePlaceholders(action, { key: rule.key, value: attrValue })\n          fn(property, resolvedAction)\n        }\n      }\n    }\n  }\n}\n\nexport function PropertyCustomizer(property: PropertyV3, mapRules: MapRules): PropertyV3 {\n  const newProperty = clone(property) as PropertyV3\n  const { reference } = newProperty\n\n  // 1. PRIMEIRO: Processar tags da description\n  processDescriptionTags(newProperty)\n\n  const { referenceRules, attributesRules } = mapRules\n\n  // 2. Aplica regras baseadas na referência\n  if (referenceRules && reference) {\n    applyReferenceRules(reference, referenceRules, newProperty)\n  }\n\n  // 3. Aplica regras baseadas em atributos avançados\n  if (attributesRules) {\n    applyAttributesRules(newProperty.attributes, attributesRules, newProperty)\n  }\n\n  return newProperty\n}\n\n// Export types\nexport type { PropertyV3, MapRules, AttributeRule, CustomAction }","{\n  \"$ref\": \"#/definitions/PropertyModel\",\n  \"definitions\": {\n    \"PropertyModel\": {\n      \"type\": \"object\",\n      \"properties\": {\n        \"reference\": {\n          \"type\": \"string\"\n        },\n        \"title\": {\n          \"type\": \"string\"\n        },\n        \"description\": {\n          \"type\": \"string\"\n        },\n        \"media_assets\": {\n          \"type\": \"object\",\n          \"properties\": {\n            \"images\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"properties\": {\n                  \"full\": {\n                    \"type\": \"string\"\n                  },\n                  \"md\": {\n                    \"type\": \"string\"\n                  },\n                  \"sm\": {\n                    \"type\": \"string\"\n                  },\n                  \"cover\": {\n                    \"type\": \"boolean\"\n                  }\n                },\n                \"required\": [\n                  \"full\"\n                ],\n                \"additionalProperties\": false\n              }\n            },\n            \"videos\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"properties\": {\n                  \"provider\": {\n                    \"type\": \"string\"\n                  },\n                  \"id\": {\n                    \"type\": \"string\"\n                  },\n                  \"embed_url\": {\n                    \"type\": \"string\"\n                  }\n                },\n                \"additionalProperties\": false\n              }\n            },\n            \"virtual_tours\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"properties\": {\n                  \"embed_url\": {\n                    \"type\": \"string\"\n                  }\n                },\n                \"required\": [\n                  \"embed_url\"\n                ],\n                \"additionalProperties\": false\n              }\n            },\n            \"documents\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"properties\": {\n                  \"name\": {\n                    \"type\": \"string\"\n                  },\n                  \"url\": {\n                    \"type\": \"string\"\n                  }\n                },\n                \"required\": [\n                  \"name\",\n                  \"url\"\n                ],\n                \"additionalProperties\": false\n              }\n            }\n          },\n          \"additionalProperties\": false\n        },\n        \"attributes\": {\n          \"type\": \"object\",\n          \"additionalProperties\": {}\n        },\n        \"settings\": {\n          \"type\": \"object\",\n          \"properties\": {\n            \"currency_unit\": {\n              \"type\": \"string\",\n              \"enum\": [\n                \"BRL\",\n                \"USD\"\n              ]\n            },\n            \"area_unit\": {\n              \"type\": \"string\",\n              \"enum\": [\n                \"m2\",\n                \"ft2\"\n              ]\n            },\n            \"distance_unit\": {\n              \"type\": \"string\",\n              \"enum\": [\n                \"km\",\n                \"mi\",\n                \"meters\"\n              ]\n            },\n            \"exibir_no_mapa\": {\n              \"type\": \"boolean\"\n            }\n          },\n          \"additionalProperties\": false\n        },\n        \"updated_at\": {\n          \"type\": \"string\"\n        }\n      },\n      \"required\": [\n        \"reference\",\n        \"title\",\n        \"description\",\n        \"media_assets\",\n        \"attributes\"\n      ],\n      \"additionalProperties\": false\n    }\n  },\n  \"$schema\": \"http://json-schema.org/draft-07/schema#\"\n}","{\n  \"$ref\": \"#/definitions/PropertyModel\",\n  \"definitions\": {\n    \"PropertyModel\": {\n      \"type\": \"object\",\n      \"properties\": {\n        \"reference\": {\n          \"type\": \"string\"\n        },\n        \"title\": {\n          \"type\": \"string\"\n        },\n        \"description\": {\n          \"type\": \"string\"\n        },\n        \"media_assets\": {\n          \"type\": \"object\",\n          \"properties\": {\n            \"images\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"properties\": {\n                  \"full\": {\n                    \"type\": \"string\"\n                  },\n                  \"md\": {\n                    \"type\": \"string\"\n                  },\n                  \"sm\": {\n                    \"type\": \"string\"\n                  },\n                  \"cover\": {\n                    \"type\": \"boolean\"\n                  }\n                },\n                \"required\": [\n                  \"full\"\n                ],\n                \"additionalProperties\": false\n              }\n            },\n            \"videos\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"properties\": {\n                  \"provider\": {\n                    \"type\": \"string\"\n                  },\n                  \"id\": {\n                    \"type\": \"string\"\n                  },\n                  \"embed_url\": {\n                    \"type\": \"string\"\n                  }\n                },\n                \"additionalProperties\": false\n              }\n            },\n            \"virtual_tours\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"properties\": {\n                  \"embed_url\": {\n                    \"type\": \"string\"\n                  }\n                },\n                \"required\": [\n                  \"embed_url\"\n                ],\n                \"additionalProperties\": false\n              }\n            },\n            \"documents\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"type\": \"object\",\n                \"properties\": {\n                  \"name\": {\n                    \"type\": \"string\"\n                  },\n                  \"url\": {\n                    \"type\": \"string\"\n                  }\n                },\n                \"required\": [\n                  \"name\",\n                  \"url\"\n                ],\n                \"additionalProperties\": false\n              }\n            }\n          },\n          \"additionalProperties\": false\n        },\n        \"attributes\": {\n          \"type\": \"object\",\n          \"additionalProperties\": {}\n        },\n        \"settings\": {\n          \"type\": \"object\",\n          \"properties\": {\n            \"currency_unit\": {\n              \"type\": \"string\",\n              \"enum\": [\n                \"BRL\",\n                \"USD\"\n              ]\n            },\n            \"area_unit\": {\n              \"type\": \"string\",\n              \"enum\": [\n                \"m2\",\n                \"ft2\"\n              ]\n            },\n            \"distance_unit\": {\n              \"type\": \"string\",\n              \"enum\": [\n                \"km\",\n                \"mi\",\n                \"meters\"\n              ]\n            },\n            \"exibir_no_mapa\": {\n              \"type\": \"boolean\"\n            }\n          },\n          \"additionalProperties\": false\n        },\n        \"updated_at\": {\n          \"type\": \"string\"\n        }\n      },\n      \"required\": [\n        \"reference\",\n        \"title\",\n        \"description\",\n        \"media_assets\",\n        \"attributes\"\n      ],\n      \"additionalProperties\": false\n    }\n  },\n  \"$schema\": \"http://json-schema.org/draft-07/schema#\"\n}"],"mappings":"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","names":["fs","path","fs","path","attrAsArray"]}