<template>
  <v-row v-if="formState.ready" dense align="start" justify="center">
    <gz-error :error-box-message="formState.errorBoxMessage"></gz-error>
    <v-col cols="12" md="7">
      <v-card id="sockeyeConfigCard" data-cy="configCard">
        <v-subheader>Sockeye server settings</v-subheader>
        <v-list dense two-line>
          <v-list-item dense>
            <v-list-item-content>
              <v-list-item-title>SOCKEYE_DEFAULT_TRANSLATION</v-list-item-title>
              <v-list-item-subtitle class="text-wrap">{{
                config.sockeyE_DEFAULT_TRANSLATION
              }}</v-list-item-subtitle>
            </v-list-item-content>
          </v-list-item>

          <v-list-item dense>
            <v-list-item-content>
              <v-list-item-title>SOCKEYE_USE_URLS</v-list-item-title>
              <v-list-item-subtitle class="text-wrap">{{
                config.sockeyE_USE_URLS
              }}</v-list-item-subtitle>
            </v-list-item-content>
          </v-list-item>

          <v-list-item dense>
            <v-list-item-content>
              <v-list-item-title>SOCKEYE_DB_CONNECTION</v-list-item-title>
              <v-list-item-subtitle class="text-wrap">{{
                config.sockeyE_DB_CONNECTION
              }}</v-list-item-subtitle>
            </v-list-item-content>
          </v-list-item>

          <v-list-item dense>
            <v-list-item-content>
              <v-list-item-title
                >SOCKEYE_REPORT_RENDERING_TIMEOUT</v-list-item-title
              >
              <v-list-item-subtitle class="text-wrap">{{
                config.sockeyE_REPORT_RENDERING_TIMEOUT
              }}</v-list-item-subtitle>
            </v-list-item-content>
          </v-list-item>

          <v-list-item dense>
            <v-list-item-content>
              <v-list-item-title
                >SOCKEYE_ATTACHMENT_FILES_PATH</v-list-item-title
              >
              <v-list-item-subtitle class="text-wrap">{{
                config.sockeyE_ATTACHMENT_FILES_PATH
              }}</v-list-item-subtitle>
            </v-list-item-content>
          </v-list-item>

          <v-list-item dense>
            <v-list-item-content>
              <v-list-item-title>SOCKEYE_BACKUP_FILES_PATH</v-list-item-title>
              <v-list-item-subtitle class="text-wrap">{{
                config.sockeyE_BACKUP_FILES_PATH
              }}</v-list-item-subtitle>
            </v-list-item-content>
          </v-list-item>

          <v-list-item dense>
            <v-list-item-content>
              <v-list-item-title>SOCKEYE_TEMP_FILES_PATH</v-list-item-title>
              <v-list-item-subtitle class="text-wrap">{{
                config.sockeyE_TEMP_FILES_PATH
              }}</v-list-item-subtitle>
            </v-list-item-content>
          </v-list-item>

          <v-list-item dense>
            <v-list-item-content>
              <v-list-item-title>SOCKEYE_BACKUP_PG_DUMP_PATH</v-list-item-title>
              <v-list-item-subtitle class="text-wrap">{{
                config.sockeyE_BACKUP_PG_DUMP_PATH
              }}</v-list-item-subtitle>
            </v-list-item-content>
          </v-list-item>

          <v-list-item dense>
            <v-list-item-content>
              <v-list-item-title>SOCKEYE_LOG_PATH</v-list-item-title>
              <v-list-item-subtitle class="text-wrap">{{
                config.sockeyE_LOG_PATH
              }}</v-list-item-subtitle>
            </v-list-item-content>
          </v-list-item>

          <v-list-item dense>
            <v-list-item-content>
              <v-list-item-title>SOCKEYE_LOG_LEVEL</v-list-item-title>
              <v-list-item-subtitle class="text-wrap">{{
                config.sockeyE_LOG_LEVEL
              }}</v-list-item-subtitle>
            </v-list-item-content>
          </v-list-item>

          <v-list-item dense>
            <v-list-item-content>
              <v-list-item-title class="text-wrap"
                >SOCKEYE_LOG_ENABLE_LOGGER_DIAGNOSTIC_LOG</v-list-item-title
              >
              <v-list-item-subtitle class="text-wrap">{{
                config.sockeyE_LOG_ENABLE_LOGGER_DIAGNOSTIC_LOG
              }}</v-list-item-subtitle>
            </v-list-item-content>
          </v-list-item>

          <div>
            <v-divider class="mt-6"></v-divider>
            <v-subheader>Server Environment</v-subheader>
            <div v-for="(value, name, index) in config.serverinfo" :key="index">
              <span class="ml-6 body-1">{{ name }}: </span>
              <span class="body-2">{{ value }}</span>
            </div>
          </div>
          <div>
            <v-divider class="mt-6"></v-divider>
            <v-subheader>DB Server parameters</v-subheader>
            <div
              v-for="(value, name, index) in config.dbserverinfo"
              :key="index"
            >
              <span class="ml-6 body-1">{{ name }}: </span>
              <span class="body-2">{{ value }}</span>
            </div>
          </div>
        </v-list>
      </v-card>
    </v-col>
  </v-row>
</template>
<script>
const FORM_KEY = "ops-view-configuration";
export default {
  data() {
    return {
      config: {},
      formState: {
        ready: false,
        loading: true,
        errorBoxMessage: null,
        appError: null,
        serverError: {}
      }
    };
    /*{"data":{"sockeyE_DEFAULT_TRANSLATION":"en","sockeyE_USE_URLS":"http://*:7575","sockeyE_DB_CONNECTION":"Server=localhost;Username=postgres;Password=[redacted];Database=sockeye;CommandTimeout=300;","sockeyE_REPORT_RENDERING_TIMEOUT":5,"sockeyE_ATTACHMENT_FILES_PATH":"/srv/coreapps/sockeye/data/attachments","sockeyE_BACKUP_FILES_PATH":"/srv/coreapps/sockeye/data/backups","sockeyE_TEMP_FILES_PATH":"/srv/coreapps/sockeye/data/temp","sockeyE_BACKUP_PG_DUMP_PATH":"","sockeyE_LOG_PATH":"/srv/coreapps/sockeye/data/logs","sockeyE_LOG_LEVEL":"Info","sockeyE_LOG_ENABLE_LOGGER_DIAGNOSTIC_LOG":false,"serverinfo":{"Boot path":"/srv/coreapps/sockeye","OS":"Unix 5.4.0.139","Machine":"ubuntu-s-1vcpu-1gb-amd-sfo3-01","User":"www-data",".Net Version":"6.0.14","CPU count":"1","Sockeye server boot local time":"2023-02-21T14:40:09","Server up time":"00:01:26.4052552","TimeZone":"(UTC-08:00) Pacific Time (Vancouver)","OS Locale":"Invariant Language (Invariant Country)","RAM":"976.949 MiB","Available data storage":"13.271 GiB","DB Schema version":"17"},"dbserverinfo":{"DB SERVER":"PostgreSQL 15.2 (Ubuntu 15.2-1.pgdg20.04+1) on x86_64-pc-linux-gnu, compiled by gcc (Ubuntu 9.4.0-1ubuntu1~20.04.1) 9.4.0, 64-bit","allow_in_place_tablespaces":"off","allow_system_table_mods":"off","application_name":"","archive_cleanup_command":"","archive_command":"(disabled)","archive_library":"","archive_mode":"off","archive_timeout":"0","array_nulls":"on","authentication_timeout":"1min","autovacuum":"on","autovacuum_analyze_scale_factor":"0.1","autovacuum_analyze_threshold":"50","autovacuum_freeze_max_age":"200000000","autovacuum_max_workers":"3","autovacuum_multixact_freeze_max_age":"400000000","autovacuum_naptime":"1min","autovacuum_vacuum_cost_delay":"2ms","autovacuum_vacuum_cost_limit":"-1","autovacuum_vacuum_insert_scale_factor":"0.2","autovacuum_vacuum_insert_threshold":"1000","autovacuum_vacuum_scale_factor":"0.2","autovacuum_vacuum_threshold":"50","autovacuum_work_mem":"-1","backend_flush_after":"0","backslash_quote":"safe_encoding","backtrace_functions":"","bgwriter_delay":"200ms","bgwriter_flush_after":"512kB","bgwriter_lru_maxpages":"100","bgwriter_lru_multiplier":"2","block_size":"8192","bonjour":"off","bonjour_name":"","bytea_output":"hex","check_function_bodies":"on","checkpoint_completion_target":"0.9","checkpoint_flush_after":"256kB","checkpoint_timeout":"5min","checkpoint_warning":"30s","client_connection_check_interval":"0","client_encoding":"UTF8","client_min_messages":"notice","cluster_name":"15/main","commit_delay":"0","commit_siblings":"5","compute_query_id":"auto","config_file":"/etc/postgresql/15/main/postgresql.conf","constraint_exclusion":"partition","cpu_index_tuple_cost":"0.005","cpu_operator_cost":"0.0025","cpu_tuple_cost":"0.01","cursor_tuple_fraction":"0.1","data_checksums":"off","data_directory":"/var/lib/postgresql/15/main","data_directory_mode":"0700","data_sync_retry":"off","DateStyle":"ISO, MDY","db_user_namespace":"off","deadlock_timeout":"1s","debug_assertions":"off","debug_discard_caches":"0","debug_pretty_print":"on","debug_print_parse":"off","debug_print_plan":"off","debug_print_rewritten":"off","default_statistics_target":"100","default_table_access_method":"heap","default_tablespace":"","default_text_search_config":"pg_catalog.english","default_toast_compression":"pglz","default_transaction_deferrable":"off","default_transaction_isolation":"read committed","default_transaction_read_only":"off","dynamic_library_path":"$libdir","dynamic_shared_memory_type":"posix","effective_cache_size":"4GB","effective_io_concurrency":"1","enable_async_append":"on","enable_bitmapscan":"on","enable_gathermerge":"on","enable_hashagg":"on","enable_hashjoin":"on","enable_incremental_sort":"on","enable_indexonlyscan":"on","enable_indexscan":"on","enable_material":"on","enable_memoize":"on","enable_mergejoin":"on","enable_nestloop":"on","enable_parallel_append":"on","enable_parallel_hash":"on","enable_partition_pruning":"on","enable_partitionwise_aggregate":"off","enable_partitionwise_join":"off","enable_seqscan":"on","enable_sort":"on","enable_tidscan":"on","escape_string_warning":"on","event_source":"PostgreSQL","exit_on_error":"off","extension_destdir":"","external_pid_file":"/var/run/postgresql/15-main.pid","extra_float_digits":"1","force_parallel_mode":"off","from_collapse_limit":"8","fsync":"on","full_page_writes":"on","geqo":"on","geqo_effort":"5","geqo_generations":"0","geqo_pool_size":"0","geqo_seed":"0","geqo_selection_bias":"2","geqo_threshold":"12","gin_fuzzy_search_limit":"0","gin_pending_list_limit":"4MB","hash_mem_multiplier":"2","hba_file":"/etc/postgresql/15/main/pg_hba.conf","hot_standby":"on","hot_standby_feedback":"off","huge_page_size":"0","huge_pages":"try","ident_file":"/etc/postgresql/15/main/pg_ident.conf","idle_in_transaction_session_timeout":"0","idle_session_timeout":"0","ignore_checksum_failure":"off","ignore_invalid_pages":"off","ignore_system_indexes":"off","in_hot_standby":"off","integer_datetimes":"on","IntervalStyle":"postgres","jit":"on","jit_above_cost":"100000","jit_debugging_support":"off","jit_dump_bitcode":"off","jit_expressions":"on","jit_inline_above_cost":"500000","jit_optimize_above_cost":"500000","jit_profiling_support":"off","jit_provider":"llvmjit","jit_tuple_deforming":"on","join_collapse_limit":"8","krb_caseins_users":"off","krb_server_keyfile":"FILE:/etc/postgresql-common/krb5.keytab","lc_collate":"C.UTF-8","lc_ctype":"C.UTF-8","lc_messages":"C.UTF-8","lc_monetary":"C.UTF-8","lc_numeric":"C.UTF-8","lc_time":"C.UTF-8","listen_addresses":"localhost","lo_compat_privileges":"off","local_preload_libraries":"","lock_timeout":"0","log_autovacuum_min_duration":"10min","log_checkpoints":"on","log_connections":"off","log_destination":"stderr","log_directory":"log","log_disconnections":"off","log_duration":"off","log_error_verbosity":"default","log_executor_stats":"off","log_file_mode":"0600","log_filename":"postgresql-%Y-%m-%d_%H%M%S.log","log_hostname":"off","log_line_prefix":"%m [%p] %q%u@%d ","log_lock_waits":"off","log_min_duration_sample":"-1","log_min_duration_statement":"-1","log_min_error_statement":"error","log_min_messages":"warning","log_parameter_max_length":"-1","log_parameter_max_length_on_error":"0","log_parser_stats":"off","log_planner_stats":"off","log_recovery_conflict_waits":"off","log_replication_commands":"off","log_rotation_age":"1d","log_rotation_size":"10MB","log_startup_progress_interval":"10s","log_statement":"none","log_statement_sample_rate":"1","log_statement_stats":"off","log_temp_files":"-1","log_timezone":"America/Vancouver","log_transaction_sample_rate":"0","log_truncate_on_rotation":"off","logging_collector":"off","logical_decoding_work_mem":"64MB","maintenance_io_concurrency":"10","maintenance_work_mem":"64MB","max_connections":"100","max_files_per_process":"1000","max_function_args":"100","max_identifier_length":"63","max_index_keys":"32","max_locks_per_transaction":"64","max_logical_replication_workers":"4","max_parallel_maintenance_workers":"2","max_parallel_workers":"8","max_parallel_workers_per_gather":"2","max_pred_locks_per_page":"2","max_pred_locks_per_relation":"-2","max_pred_locks_per_transaction":"64","max_prepared_transactions":"0","max_replication_slots":"10","max_slot_wal_keep_size":"-1","max_stack_depth":"2MB","max_standby_archive_delay":"30s","max_standby_streaming_delay":"30s","max_sync_workers_per_subscription":"2","max_wal_senders":"10","max_wal_size":"1GB","max_worker_processes":"8","min_dynamic_shared_memory":"0","min_parallel_index_scan_size":"512kB","min_parallel_table_scan_size":"8MB","min_wal_size":"80MB","old_snapshot_threshold":"-1","parallel_leader_participation":"on","parallel_setup_cost":"1000","parallel_tuple_cost":"0.1","password_encryption":"scram-sha-256","plan_cache_mode":"auto","port":"5432","post_auth_delay":"0","pre_auth_delay":"0","primary_conninfo":"","primary_slot_name":"","promote_trigger_file":"","quote_all_identifiers":"off","random_page_cost":"4","recovery_end_command":"","recovery_init_sync_method":"fsync","recovery_min_apply_delay":"0","recovery_prefetch":"try","recovery_target":"","recovery_target_action":"pause","recovery_target_inclusive":"on","recovery_target_lsn":"","recovery_target_name":"","recovery_target_time":"","recovery_target_timeline":"latest","recovery_target_xid":"","recursive_worktable_factor":"10","remove_temp_files_after_crash":"on","restart_after_crash":"on","restore_command":"","row_security":"on","search_path":"\"$user\", public","segment_size":"1GB","seq_page_cost":"1","server_encoding":"UTF8","server_version":"15.2 (Ubuntu 15.2-1.pgdg20.04+1)","server_version_num":"150002","session_preload_libraries":"","session_replication_role":"origin","shared_buffers":"128MB","shared_memory_size":"143MB","shared_memory_size_in_huge_pages":"72","shared_memory_type":"mmap","shared_preload_libraries":"","ssl":"on","ssl_ca_file":"","ssl_cert_file":"/etc/ssl/certs/ssl-cert-snakeoil.pem","ssl_ciphers":"HIGH:MEDIUM:+3DES:!aNULL","ssl_crl_dir":"","ssl_crl_file":"","ssl_dh_params_file":"","ssl_ecdh_curve":"prime256v1","ssl_key_file":"/etc/ssl/private/ssl-cert-snakeoil.key","ssl_library":"OpenSSL","ssl_max_protocol_version":"","ssl_min_protocol_version":"TLSv1.2","ssl_passphrase_command":"","ssl_passphrase_command_supports_reload":"off","ssl_prefer_server_ciphers":"on","standard_conforming_strings":"on","statement_timeout":"0","stats_fetch_consistency":"cache","superuser_reserved_connections":"3","synchronize_seqscans":"on","synchronous_commit":"on","synchronous_standby_names":"","syslog_facility":"local0","syslog_ident":"postgres","syslog_sequence_numbers":"on","syslog_split_messages":"on","tcp_keepalives_count":"9","tcp_keepalives_idle":"7200","tcp_keepalives_interval":"75","tcp_user_timeout":"0","temp_buffers":"8MB","temp_file_limit":"-1","temp_tablespaces":"","TimeZone":"America/Vancouver","timezone_abbreviations":"Default","trace_notify":"off","trace_recovery_messages":"log","trace_sort":"off","track_activities":"on","track_activity_query_size":"1kB","track_commit_timestamp":"off","track_counts":"on","track_functions":"none","track_io_timing":"off","track_wal_io_timing":"off","transaction_deferrable":"off","transaction_isolation":"read committed","transaction_read_only":"off","transform_null_equals":"off","unix_socket_directories":"/var/run/postgresql","unix_socket_group":"","unix_socket_permissions":"0777","update_process_title":"on","vacuum_cost_delay":"0","vacuum_cost_limit":"200","vacuum_cost_page_dirty":"20","vacuum_cost_page_hit":"1","vacuum_cost_page_miss":"2","vacuum_defer_cleanup_age":"0","vacuum_failsafe_age":"1600000000","vacuum_freeze_min_age":"50000000","vacuum_freeze_table_age":"150000000","vacuum_multixact_failsafe_age":"1600000000","vacuum_multixact_freeze_min_age":"5000000","vacuum_multixact_freeze_table_age":"150000000","wal_block_size":"8192","wal_buffers":"4MB","wal_compression":"off","wal_consistency_checking":"","wal_decode_buffer_size":"512kB","wal_init_zero":"on","wal_keep_size":"0","wal_level":"replica","wal_log_hints":"off","wal_receiver_create_temp_slot":"off","wal_receiver_status_interval":"10s","wal_receiver_timeout":"1min","wal_recycle":"on","wal_retrieve_retry_interval":"5s","wal_segment_size":"16MB","wal_sender_timeout":"1min","wal_skip_threshold":"2MB","wal_sync_method":"fdatasync","wal_writer_delay":"200ms","wal_writer_flush_after":"1MB","work_mem":"4MB","xmlbinary":"base64","xmloption":"content","zero_damaged_pages":"off"}}} */
  },
  async created() {
    const vm = this;
    try {
      await fetchTranslatedText();
      vm.formState.ready = true;
      window.$gz.eventBus.$on("menu-click", clickHandler);
      generateMenu(vm);
      await vm.getDataFromApi();
      vm.formState.loading = false;
    } catch (err) {
      vm.formState.ready = true;
      window.$gz.errorHandler.handleFormError(err, vm);
    }
  },
  beforeDestroy() {
    window.$gz.eventBus.$off("menu-click", clickHandler);
  },
  methods: {
    async copyFullTechSupportInfo() {
      const vm = this;
      window.$gz.form.deleteAllErrorBoxErrors(vm);

      try {
        const serverSupportInfoResponse = await window.$gz.api.get(
          "server-state/tech-support-info"
        );
        if (serverSupportInfoResponse.error) {
          if (serverSupportInfoResponse.error.code == "2010") {
            window.$gz.form.handleObjectNotFound(vm);
          }
          vm.formState.serverError = serverSupportInfoResponse.error;
          window.$gz.form.setErrorBoxErrors(vm);
        } else {
          if (serverSupportInfoResponse) {
            const browserInfo = {
              platform: window.navigator.platform,
              userAgent: window.navigator.userAgent,
              languages: window.navigator.languages,
              tz: Intl.DateTimeFormat().resolvedOptions().timeZone,
              oscpu: window.navigator.oscpu,
              maxTouchPoints: window.navigator.maxTouchPoints,
              webdriver: window.navigator.webdriver,
              vendor: window.navigator.vendor,
              availWidth: window.screen.availWidth,
              availHeight: window.screen.availHeight,
              width: window.screen.width,
              height: window.screen.height,
              devicePixelRatio: window.devicePixelRatio,
              pixelDepth: window.screen.pixelDepth
            };

            let logText = "";
            this.$store.state.logArray.forEach(function appendLogItem(value) {
              logText += value + "\n";
            });

            window.$gz.util.copyToClipboard(
              `#########################################################\nCLIENT BROWSER INFO\n${JSON.stringify(
                browserInfo
              )}\n#########################################################\nCLIENT ERROR LOG\n${logText}\n${
                serverSupportInfoResponse.data
              }`
            );
            //vm.log = res;
          } else {
            //vm.log = vm.$sock.t("NoData");
          }
          window.$gz.form.setFormState({
            vm: vm,
            dirty: false,
            valid: true,
            loading: false
          });
        }
      } catch (error) {
        window.$gz.form.setFormState({
          vm: vm,
          loading: false
        });
        window.$gz.errorHandler.handleFormError(error, vm);
      }
    },
    async getDataFromApi() {
      const vm = this;
      vm.formState.loading = true;
      window.$gz.form.deleteAllErrorBoxErrors(vm);
      try {
        const res = await window.$gz.api.get(
          "server-state/active-configuration"
        );
        if (res.error) {
          vm.formState.serverError = res.error;
          window.$gz.form.setErrorBoxErrors(vm);
        } else {
          vm.config = res.data;
          window.$gz.form.setFormState({
            vm: vm,
            dirty: false,
            valid: true,
            loading: false
          });
        }
      } catch (error) {
        window.$gz.errorHandler.handleFormError(error, vm);
      } finally {
        window.$gz.form.setFormState({
          vm: vm,
          loading: false
        });
      }
    }
  }
};

//////////////////////
//
//
function generateMenu(vm) {
  const menuOptions = {
    isMain: true,
    icon: "$sockiInfoCircle",
    title: "ViewServerConfiguration",
    helpUrl: "ops-server-information",
    menuItems: [
      {
        title: "CopySupportInfo",
        icon: "$sockiCopy",
        key: FORM_KEY + ":copyFullTechSupportInfo",
        vm: vm
      }
    ]
  };

  window.$gz.eventBus.$emit("menu-change", menuOptions);
}

/////////////////////////////
//
//
function clickHandler(menuItem) {
  if (!menuItem) {
    return;
  }
  const m = window.$gz.menu.parseMenuItem(menuItem);
  if (m.owner == FORM_KEY && !m.disabled) {
    switch (m.key) {
      case "copyFullTechSupportInfo":
        m.vm.copyFullTechSupportInfo();
        break;
      default:
        window.$gz.eventBus.$emit(
          "notify-warning",
          FORM_KEY + "::context click: [" + m.key + "]"
        );
    }
  }
}

//////////////////////////////////////////////////////////
//
// Ensures UI translated text is available
//
async function fetchTranslatedText() {
  await window.$gz.translation.cacheTranslations([
    "OpsTestJob",
    "Log",
    "Download",
    "CopySupportInfo"
  ]);
}
</script>
