export type Calidad = 'basica' | 'media' | 'premium';
export type Unidad = 'm2' | 'ml' | 'ud';
export type CategoriaMaterial = 'suelo' | 'pared' | 'pintura' | 'mobiliario';
export type TipoReforma = 'cocina' | 'bano' | 'salon' | 'comedor' | 'integral' | 'otro';

export type PartidaKey =
  | 'demolicion'
  | 'impermeabilizacion'
  | 'alicatado'
  | 'fontaneria'
  | 'electricidad'
  | 'carpinteria'
  | 'mano_de_obra'
  | 'extras'
  | 'extras_fijos'
  | 'licencia';

export type ManoObraKey =
  | 'demolicion'
  | 'impermeabilizacion'
  | 'fontaneria'
  | 'electricidad'
  | 'mano_de_obra';

export interface CatalogItem {
  id: string;
  categoria: CategoriaMaterial;
  nombre: string;
  calidad: Calidad;
  precioUnit: number; // céntimos por unidad
  unidad: Unidad;
  descriptorRender: string;
  esDefault: boolean;
  sku: string;
}

// Extras fijos que no escalan con los m² (céntimos). Se aplican según el estado del piso.
export interface ExtrasFijos {
  tuberias: number; // renovación de tuberías (pisos anteriores a 2000)
  boletin: number; // boletín eléctrico (siempre obligatorio)
  distribucion: number; // cambio de distribución (mover inodoro/ducha/bañera)
}

export interface PricingConfig {
  alturaTechoDefault: number; // metros
  factorZona: Record<string, number>; // provincia -> multiplicador
  manoObra: Record<ManoObraKey, number>; // céntimos por m² de suelo
  extras?: ExtrasFijos; // importes fijos en céntimos
}

export interface BudgetInputs {
  tipoReforma: TipoReforma;
  m2Suelo: number | null;
  alturaTecho: number | null;
  calidadGlobal: Calidad;
  estructural: boolean;
  provincia: string | null;
  materialSelections: Partial<Record<CategoriaMaterial, string>>; // categoria -> catalogItemId
  anteriorA2000?: boolean; // dispara el extra de renovación de tuberías
  cambioDistribucion?: boolean; // dispara el extra de cambio de distribución
}

export interface PartidaResult {
  // PartidaKey para las partidas que genera el motor; string libre (p. ej. 'custom-1')
  // para las que añade el reformista a mano en la revisión.
  key: PartidaKey | string;
  label: string;
  importe: number; // céntimos (base, antes de factor zona)
}

export interface BudgetResult {
  partidas: PartidaResult[];
  subtotal: number; // céntimos
  factorZona: number;
  total: number; // céntimos = round(subtotal * factorZona)
  rango: { min: number; max: number }; // céntimos
  confianza: 'baja' | 'media' | 'alta';
  materialesRender: string[]; // descriptores para el prompt del render
  avisos: string[];
}
