import axios from 'axios';

async function initAppConfig(): Promise<any> {
  const config = await import('../../app.config.json');
  const appConfig = 'app.config.json';

  return new Promise((resolve, reject) => {
    try {
      if (process.env.NODE_ENV === 'production') {
        const configUrl = `${process.env.VUE_APP_PROJECT_PATH || ''}/conf/${appConfig}`;
        axios
          .get(configUrl)
          .then((response) => {
            let configData = response.data;
            if (typeof(configData) === "string") {
              configData = JSON.parse(configData);
            }
            const settings: { [index : string] : any } = {}
            for (const [key, value] of Object.entries(configData)) {
              // Заменяем значения для которых не предоставили переменные окружения на пустые строки
              settings[key] = (value && typeof(value) === "string" && /\$\{\s*\w+\s*\}/.test(value)) ? '' : value
            }
            return resolve(settings);
          }).catch(e => {
            console.error(`Ошибка при чтении конфигурации ${configUrl}`);
            reject(e);
          });
      } else {
        // в противном случае ожидается только девелоперский режим
        // здесь мы заменяем значения типа "authority": "${SSO_AUTH}"
        // на значение из переменной окружения (В данном случае из VUE_APP_SSO_AUTH)
        const settings: { [index : string] : any } = {}
        for (const [key, value] of Object.entries(config)) {
          let entryValue = value;
          if (value && typeof(value) === "string") {
            const env_name = value.match(/\$\{\s*(?<env_name>\w+)\s*\}/)?.groups?.env_name;
            if (env_name) {
              // @ts-ignore
              entryValue = process.env[env_name] || process.env[`VUE_${env_name}`] || process.env[`VUE_APP_${env_name}`] || '';
            }
          }
          settings[key] = entryValue;
        }
        return resolve(settings);
      }
    } catch (e) {
      return reject(e);
    }
  });
}

export default initAppConfig;
