import { EstadoProducto, Id, TipoProducto } from '@win2win/shared';
import { compact, has, isArray, isObject, keys, mapValues, omit, toPairs } from 'lodash';

export function extractContent(value: any) {
  if (value === undefined || value === null) {
    return '';
  }
  if (isArray(value)) {
    return value.map(extractContent);
  }

  if (isObject(value)) {
    if (!keys(value).length) {
      return '';
    }
    delete value['_attributes'];
    if (has(value, '_cdata') || has(value, '_text')) {
      return value['_cdata'] || value['_text'] || '';
    }
    return mapValues(value, extractContent);
  }
  return value ?? '';
}

const tiposTranslate = {
  apartment: 'apartamento',
  flat: 'piso',
  'business premises': 'local comercial',
  villa: 'villa',
  garage: 'garaje',
  maisonette: 'dúplex',
  'terraced house': 'casa adosada',
  'semi-detached': 'casa pareada',
  studio: 'estudio',
  plot: 'terreno',
  'ground floor apartment': 'apartamento en planta baja',
  loft: 'ático',
  penthouse: 'penthouse',
  'country house': 'casa de campo',
  'industrial unit': 'nave industrial',
};

export function extractKyeroProperty(item: any) {
  const parsedItem = mapValues(item, extractContent);
  const { features, images, desc } = parsedItem;
  const feature = features?.feature || [];
  const image = images?.image || [];
  return {
    ...parsedItem,
    id: parsedItem.id || parsedItem.cod_elemento,
    images: compact(isArray(image) ? image : [image]),
    features: compact(isArray(feature) ? feature : [feature]),
    desc: desc?.es || desc?.en || '',
    type: tiposTranslate[parsedItem.type?.toLowerCase()] || parsedItem.tipo,
    propietario: {
      codigo: parsedItem.codigo_propietario,
      nombre: parsedItem.nombre_propietario,
      apellido: parsedItem.apellido_propietario,
      dni: parsedItem.dni_propietario,
      telefono_domicilio: parsedItem.telf_domicilio_propietario,
      telefono_movil: parsedItem.telf_movil_propietario,
      telefono_trabajo: parsedItem.telf_trabajo_propietario,
      email: parsedItem.email_propietario,
      razon_social: parsedItem.razon_social_propietario,
      cif: parsedItem.cif_propietario,
      direccion: parsedItem.direccion_propietario,
      cp: parsedItem.cp_propietario,
      observaciones: parsedItem.observaciones_propietario,
      comercial: parsedItem.comercial_propietario,
      fecha_alta: parsedItem.fec_alta_propietario,
    },
  };
}

export function fromKyeroToW2W(item: any) {
  // TODO: agregar props especificas segun tipo de propiedad
  const w2wItem = {};
  const kyeroKeys = keys(keyMapping);
  kyeroKeys.forEach((key) => {
    const w2wKey = keyMapping[key];
    if (!w2wKey) return;
    w2wItem[w2wKey] = item[key];
  });
  return w2wItem;
}

const keyMapping = {
  price: 'precio',
  price_freq: 'freq_precio',
  location: 'geolocalizacion',
  id: 'id',
  date: 'fecha_alta',
  ref: 'ref',
  status: 'estado',
  currency: 'moneda',
  new_build: 'construccion_nueva',
  type: 'tipo',
  location_detail: 'zona',
  town: 'ciudad', // gava
  province: 'provincia',
  postcode: 'codigo_postal',
  tipo_via: 'tipo_via',
  Direccion: 'direccion',
  npisosedif: 'num_pisos_edificio',
  npisosbloque: 'num_pisos_bloque',
  num_planta: 'num_planta',
  num_inmueble: 'num_inmueble',
  puerta: 'puerta',
  country: 'pais',
  agent: 'agente',
  beds: 'dormitorios',
  baths: 'banios',
  pool: 'piscina',
  surface_area: 'superficie',
  desc: 'descripcion',
  features: 'caracteristicas',
  images: 'imagenes',
  propietario: 'propietario',
  tipo_operacion: 'tipo_operacion',
  antiguedad: 'antiguedad',
  m2utiles: 'm2utiles',
  m2constr: 'm2constr',
  tipo_suelo: 'tipo_suelo',
  Estado: 'circunstancia',
  des_orientacion: 'des_orientacion',
  situacion: 'situacion',
  nascensor: 'nascensor',
  ubicacion: 'ubicacion',
  ventana: 'ventana',
  climatizacion: 'climatizacion',
  calefaccion: 'calefaccion',
  cocina: 'cocina',
  zonascomunes: 'zonascomunes',
  alrededores: 'alrededores',
  certificado_energetico: 'certificado_energetico',
  certificado_emisiones: 'certificado_emisiones',
  consumo_energia: 'consumo_energia',
  emisiones: 'emisiones',
  condiciones: 'condiciones',
  estgen: 'estgen',
  m2terraza: 'm2terraza',
  amueblado: 'amueblado',
  ntrasteros: 'ntrasteros',
  num_terrazas: 'num_terrazas',
};

export const W2W_KEYS = toPairs(keyMapping).map(([_, value]) => value);

export function buildProducto(item: any, idGama: Id) {
  const IMAGENES = item.imagenes.map((img) => img.url);
  const UBICACION = {
    CIUDAD: item.ciudad || null,
    LOCALIDAD: item.zona || null,
    PROVINCIA: item.provincia || null,
    COD_POSTAL: item.codigo_postal || null,
    CALLE: `${item.num_inmueble || ''} ${item.direccion || ''}`.trim(),
    PAIS: item.pais,
    LATITUDE: Number(item.geolocalizacion?.latitude ?? 0),
    LONGITUDE: Number(item.geolocalizacion?.longitude ?? 0),
    ESTADO: 1,
    ID_PAIS: item.pais === 'spain' ? 28 : null,
  };
  const descripcion = item.descripcion || '';
  return {
    ID_GAMA: idGama,
    PROPS: omit(item, 'imagenes'),
    TIPO_PRODUCTO: TipoProducto.ARTICULO,
    NOMBRE: descripcion.slice(0, 100),
    DESCRIPCION: descripcion.slice(0, 1000),
    CODIGO_EXTERNO: item.id,
    COD_ART_MVX: item.id,
    PUBLICO: item.estado === 'Disponible',
    ESTADO: getEstadoProducto(item.estado),
    PRECIO: Number(item.precio || 0),
    IMAGENES,
    UBICACION,
  };
}

enum EstadoRaw {
  NO_DISPONIBLE = 'No Disponible',
  PENDIENTE = 'Pendiente',
  DISPONIBLE = 'Disponible',
  BAJA = 'Baja',
  ALQUILADO_OTRA_INMOB = 'Alquilado Otra Inmob.',
}

function getEstadoProducto(estadoRaw: EstadoRaw) {
  return (
    {
      [EstadoRaw.NO_DISPONIBLE]: EstadoProducto.INACTIVO,
      [EstadoRaw.PENDIENTE]: EstadoProducto.INACTIVO,
      [EstadoRaw.DISPONIBLE]: EstadoProducto.ACTIVADO,
      [EstadoRaw.BAJA]: EstadoProducto.DESHABILITADO,
      [EstadoRaw.ALQUILADO_OTRA_INMOB]: EstadoProducto.INACTIVO,
    }[estadoRaw] || EstadoProducto.INACTIVO
  );
}
