import { SectionParams, Template, TipoCaptacion } from '@win2win/shared';
import { QTableColumn } from 'quasar';
import { formatDate } from 'src/helpers/formatters';
import { PartialSome } from 'src/types/utils';
import { Section } from './models';

export const formControls = [
  {
    label: 'Campo de texto',
    value: 'input_text',
  },
  {
    label: 'Campo númerico',
    value: 'input_number',
  },
  {
    label: 'Selector',
    value: 'select',
  },
  {
    label: 'Selector de tarjetas',
    value: 'cards_select',
  },
  {
    label: 'Selector de moneda',
    value: 'currency_select',
  },
  {
    label: 'Checkbox',
    value: 'checkbox',
  },
  {
    label: 'Localización',
    value: 'location',
  },
  {
    label: 'Colección dinámica',
    value: 'dynamic_array',
  },
  {
    label: 'Objeto',
    value: 'object',
  },
  {
    label: 'Contador de entradas',
    value: 'keys_counter',
  },
  {
    label: 'Colección',
    value: 'collection',
  },
  {
    view_if: [1], // solo visible si la captación es tipo = 1 (clientes)
    label: 'Selector de productos',
    value: 'productos',
  },
];

export const TIPOS_CAPTACION = [
  {
    label: 'Clientes',
    value: TipoCaptacion.CLIENTES,
  },
  {
    label: 'Proveedores',
    value: TipoCaptacion.PROVEEDORES,
  },
  {
    label: 'Usuarios',
    value: TipoCaptacion.USUARIOS,
  },
  {
    label: 'Productos',
    value: TipoCaptacion.PRODUCTOS,
  },
  {
    label: 'Pedidos',
    value: TipoCaptacion.PEDIDOS,
  },
  {
    label: 'Partners',
    value: TipoCaptacion.PARTNERS,
  },
];

export const validators = [
  {
    value: 'required',
    label: 'Requerido',
    param: false,
  },
  {
    value: 'min',
    label: 'Mínimo',
    param: true,
  },
  {
    value: 'max',
    label: 'Máximo',
    param: true,
  },
  {
    value: 'email',
    label: 'Email',
    param: false,
  },
  {
    value: 'url',
    label: 'URL',
    param: false,
  },
  {
    value: 'onlyNumbers',
    label: 'Solo números',
    param: false,
  },
];

const DEFAULT_SECTION_PARAMS: SectionParams = {
  title: '',
  background: '#f8f8ffff',
  subtitle: '',
  text: '',
  image: null,
  items: [],
  classes: '',
  variant: 'default',
  direction: 'normal',
  height: '',
  children: [],
  conditions: [],
  id_gama: null,
  items_props: [],
  styles: {},
};
Object.freeze(DEFAULT_SECTION_PARAMS);

export type ModelSection = PartialSome<Section, 'ID_LANDING' | 'ID_LANDING_PAGES' | 'FECHA_UPD'> & { id?: string };
export const DEFAULT_SECTION: ModelSection = {
  ID_LANDING_SECTIONS: null,
  PARAMS: { ...DEFAULT_SECTION_PARAMS },
  ESTADO: 1,
  TEMPLATE: 'features' as Template,
  POSICION: 0,
};
Object.freeze(DEFAULT_SECTION);

export const DEFAULT_FORM_TYPES = [
  {
    id: 'CONTACTO',
    code: 'contacto',
    label: 'Cuestionario de Contacto',
    description: 'Cuestionario de contacto con campos básicos como nombre, email y teléfono.',
  },
  {
    id: 'PRODUCTO_CREACION',
    view_if: {
      TIPO_CAPTACION: [4], // solo visible si la captación es tipo = 4 (producto)
    },
    code: 'producto',
    label: 'Crear producto y proveedor',
    description: 'Cuestionario que permite la creación de un producto y su proveedor con la información básica requerida...',
  },
  {
    id: 'PRODUCTO_INTERACCION',
    view_if: {
      TIPO_CAPTACION: [1], // solo visible si la captación es tipo = 1 (clientes)
    },
    code: 'producto',
    label: 'Adquirir o interactuar con producto existente',
    description: 'Cuestionario que permite la venta o interacción de un cliente con un producto existente...',
  },
] as const;
Object.freeze(DEFAULT_FORM_TYPES);

export const CODIGOS_PREGUNTAS = {
  cliente: 'cliente_', // tabla CLIENTES
  proveedor: 'proveedor_', // tabla PROVEEDORES

  contacto: 'contacto_', // tabla CONTACTO
  ubicacion: 'ubicacion_', // tabla CONTACTO_DIRECCIONES

  producto: 'producto_', // tabla VARTICULOS
  props: 'producto_props_', // campo VARTICULOS.PROPS
};
Object.freeze(CODIGOS_PREGUNTAS);

export const DEFAULT_FORMATTERS = [
  {
    label: 'Conversión a Euros',
    value: 'toEUR',
    content: "(v) => isNaN(Number(v)) ? '0' : Number(v).toLocaleString('es-ES', {style:'currency', currency:'EUR'})",
  },
  {
    label: 'Capitalizar',
    value: 'capitalize',
    content: '(v) => { const text = String(v); return text.charAt(0).toUpperCase() + text.slice(1).toLowerCase()}',
  },
  {
    label: 'Mayúsculas',
    value: 'uppercase',
    content: '(v) => String(v).toUpperCase()',
  },
];

export const LANDING_COLUMNS: QTableColumn[] = [
  { label: 'ID', name: 'ID', field: 'ID_LANDING', align: 'center', sortable: false },
  { label: 'Título', name: 'landing.TITULO', field: 'TITULO', align: 'left', sortable: true },
  { label: 'Título del formulario', name: 'landing.TITULO_FORMULARIO', field: 'TITULO_FORMULARIO', align: 'left', sortable: true },
  { label: 'Tipo captación', name: 'landing.TIPO_CAPTACION', field: 'TIPO_CAPTACION', format: labelTipoCaptacion, align: 'left', sortable: true },
  { label: 'Última actualización', name: 'landing.FECHA_UPD', field: 'FECHA_UPD', format: formatDate, align: 'left', sortable: true },
  { label: 'Estado', name: 'ESTADO', align: 'center', sortable: true, field: 'ESTADO' },
  { label: 'Acciones', field: 'ACCIONES', name: 'actions', align: 'center', sortable: false },
];

function labelTipoCaptacion(v: string | number) {
  return TIPOS_CAPTACION.filter((tipo) => tipo.value == v)[0]?.label || ' - ';
}

export const dataFormMapping = {
  NOMBRE: 'label',
  VALIDACIONES: 'validators',
  CLAVE: 'code',
  MULTIPLE: 'multiple',
  RESPUESTAS: 'options',
  CONDITIONS: 'conditions',
  STRUCTURE: 'structure',
  LENGTH: 'itemsLength',
  ICON: 'icon',
  TIPO: 'controlType',
  PREFIJO: 'prefix',
  SUFIJO: 'suffix',
  PARAMS: 'customParams',
};

export const payloadMapping = {
  label: 'NOMBRE',
  validators: 'VALIDACIONES',
  code: 'CLAVE',
  multiple: 'MULTIPLE',
  options: 'RESPUESTAS',
  conditions: 'CONDITIONS',
  structure: 'STRUCTURE',
  icon: 'ICON',
  controlType: 'TIPO',
  prefix: 'PREFIJO',
  suffix: 'SUFIJO',
  itemsLength: 'LENGTH',
  customParams: 'PARAMS',
};

export const DEFAULT_CUESTIONARIO_PREGUNTA = {
  TITULO_GRUPO: '',
  ESTADO: 1,
  ID_CUESTIONARIO_PREGUNTA: null,
  FILA: 1,
  COLUMNA: 1,
  CLASS: null,
  ID_CUESTIONARIO: null,
  GRUPO: 1,

  controlType: formControls[0].value,
  code: '',
  icon: '',
  type: '',
  structure: [],
  conditions: [],
  itemsLength: {
    default: 1,
    controlId: null,
  },
  options: [],
  validators: [],
  multiple: false,
  label: '',
  prefix: '',
  suffix: '',
  customParams: '',
};
Object.freeze(DEFAULT_CUESTIONARIO_PREGUNTA);

export const DEFAULT_LANDING = {
  ID_LANDING: null,
  URL: '',
  TITULO: '',
  TIPO_CAPTACION: '',
  ID_GAMA: [],
  ID_PERFIL: '',
  MODO: 'COMPRA_DIRECTA',
  TITULO_FORMULARIO: '',
  ESTADO: 1,
  METADATA: {},
  PARAMS: {
    logo: '',
    requestButton: {
      link: 'formulario',
      text: '',
      color: '',
    },
    description: '',
  },
};
Object.freeze(DEFAULT_LANDING);
