import { reportEvent } from '../../../utils/common';
import { LowCodeModuleParser, IEvaledModule, LowcodeContext, getDefaultModule } from './base';

export class NormalModuleParser implements LowCodeModuleParser {
  common: any;

  onStart(context: LowcodeContext) {
    this.common = {};
  }

  parseModule(pageId: string, mod: IEvaledModule) {
    if (mod.name === '____index____') return;

    const targetModule = mod.exports;
    const defaultModule = getDefaultModule(targetModule);

    if (targetModule) {
      const keys = Object.keys(targetModule);
      if (keys.length === 1 && keys[0] === 'default') {
        // return targetModule.default;
      } else {
        try {
          const tag = `resource.common`;
          if (targetModule.default) {
            reportEvent(`${tag}.bothexport`);
            switch (typeof targetModule.default) {
              case 'object': {
                if (targetModule.default === null) {
                  reportEvent(`${tag}.unmergeable`);
                } else {
                  for (const key of keys) {
                    if (targetModule.default?.[key] && targetModule.default?.[key] !== targetModule[key]) {
                      reportEvent(`${tag}.mergeconflict`);
                      break;
                    }
                  }
                }
                break;
              }
              case 'function': {
                break;
              }
              default: {
                reportEvent(`${tag}.unmergeable`);
              }
            }
          } else {
            reportEvent(`${tag}.nondefault`);
            // console.warn(
            //   '@deprecated: common module 中非 default 导出的内容(如 export function exportFunction(){})未来将无法通过 $app.common.xxx.exportFunction的方式访问，请将需要访问的内容通过 export default 进行导出。',
            // );
          }
        } catch (e) {}
      }
    }

    const [, , folder] = mod.path?.split('/');
    if (folder) {
      this.common[pageId] = this.common[pageId] || {};
      this.common[pageId][folder] = defaultModule;
    } else {
      this.common[pageId] = defaultModule;
    }
  }

  onEnd(context: LowcodeContext) {
    context.common = this.common;
  }
}
