import {
  MiniAppData,
  MiniAppReqParams,
  MiniAppRawData,
  MiniAppReqCustomParams,
  MiniAppReqTemplateParams,
} from '@/napcat-core/packet/entities/miniApp';

type MiniAppTemplateNameList = 'bili' | 'weibo';

export abstract class MiniAppInfo {
  static readonly sdkId: string = 'V1_PC_MINISDK_99.99.99_1_APP_A';
  template: MiniAppReqTemplateParams;

  private static readonly appMap = new Map<MiniAppTemplateNameList, MiniAppInfo>();

  protected constructor (template: MiniAppReqTemplateParams) {
    this.template = template;
  }

  static get (name: MiniAppTemplateNameList): MiniAppInfo | undefined {
    return this.appMap.get(name);
  }

  static readonly Bili = new class extends MiniAppInfo {
    constructor () {
      super({
        sdkId: MiniAppInfo.sdkId,
        appId: '1109937557',
        scene: 1,
        templateType: 1,
        businessType: 0,
        verType: 3,
        shareType: 0,
        versionId: 'cfc5f7b05b44b5956502edaecf9d2240',
        withShareTicket: 0,
        iconUrl: 'https://miniapp.gtimg.cn/public/appicon/51f90239b78a2e4994c11215f4c4ba15_200.jpg',
      });
      MiniAppInfo.appMap.set('bili', this);
    }
  }();

  static readonly WeiBo = new class extends MiniAppInfo {
    constructor () {
      super({
        sdkId: MiniAppInfo.sdkId,
        appId: '1109224783',
        scene: 1,
        templateType: 1,
        businessType: 0,
        verType: 3,
        shareType: 0,
        versionId: 'e482a3cc4e574d9b772e96ba6eec9ba2',
        withShareTicket: 0,
        iconUrl: 'https://miniapp.gtimg.cn/public/appicon/35bbb44dc68e65194cfacfb206b8f1f7_200.jpg',
      });
      MiniAppInfo.appMap.set('weibo', this);
    }
  }();
}

export class MiniAppInfoHelper {
  static generateReq (custom: MiniAppReqCustomParams, template: MiniAppReqTemplateParams): MiniAppReqParams {
    return {
      ...custom,
      ...template,
    };
  }

  static RawToSend (rawData: MiniAppRawData): MiniAppData {
    return {
      ver: rawData.ver,
      prompt: rawData.prompt,
      config: rawData.config,
      app: rawData.appName,
      view: rawData.appView,
      meta: rawData.metaData,
      miniappShareOrigin: 3,
      miniappOpenRefer: '10002',
    };
  }

  static SendToRaw (data: MiniAppData): MiniAppRawData {
    return {
      appName: data.app,
      appView: data.view,
      ver: data.ver,
      desc: data.meta.detail_1.desc,
      prompt: data.prompt,
      metaData: data.meta,
      config: data.config,
    };
  }
}
