import { z } from "zod"

// Schema Horizon v2.3.0 para HorizonPropertySchemaBase
// Removidos do base: tags, numero_pessoas, subtipo, valor_diaria, geo_aproximado (agora são extras de cada CRM)
// Gerado automaticamente com inferência inteligente

/**
 * Formato de imagem Horizon V3
 * - md: URL tamanho médio
 * - sm: URL tamanho pequeno
 * - full: URL tamanho completo
 */
const ImageSchema = z.object({
  md: z.string().url().describe("URL tamanho médio"),
  sm: z.string().url().describe("URL tamanho pequeno"),
  full: z.string().url().describe("URL tamanho completo"),
  cover: z.boolean().describe("Se é imagem de capa")
})

/**
 * Formato de imagem principal (sem flag cover)
 */
const MainImageSchema = z.object({
  md: z.string().url().describe("URL tamanho médio"),
  sm: z.string().url().describe("URL tamanho pequeno"),
  full: z.string().url().describe("URL tamanho completo")
})

const VideoSchema = z.object({
  url: z.string().nullish().describe("Url do vídeo"),
  embed_url: z.string().nullish().describe("Url de incorporação do vídeo"),
})

const VirtualTourSchema = z.object({
  embed_url: z.string().url().describe("URL de incorporação do tour 360°")
})

export const HorizonPropertySchemaBaseZod = z.object({
  // Sistema
  source_published_at: z.string().nullish().describe("Data da publicação original"),
  source_updated_at: z.string().describe("Data da última republicação"),
  currency: z.string().default("BRL").describe("Moeda"),
  unit_area: z.string().default("m2").describe("Unidade de área"),
  unit_distance: z.enum(["meters", "km"]).default("meters").describe("Unidade de distância"),
  // Cabecalho
  reference: z.string().describe("Referência"),
  title: z.string().max(200).describe("Título"),
  description: z.string().describe("Descrição"),
  // SEO
  seo_slug: z.string().max(255).nullish().describe("Slug SEO"),
  seo_title: z.string().max(60).nullish().describe("Título SEO"),
  seo_description: z.string().max(160).nullish().describe("Descrição SEO"),
  seo_keywords: z.string().max(200).nullish().describe("Palavras-chave SEO"),
  // Medias
  main_image: MainImageSchema.describe("Imagem principal").optional(),
  images: z.array(ImageSchema).describe("Imagens"),
  videos: z.array(VideoSchema).describe("Vídeos"),
  virtual_tours: z.array(VirtualTourSchema).describe("Tours virtuais"),
  // Ficha técnica
  operacao: z.array(z.enum(["venda", "locacao", "temporada"])).describe("Operação"),
  tipo: z.string().describe("Tipo do imóvel"),
  dormitorios: z.number().min(0).nullish().describe("Dormitórios"),
  suites: z.number().min(0).nullish().describe("Suítes"),
  banheiros: z.number().min(0).nullish().describe("Banheiros"),
  vagas_garagem: z.number().min(0).nullish().describe("Vagas de garagem"),
  area_total: z.number().min(0).nullish().describe("Área total"),
  area_privativa: z.number().min(0).nullish().describe("Área privativa"),
  area_util: z.number().min(0).nullish().describe("Área útil"),
  destaque: z.boolean().nullish().describe("Imóvel em destaque"),
  // VALORES
  valor_venda: z.number().nullish().describe("Valor de venda"),
  valor_locacao: z.number().nullish().describe("Valor de locação"),
  valor_condominio: z.number().nullish().describe("Valor do condomínio"),
  valor_iptu: z.number().nullish().describe("Valor do IPTU"),
  // LOCALIZACAO
  endereco_cep: z.string().max(9).nullish().describe("CEP"),
  endereco_estado: z.string().nullish().describe("Estado"),
  endereco_cidade: z.string().nullish().describe("Cidade"),
  endereco_bairro: z.string().nullish().describe("Bairro"),
  endereco_logradouro: z.string().nullish().describe("Logradouro"),
  endereco_numero: z.string().nullish().describe("Número"),
  endereco_complemento: z.string().nullish().describe("Complemento"),
  endereco_referencia: z.string().nullish().describe("Referência"),
  endereco_zona: z.string().nullish().describe("Zona"),
  lat: z.number().min(-90).max(90).nullish().describe("Latitude"),
  lng: z.number().min(-180).max(180).nullish().describe("Longitude"),
  // RELACIONAMENTOS
  corretor_key: z.string().nullish().describe("ID do corretor"),
  corretor_nome: z.string().nullish().describe("Nome do corretor"),
  condominio_key: z.string().nullish().describe("ID do condomínio"),
  condominio_nome: z.string().nullish().describe("Nome do condomínio"),
})

// Tipo inferido a partir do schema
export type HorizonPropertySchemaBaseType = z.infer<typeof HorizonPropertySchemaBaseZod>
// 
// Função helper para validação
export const validateHorizonPropertySchemaBase = (data: unknown): HorizonPropertySchemaBaseType => {
  return HorizonPropertySchemaBaseZod.parse(data)
}

// Função helper para validação safe
export const safeValidateHorizonPropertySchemaBase = (data: unknown) => {
  return HorizonPropertySchemaBaseZod.safeParse(data)
}

// Função helper para validação parcial
export const validatePartialHorizonPropertySchemaBase = (data: unknown) => {
  return HorizonPropertySchemaBaseZod.partial().parse(data)
}
