import {
  ASSET_TYPE_LABELS,
  ASSET_TYPE_CODES,
  STAGE_LABELS,
  STAGE_CODES,
  DEAL_TYPE_LABELS,
  type AssetType,
  type Stage,
  type DealType,
} from './constants'

type CommodityRel = { commodity: string; isPrimary?: boolean }

/** Resumen corto de modalidad a partir de los tipos de trato. */
export function modalityLabel(dealTypes: { dealType: string }[]): string {
  if (!dealTypes || dealTypes.length === 0) return 'Consultar'
  const labels = dealTypes
    .map((d) => DEAL_TYPE_LABELS[d.dealType as DealType] ?? d.dealType)
    .filter((v, i, a) => a.indexOf(v) === i)
  return labels.slice(0, 2).join(' / ')
}

/** Código de referencia determinista (no es ROL real). */
export function refCode(listing: { slug: string }): string {
  let h = 0
  for (let i = 0; i < listing.slug.length; i++) {
    h = (h * 31 + listing.slug.charCodeAt(i)) >>> 0
  }
  return 'PM-' + h.toString(16).toUpperCase().padStart(5, '0').slice(-5)
}

export function primaryCommodity(listing: { commodities: CommodityRel[] }): string | null {
  if (!listing.commodities || listing.commodities.length === 0) return null
  const primary = listing.commodities.find((c) => c.isPrimary)
  return (primary ?? listing.commodities[0]).commodity
}

export function secondaryCommodities(listing: { commodities: CommodityRel[] }): string[] {
  const primary = primaryCommodity(listing)
  return (listing.commodities ?? []).map((c) => c.commodity).filter((c) => c !== primary)
}

export function assetTypeLabel(assetType: string | null | undefined): string {
  if (!assetType) return 'Activo minero'
  return ASSET_TYPE_LABELS[assetType as AssetType] ?? 'Activo minero'
}

export function assetTypeCode(assetType: string | null | undefined): string {
  if (!assetType) return 'ACT'
  return ASSET_TYPE_CODES[assetType as AssetType] ?? 'ACT'
}

export function stageLabel(stage: string | null | undefined): string | null {
  if (!stage) return null
  return STAGE_LABELS[stage as Stage] ?? null
}

export function stageCode(stage: string | null | undefined): string {
  if (!stage) return '—'
  return STAGE_CODES[stage as Stage] ?? '—'
}

// ── Imagen del lugar ──────────────────────────────────────────────────────
// Garantiza que TODA publicación tenga una imagen del lugar relacionado.

const SEED_IMAGES: Record<string, string> = {
  'cobre-subterraneo-180ha-desarrollo-avanzado': 'underground',
  'cobre-subterraneo': 'underground',
  'litio-salar-norte-prospecto': 'salar-litio',
  'planta-procesamiento-flotacion-coquimbo': 'processing-plant',
  'relave-reprocesamiento-atacama': 'tailings',
}

const REGION_IMAGES: Record<string, string> = {
  'Santa Cruz': 'patagonia-steppe',
  Jujuy: 'puna-jujuy',
  Atacama: 'atacama-desert',
  Antofagasta: 'atacama-desert',
  Coquimbo: 'coquimbo-andes',
  Valparaíso: 'central-chile',
}

type ListingImageInput = {
  imageSeed?: string | null
  assetType?: string | null
  region?: string | null
  commodities: CommodityRel[]
}

export function listingImage(listing: ListingImageInput): string {
  const file = resolveImageName(listing)
  return `/listings/${file}.jpg`
}

function resolveImageName(listing: ListingImageInput): string {
  if (listing.imageSeed && SEED_IMAGES[listing.imageSeed]) return SEED_IMAGES[listing.imageSeed]
  if (listing.assetType === 'INFRAESTRUCTURA_PLANTA') return 'processing-plant'
  if (listing.assetType === 'RELAVE_RIPIO_ESCORIA') return 'tailings'
  if (primaryCommodity(listing) === 'LI') return 'salar-litio'
  if (listing.region && REGION_IMAGES[listing.region]) return REGION_IMAGES[listing.region]
  return 'open-pit'
}
