import { Injectable } from '@angular/core';
import { ResourcesService } from '../resources.service';

@Injectable({
  providedIn: 'root',
})
export class InternationalizationService {
  public words: Map<string, string>;
  private arrAvailableLanguages: Array<string>;
  private arrLanguageWords: Array<any>;

  constructor(public resourcesService: ResourcesService) {
    this.arrAvailableLanguages = ['ES', 'IN'];
    this.words = new Map<string, string>();

    this.arrLanguageWords = [
      {
        S002V01M03GEPR: 'Gestión de los procesos',
        S002V01S01GFTR: 'Gestión de los flujos de trabajo',
        S002V01S02GETA: 'Gestión de las tareas',
        S002V01S03SFTR: 'Solicitud de flujos de trabajo',
        cambiar_idioma: 'Cambiar idioma',
        espanol: 'Español',
        ingles: 'Inglés',
        regresar: 'Regresar',
        S002V01F01GFTR: 'Gestión de los flujos de trabajo',
        S002V01F02BUMU: 'Búsquedas multicriterio',
        S002V01F01GETA: 'Gestión de tareas',
        S002V01F01GSFT: 'Gestión de solicitudes de flujos de trabajo',
        titulo_selecciona_funcion: 'Seleccione una función',
        cerrar: 'Cerrar',
        guardar: 'Guardar',
        cancelar: 'Cancelar',
        aceptar: 'Aceptar',
        editar: 'Editar',
        eliminar: 'Eliminar',
        ver_tareas: 'Ver tareas',
        ver_flujo: 'Ver flujo de trabajo',
        cargando_menu: 'Cargando menú de gestión de procesos',
        nuevo: 'Nuevo',
        actualizar_datos: 'Actualizar Datos',
        buscador: 'Buscador',
        ingrese_palabra_buscar: 'Ingrese la palabra a buscar',
        eliminar_filtro: 'Eliminar filtro',
        items_per_page_label: 'Datos por página',
        next_page_label: 'Siguiente página',
        previous_page_label: 'Anterior página',
        first_page_label: 'Primera página',
        last_page_label: 'Última página',
        _de_: ' de ',
        cargando_informacion_flujos:
          'Cargando información de los flujos de trabajo',
        cargando_informacion_formulario:
          'Cargando la información del formulario',
        cargando_informacion_tareas: 'Cargando la información de las tareas',
        cargando_informacion_solicitudes:
          'Cargando la información de las solicitudes',
        cargando_informacion_notificaciones:
          'Cargando la información de las notificaciones',
        descripcion: 'Descripción',
        es_automatico: '¿Es automático?',
        fue_automatico: '¿Fue automático?',
        es_predefinido: '¿Es predefinido?',
        usuario_modificacion: 'Usuario modificación',
        fecha_actualizacion: 'Fecha de actualización',
        estado: 'Estado',
        acciones: 'Acciones',
        registro_exitoso: '¡Registro exitoso!',
        modificacion_exitoso: '¡Modificación Existosa!',
        opcion_no_disponible: 'Opción no disponible',
        clic_desplegar: 'Clic para desplegar',
        confirmacion: 'Confirmación',
        register_description_alert:
          '¿Está seguro de registrar el flujo de trabajo?',
        update_description_alert:
          '¿Está seguro de modificar el flujo de trabajo?',
        delete_description_alert:
          '¿Está seguro de eliminar el flujo de trabajo?',
        update_request_alert:
          '¿Está seguro de modificar el estado de la solicitud?',
        register_task_alert: '¿Está seguro de registrar la tarea?',
        update_task_alert:
          '¿Está seguro de modificar la tarea? Todas las ejecuciones activas del flujo de trabajo se reiniciarán.',
        registro_flujo_trabajo: 'Registro de flujo de trabajo',
        modificacion_flujo_trabajo: 'Modificación de flujo de trabajo',
        nombre_flujo_trabajo: 'Nombre del flujo de trabajo',
        placeholder_nombre_flujo_trabajo:
          'Ingrese el nombre del flujo de trabajo...',
        el_campo: 'El campo',
        es_requerido: 'es requerido',
        placeholder_descripcion:
          'Ingrese la descripción del flujo de trabajo...',
        no_tarea: 'No. Tarea',
        no_flujo: 'No. Flujo',
        nombre_tarea: 'Nombre tarea',
        secuencia: 'Secuencia',
        registro_tarea: 'Registro de tareas',
        modificacion_tarea: 'Modificación de tareas',
        flujo_trabajo: 'Flujo de trabajo',
        procesos_flujo_trabajo: 'Procesos de flujo de trabajo',
        nombre_de_la_tarea: 'Nombre de la tarea',
        placeholder_nombre_de_la_tarea: 'Ingrese el nombre de la tarea...',
        placeholder_descripcion_tarea: 'Ingrese la descripción de la tarea...',
        reglas_validacion: 'Reglas de validación',
        usuario_para_validacion: 'Usuario para validar la tarea',
        usuario_solo_notificar: 'Usuarios para solo notificar',
        cambio_flujo_trabajo: 'Cambio de flujo de trabajo',
        cambiar_usuario: 'Cambiar al usuario',
        siempre_esperar_validacion_usuario:
          'Siempre esperar validación del usuario',
        cambiar_otro_usuario: 'Cambiar al siguiente usuario',
        ejecutar_otro_flujo_trabajo: 'Ejecutar otro flujo de trabajo',
        tarea: 'Tarea',
        cambio_estado_solicitud: 'Cambio de estado de la solicitud',
        proceso: 'Proceso',
        ver_informacion_flujo_trabajo: 'Ver información del flujo de trabajo',
        ver_informacion: 'Ver información',
        numero_ejecucion: 'No. Ejecución',
        no_ejecucion_tarea: 'No. Ejecución Tarea',
        nombre_responsable: 'Nombre del responsable',
        ver_ejecucion_tareas: 'Ver ejecución de tareas',
        solicitud_ejecuciones_tareas: 'Solicitud de ejecuciones de tareas',
        mensaje_rechazo: 'Mensaje de rechazo',
        progreso: 'Progreso',
        historial_validaciones: 'Historial de validaciones',
        usuario: 'Usuario',
        no_notificacion: 'No. Notificación',
        tipo_notificacion: 'Tipo de notificación',
        cargando_informacion: 'Cargando información',
        buscar: 'Buscar',
        busqueda_solicitudes: 'Búsquedas de solicitudes',
        busqueda_notificaciones: 'Búsquedas de notificaciones',
        numero_ejecucion_flujo_trabajo:
          'Número de ejecución del flujo de trabajo',
        estado_ejecucion_flujo_trabajo:
          'Estado de ejecución del flujo de trabajo',
        numero_ejecucion_tarea: 'Número de ejecución de la tarea',
        estado_ejecucion_tarea: 'Estado de ejecución de la tarea',
        nombre_proceso: 'Nombre del proceso',
        rango_fecha: 'Rango de fechas',
        fecha_inicial: 'Fecha inicial',
        fecha_final: 'Fecha final',
        usuario_notificado: 'Usuario notificado',
        numero_notificacion: 'Número de notificación',
        estado_notifiación: 'Estado de la notificación',
        fecha_inicio_no_valida: 'Fecha de inicio no válida',
        fecha_finalizacion_no_valida: 'Fecha de finalización no válida',
        ejecucion_flujo_trabajo: 'Ejecución del flujo de trabajo',
        ejecucion_tarea: 'Ejecución de la tarea',
        ver_detalles_solicitud: 'Ver detalles de la solicitud',
        detalles_solicitud: 'Detalles de la solicitud',
        descripcion_flujo_trabajo: 'Descripción del flujo de trabajo',
        descripcion_tarea: 'Descripción de la tarea',
        ver_informacion_solicitud: 'Ver información de la solicitud',
        no_es_valido: 'no es válido',
        detalles_notificacion: 'Detalles de la notificación',
        numero_secuencia: 'Número de secuencia',

        reset_configuration: 'Restaurar configuración',
        reset_description_alert:
          '¿Está seguro de restablecer la configuración por defecto de todos los flujos de trabajo?',
        register_task: 'Registrar tarea',
        update_task: 'Actualizar tarea',
        module: 'Módulo relacionado',
        task_users_settings: 'Configuración de usuarios',
        next_status: 'Siguiente estado',
        automatic_task: 'Tarea automática',
        configure_users: 'Configurar usuarios',
        the_maximum_length: 'La longitud máxima del campo',
        the_minimum_length: 'La longitud mínima del campo',
        is_of: 'es de',
        characters: 'caracteres',
        requiere_validacion: 'Requiere validación',
        regla_validacion: 'Regla de validación',
        registrar_workflow: 'Registrar Workflow',
        nombre_workflow: 'Nombre del Workflow',
        campo_requerido: 'Este campo es requerido',
        registrar: 'Registrar',
        sin_datos: 'Sin datos',
        confirmar: 'Confirmar',
        esta_seguro_eliminar_tarea: '¿Está seguro de eliminar la tarea?',
        eliminacion_exitosa: '¡Eliminación Exitosa!',
        ingrese_nombre_tarea: 'Ingrese el nombre de la tarea',
        ingrese_descripcion_tarea: 'Ingrese la descripción de la tarea',
        usuario_validador: 'Usuario Validador',
        usuarios_notificar: 'Usuarios a Notificar',
        esperar: 'Esperar',
        ejecutar: 'Ejecutar',
        workflow_ejecutar: 'Workflow a Ejecutar',
        funcion_relacionada_tarea: 'Función relacionada que ejecuta la tarea',
        modulo: 'Módulo',
        submodulo: 'Submódulo',
        funcion: 'Función',
        registro_exitoso_tarea: '¡Registro exitoso!',
        modificacion_exitosa_tarea: '¡Modificación exitosa!',
        detalles_tarea: 'Detalles de la Tarea',
        id: 'ID',
        nombre: 'Nombre',
        si: 'Sí',
        no: 'No',
        na: 'N/A',
        usuario_registro: 'Usuario Registro',
        fecha_registro: 'Fecha Registro',
        fecha_modifica: 'Fecha Modifica',
        hoy: 'Hoy',
        hace_1_dia: 'Hace 1 día',
        hace_dias: 'Hace {0} días',
        modulos: 'Módulos',
        predeterminado: 'Predeterminado',
        version: 'Versión',
        historial: 'Historial',
        ver_historial_cambios: 'Ver historial de cambios',
        ver_detalles: 'Ver detalles',
        registrar_tareas: 'Registrar tareas',
        activar: 'Activar',
        desactivar: 'Desactivar',
        cambio_estado_exitoso: '¡Cambio de estado exitoso!',
        no_puede_activar_workflow:
          'No se puede activar el workflow. Debe tener al menos una tarea registrada.',
        error_verificar_tareas: 'Error al verificar tareas: {0}',
        no_pudo_encontrar_informacion:
          'No se pudo encontrar información para editar.',
        comentario_cambio: 'Comentario del cambio',
        explique_motivo_cambio: 'Explique el motivo del cambio...',
        detalles_workflow: 'Detalles del Workflow',
        usuario_modifica: 'Usuario modifica',
        cambiar_estado: 'Cambiar Estado',
        esta_seguro_cambiar_estado: '¿Está seguro de cambiar el estado a {0}?',
        explique_motivo_cambio_estado:
          'Explique el motivo del cambio de estado...',
      },
      {
        S002V01M03GEPR: 'Process management',
        S002V01S01GFTR: 'Workflow management',
        S002V01S02GETA: 'Task management',
        S002V01S03SFTR: 'Request workflows',
        cambiar_idioma: 'Change language',
        espanol: 'Spanish',
        ingles: 'English',
        regresar: 'Go back',
        S002V01F01GFTR: 'Workflow management',
        S002V01F02BUMU: 'Multi-criteria searches',
        S002V01F01GETA: 'Task management',
        S002V01F01GSFT: 'Workflow request management',
        titulo_selecciona_funcion: 'Select a function',
        cerrar: 'Close',
        guardar: 'Save',
        cancelar: 'Cancel',
        aceptar: 'Accept',
        editar: 'Edit',
        eliminar: 'Delete',
        ver_tareas: 'View tasks',
        ver_flujo: 'View workflow',
        cargando_menu: 'Loading process management menu',
        nuevo: 'New',
        actualizar_datos: 'Update data',
        buscador: 'Search',
        ingrese_palabra_buscar: 'Enter the word to search',
        eliminar_filtro: 'Remove filter',
        items_per_page_label: 'Items per page',
        next_page_label: 'Next page',
        previous_page_label: 'Previous page',
        first_page_label: 'First page',
        last_page_label: 'Last page',
        _de_: ' of ',
        cargando_informacion_flujos: 'Loading workflow information',
        cargando_informacion_formulario: 'Loading form information',
        cargando_informacion_tareas: 'Loading task information',
        cargando_informacion_solicitudes: 'Loading application information',
        cargando_informacion_notificaciones: 'Loading notification information',
        descripcion: 'Description',
        es_automatico: 'It is automatic?',
        fue_automatico: 'Was it automatic?',
        es_predefinido: 'Is it predefined?',
        usuario_modificacion: 'User modification',
        fecha_actualizacion: 'Update date',
        estado: 'State',
        acciones: 'Actions',
        registro_exitoso: 'Successful registration!',
        modificacion_exitoso: 'Successful Modification!',
        opcion_no_disponible: 'Option not available',
        clic_desplegar: 'Click to display',
        confirmacion: 'Confirmation',
        register_description_alert: 'Are you sure to record the workflow?',
        update_description_alert: 'Are you sure about modifying the workflow?',
        delete_description_alert: 'Are you sure to delete the workflow?',
        update_request_alert:
          'Are you sure to change the status of the request?',
        register_task_alert: 'Are you sure to register the task?',
        update_task_alert:
          'Are you sure about modifying the task? All active workflow runs will be restarted.',
        registro_flujo_trabajo: 'Workflow registration',
        modificacion_flujo_trabajo: 'Workflow Modification',
        nombre_flujo_trabajo: 'Workflow name',
        placeholder_nombre_flujo_trabajo: 'Enter the name of the workflow...',
        el_campo: 'The field',
        es_requerido: 'is required',
        placeholder_descripcion: 'Enter the workflow description...',
        no_tarea: 'No. Task',
        no_flujo: 'No. Workflow',
        nombre_tarea: 'Task name',
        secuencia: 'Sequence',
        registro_tarea: 'Task registration',
        modificacion_tarea: 'Task modification',
        flujo_trabajo: 'Workflow',
        procesos_flujo_trabajo: 'Workflow processes',
        nombre_de_la_tarea: 'Task name',
        placeholder_nombre_de_la_tarea: 'Enter the name of the task...',
        placeholder_descripcion_tarea: 'Enter the task description...',
        reglas_validacion: 'Validation rules',
        usuario_para_validacion: 'User to validate the task',
        usuario_solo_notificar: 'Notify-only users',
        cambio_flujo_trabajo: 'Workflow change',
        cambiar_usuario: 'Change user',
        siempre_esperar_validacion_usuario: 'Always wait for user validation',
        cambiar_otro_usuario: 'Switch to next user',
        ejecutar_otro_flujo_trabajo: 'Run another workflow',
        tarea: 'Task',
        cambio_estado_solicitud: 'Request status change',
        proceso: 'Process',
        ver_informacion_flujo_trabajo: 'View workflow information',
        ver_informacion: 'View information',
        numero_ejecucion: 'No. Execution',
        no_ejecucion_tarea: 'No. Task Execution',
        nombre_responsable: 'Name of person responsible',
        ver_ejecucion_tareas: 'View task execution',
        solicitud_ejecuciones_tareas: 'Request task executions',
        mensaje_rechazo: 'Rejection message',
        progreso: 'Progress',
        historial_validaciones: 'Validation history',
        usuario: 'User',
        no_notificacion: 'No. Notification',
        tipo_notificacion: 'Notification type',
        cargando_informacion: 'Loading information',
        buscar: 'Search',
        busqueda_solicitudes: 'Request searches',
        busqueda_notificaciones: 'Notification searches',
        numero_ejecucion_flujo_trabajo: 'Workflow Execution Number',
        estado_ejecucion_flujo_trabajo: 'Workflow Execution Status',
        numero_ejecucion_tarea: 'Task execution number',
        estado_ejecucion_tarea: 'Task execution status',
        nombre_proceso: 'Name of process',
        rango_fecha: 'Date range',
        fecha_inicial: 'Start date',
        fecha_final: 'End date',
        usuario_notificado: 'Notified user',
        numero_notificacion: 'Notification number',
        estado_notifiación: 'Notification status',
        fecha_inicio_no_valida: 'Invalid start date',
        fecha_finalizacion_no_valida: 'Invalid end date',
        ejecucion_flujo_trabajo: 'Workflow execution',
        ejecucion_tarea: 'Task execution',
        ver_detalles_solicitud: 'View request details',
        detalles_solicitud: 'Request details',
        descripcion_flujo_trabajo: 'Workflow description',
        descripcion_tarea: 'Task description',
        ver_informacion_solicitud: 'View request information',
        no_es_valido: 'it is not valid',
        detalles_notificacion: 'Notification details',
        numero_secuencia: 'Sequence number',

        reset_configuration: 'Restore settings',
        reset_description_alert:
          'Are you sure you want to reset all workflows to default settings?',
        register_task: 'Add task',
        update_task: 'Update task',
        module: 'Related module',
        task_users_settings: 'User configuration',
        next_status: 'Next status',
        automatic_task: 'Automatic task',
        configure_users: 'Configure users',
        the_maximum_length: 'The maximum length of the',
        the_minimum_length: 'The minimum length of the',
        is_of: 'field is',
        characters: 'characters',
        requiere_validacion: 'Requires validation',
        regla_validacion: 'Validation rule',
        registrar_workflow: 'Register Workflow',
        nombre_workflow: 'Workflow Name',
        campo_requerido: 'This field is required',
        registrar: 'Register',
        sin_datos: 'No data',
        confirmar: 'Confirm',
        esta_seguro_eliminar_tarea: 'Are you sure you want to delete the task?',
        eliminacion_exitosa: 'Successful Deletion!',
        ingrese_nombre_tarea: 'Enter the task name',
        ingrese_descripcion_tarea: 'Enter the task description',
        usuario_validador: 'Validator User',
        usuarios_notificar: 'Users to Notify',
        esperar: 'Wait',
        ejecutar: 'Execute',
        workflow_ejecutar: 'Workflow to Execute',
        funcion_relacionada_tarea: 'Related function that executes the task',
        modulo: 'Module',
        submodulo: 'Submodule',
        funcion: 'Function',
        registro_exitoso_tarea: 'Successful registration!',
        modificacion_exitosa_tarea: 'Successful modification!',
        detalles_tarea: 'Task Details',
        id: 'ID',
        nombre: 'Name',
        si: 'Yes',
        no: 'No',
        na: 'N/A',
        usuario_registro: 'Registration User',
        fecha_registro: 'Registration Date',
        fecha_modifica: 'Modification Date',
        hoy: 'Today',
        hace_1_dia: '1 day ago',
        hace_dias: '{0} days ago',
        modulos: 'Modules',
        predeterminado: 'Default',
        version: 'Version',
        historial: 'History',
        ver_historial_cambios: 'View change history',
        ver_detalles: 'View details',
        registrar_tareas: 'Register tasks',
        activar: 'Activate',
        desactivar: 'Deactivate',
        cambio_estado_exitoso: 'Status change successful!',
        no_puede_activar_workflow:
          'Cannot activate workflow. Must have at least one registered task.',
        error_verificar_tareas: 'Error verifying tasks: {0}',
        no_pudo_encontrar_informacion: 'Could not find information to edit.',
        comentario_cambio: 'Change comment',
        explique_motivo_cambio: 'Explain the reason for the change...',
        detalles_workflow: 'Workflow Details',
        usuario_modifica: 'User modifies',
        cambiar_estado: 'Change Status',
        esta_seguro_cambiar_estado:
          'Are you sure you want to change the status to {0}?',
        explique_motivo_cambio_estado:
          'Explain the reason for the status change...',
      },
    ];

    this.checkLanguage();
  }

  private checkLanguage() {
    let language: string | null = localStorage.getItem('language');

    if (language === null) {
      localStorage.setItem('language', 'ES');
      language = 'ES';
    }

    if (!this.arrAvailableLanguages.includes(language)) {
      this.resourcesService.openSnackBar(
        'El idioma seleccionado no está disponible.'
      );
      language = 'ES';
    }

    this.generateObjectLanguage(language);
  }

  public generateObjectLanguage(language: string) {
    const indexLanguage = this.arrAvailableLanguages.findIndex(
      (aviable: string) => aviable === language
    );
    const elementLenguage = this.arrLanguageWords[indexLanguage];
    const arrKeys: Array<string> = Object.keys(elementLenguage);
    const propertyValues: Array<string> = Object.values(elementLenguage);
    this.words = new Map<string, string>();
    arrKeys.forEach((element, index) => {
      this.words.set(element, propertyValues[index]);
    });
  }

  public get(word: string) {
    let result: string | undefined = this.words.get(word);
    if (result === undefined) {
      result = '...';
    }
    return result;
  }
}
