import { describe, it, expect } from 'vitest'
import { buildListingInput, type WizardForm } from './publish'

const base: WizardForm = {
  title: 'Proyecto Demo Cu en Atacama',
  stage: 'EXPLORACION_BASICA',
  assetType: 'CONCESION_MINERA',
  offerType: 'VENTA_TOTAL',
  commodities: ['CU', 'AU'],
  primaryCommodity: 'CU',
  country: 'CL',
  region: 'Atacama',
  city: 'Copiapó',
  lat: '-27.37',
  lng: '-70.33',
  surfaceHa: '120',
  concessionCount: '3',
  dealTypes: ['VENTA_100'],
  priceUsd: '1500000',
  headline: '',
  sellReason: 'Reenfoque de portafolio',
  sellerCompany: 'Demo Mining SpA',
  sellerWebsite: '',
  sellerType: 'PERSONA_JURIDICA',
  mineralizationType: 'Veta',
  works: ['Sondajes', 'Mapeo geológico'],
  waterAccess: 'Disponible en cuenca',
  energyAccess: 'Línea MT a 5 km',
  esgEnvStatus: '',
  esgClosurePlan: '',
  esgCommunity: '',
  esgLiabilities: '',
  description: 'Proyecto de cobre con vetas reconocidas y potencial en profundidad.',
  contactName: 'Ana Pérez',
  contactRole: 'Gerente',
  contactEmail: 'ana@demo.cl',
  contactPhone: '+56 9 1234 5678',
  contactPreference: 'EMAIL',
  hasAgent: false,
}

describe('buildListingInput', () => {
  it('arma un input válido con relaciones y slug', () => {
    const r = buildListingInput(base)
    expect(r.ok).toBe(true)
    if (!r.ok) return
    expect(r.data.slug).toBe('proyecto-demo-cu-en-atacama')
    expect(r.data.category).toBe('ACTIVO')
    expect(r.data.priceUsd).toBe(1_500_000)
    expect(r.data.surfaceHa).toBe(120)
    expect(r.data.commodities.create).toEqual([
      { commodity: 'CU', isPrimary: true },
      { commodity: 'AU', isPrimary: false },
    ])
    expect(r.data.dealTypes.create).toEqual([{ dealType: 'VENTA_100' }])
    expect(r.data.status).toBe('PUBLISHED')
    expect(r.data.lat).toBe(-27.37)
    expect(r.data.lng).toBe(-70.33)
  })

  it('rechaza si falta título, país, commodity o estructura', () => {
    expect(buildListingInput({ ...base, title: '' }).ok).toBe(false)
    expect(buildListingInput({ ...base, country: '' }).ok).toBe(false)
    expect(buildListingInput({ ...base, commodities: [] }).ok).toBe(false)
    expect(buildListingInput({ ...base, dealTypes: [] }).ok).toBe(false)
  })

  it('descarta precio/superficie no numéricos en lugar de fallar', () => {
    const r = buildListingInput({ ...base, priceUsd: 'abc', surfaceHa: '' })
    expect(r.ok).toBe(true)
    if (!r.ok) return
    expect(r.data.priceUsd).toBeNull()
    expect(r.data.surfaceHa).toBeNull()
  })
})
