import {
  ModuleConfig as CommonApiModuleConfig,
  Urls as CommonApiUrls
} from '@ucap-webmessenger/api-common';
import {
  ModuleConfig as PublicApiModuleConfig,
  Urls as PublicApiUrls
} from '@ucap-webmessenger/api-public';
import {
  ModuleConfig as ExternalApiModuleConfig,
  Urls as ExternalApiUrls
} from '@ucap-webmessenger/api-external';
import {
  ModuleConfig as MessageApiModuleConfig,
  Urls as MessageApiUrls
} from '@ucap-webmessenger/api-message';
import {
  ModuleConfig as PiModuleConfig,
  Urls as PiUrls
} from '@ucap-webmessenger/pi';
import {
  ModuleConfig as ProtocolModuleConfig,
  Urls as ProtocolUrls
} from '@ucap-webmessenger/protocol';
import { ModuleConfig as NativeModuleConfig } from '@ucap-webmessenger/native';

export type UCapRuntime = 'browser' | 'electron';

export interface Environment {
  production: boolean;
  runtime?: UCapRuntime;
  title: string;

  commonApiModuleConfig: CommonApiModuleConfig;
  publicApiModuleConfig: PublicApiModuleConfig;
  externalApiModuleConfig: ExternalApiModuleConfig;
  messageApiModuleConfig: MessageApiModuleConfig;
  piModuleConfig: PiModuleConfig;
  protocolModuleConfig: ProtocolModuleConfig;
  nativeModuleConfig: NativeModuleConfig;
}

export const commonApiUrls: CommonApiUrls = {
  fileProfileSave: '/Common/FileProfileSave.aspx',
  fileTalkDownload: '/Common/FileTalkDownload.aspx',
  fileTalkSave: '/Common/FileTalkSave.aspx',
  fileTalkShare: '/Common/FileTalkShare.aspx',
  massTalkDownload: '/Common/MassTalkDownload.aspx',
  massTalkSave: '/Common/MassTalkSave.aspx',
  transMassTalkDownload: '/Common/TransMassTalkDownload.aspx',
  transMassTalkSave: '/Common/TransMassTalkSave.aspx',
  translationReq: '/Common/TranslationReq.aspx',
  translationSave: '/Common/TranslationSave.aspx'
};

export const publicApiUrls: PublicApiUrls = {
  versionInfo2: '/Pub/verinfo2.aspx',
  updateInfo: '/Pub/updinfo.aspx'
};
export const externalApiUrls: ExternalApiUrls = {
  checkUserInfoEx: '/Extern/CheckUserInfoEx.aspx',
  companyList: '/Extern/CompanyList.aspx',
  tokenUpdate: '/Extern/TokenUpdate.aspx',
  urlInfo: '/Extern/urlinfo.aspx'
};
export const messageApiUrls: MessageApiUrls = {
  retrieveSendMessageList: '/uCapMsg/msg/retrieveSendMessageList.do',
  retrieveRecvMessageList: '/uCapMsg/msg/retrieveRecvMessageList.do',
  retrieveReservationMessageList:
    '/uCapMsg/msg/retrieveReservationMessageList.do',
  retrieveSearchMessage: '/uCapMsg/msg/retrieveSearchMessage.do',

  sendNewMessage: '/uCapMsg/msg/sendNewMessage.do',

  retrieveMessageDetail: '/uCapMsg/msg/retrieveMessageDetail.do',
  readMessage: '/uCapMsg/msg/readMessage.do',
  retrieveReadCheck: '/uCapMsg/msg/retrieveReadCheck.do',
  cancelMessage: '/uCapMsg/msg/cancelMessage.do',
  cancelReservationMessage: '/uCapMsg/msg/cancelReservationMessage.do',
  retrieveResourceFile: '/uCapMsg/msg/retrieveResourceFile.do',

  deleteMessage: '/uCapMsg/msg/deleteMessage.do',

  saveMyMessage: '/uCapMsg/msg/saveMyMessage.do',
  retrieveMyMessage: '/uCapMsg/msg/retrieveMyMessage.do',
  deleteMyMessage: '/uCapMsg/msg/deleteMyMessage.do',
  editMyMessage: '/uCapMsg/msg/editMyMessage.do',

  editReservationMessageEx: '/uCapMsg/msg/editReservationMessageEx.do',

  sendCopyMessage: '/uCapMsg/msg/sendCopyMessage.do',

  retrieveUnreadCount: '/uCapMsg/msg/retrieveUnreadCount.do'
};
export const piUrls: PiUrls = {
  login2: '/uCapPi/login2',
  userTermsAction: '/uCapPi/user/terms.action',
  passwordInitStep1: '/uCapPi/password/initStep1',
  passwordChange: '/uCapPi/password/change',
  policyTotal: '/uCapPi/policy/total',
  policyService: '/uCapPi/policy/service',
  policyPrivacy: '/uCapPi/policy/privacy',
  tokenCheck: '/uCapPi/tokenCheck',
  userMobileAuth: '/uCapPi/user/mobileAuth',
  userUserAuth: '/uCapPi/user/userAuth',
  userCall: '/uCapPi/user/call',
  userMoblieCallAuth: '/uCapPi/user/moblieCallAuth',
  eventSendEventMail: '/uCapPi/event/sendEventMail',
  userMobileInitial1: '/uCapPi/user/mobileInitial1',
  eventSendInvite: '/uCapPi/event/sendInvite',
  userRoom: '/uCapPi/user/room',
  scheduleRetrieveScheduleList: '/uCapPi/schedule/retrieveScheduleList',
  userScreenCapture: '/uCapPi/user/screenCapture'
};
export const protocolUrls: ProtocolUrls = {
  base: '/'
};

export const commonApiacceptableFileExtensions: string[] = [
  // 문서1
  'csv',
  'd01',
  'doc',
  'docx',
  'dot',
  'dotx',
  'hwp',
  'log',
  'one',
  'pdf',
  'pot',
  'potx',
  'pps',
  'ppsx',
  'ppt',
  'pptx',
  'ps',
  // 문서2
  'rtf',
  'txt',
  'vcf',
  'xls',
  'xlsx',
  'xlt',
  'xltx',
  'xlsm',
  'ods',
  // CAD
  'asc',
  'dwg',
  'dws',
  'dwt',
  'dxf',
  'pgp',
  'plt',
  // MAC
  'pages',
  'keynote',
  // 압축
  '7z',
  'a01',
  'a02',
  'a03',
  'alz',
  'egg',
  'gz',
  'rar',
  'tar',
  'zip',
  // 오디오
  'aac',
  'aiff',
  'flac',
  'm4a',
  'mp2',
  'mp3',
  'mpega',
  'mpga',
  'ogg',
  'wma',
  'wav',
  // 플래쉬
  'fla',
  'flv',
  'swf',
  // 이미지
  'ai',
  'bmp',
  'cdr',
  'emf',
  'eps',
  'gif',
  'jpeg',
  'jpg',
  'png',
  'psd',
  'tif',
  'tiff',
  'wmf',
  // 동영상
  '3gp',
  'avi',
  'm4v',
  'mkv',
  'mov',
  'mp4',
  'mpeg',
  'mpg',
  'rv',
  'ts',
  'webm',
  'wmv',
  // 폴더전송용
  'zdr'
];

// export abstract class UrlConfig {
//   constructor(
//     protected useSsl: boolean,
//     protected domain: string,
//     protected port: number,
//     protected webSocket: boolean = false
//   ) {}

//   protected getProtocol(): string {
//     return this.webSocket
//       ? this.useSsl
//         ? 'wss:'
//         : 'ws:'
//       : this.useSsl
//       ? 'https:'
//       : 'http:';
//   }

//   protected getUrl(extra: Partial<URL>): string {
//     const url = new URL(
//       `${this.getProtocol()}//${this.domain}:${String(this.port)}`
//     );

//     for (const key in extra) {
//       if (extra.hasOwnProperty(key)) {
//         url[key] = extra[key];
//       }
//     }
//     return url.href;
//   }
// }

// export class ApiPublicUrlConfig extends UrlConfig {
//   constructor(useSsl: boolean, domain: string, port: number) {
//     super(useSsl, domain, port);
//   }

//   public get versionInfo2(): string {
//     return this.getUrl({
//       pathname: '/Pub/verinfo2.aspx',
//     });
//   }

//   public get updateInfo(): string {
//     return this.getUrl({
//       pathname: '/Pub/updinfo.aspx',
//     });
//   }
// }

// export class ApiExternalUrlConfig extends UrlConfig {
//   constructor(useSsl: boolean, domain: string, port: number) {
//     super(useSsl, domain, port);
//   }

//   public get companyList(): string {
//     return this.getUrl({
//       pathname: '/Extern/CompanyList.aspx',
//     });
//   }

//   public get urlInfo(): string {
//     return this.getUrl({
//       pathname: '/Extern/urlinfo.aspx',
//     });
//   }

//   public get checkUserInfoEx(): string {
//     return this.getUrl({
//       pathname: '/Extern/CheckUserInfoEx.aspx',
//     });
//   }

//   public get tokenUpdate(): string {
//     return this.getUrl({
//       pathname: '/Extern/TokenUpdate.aspx',
//     });
//   }
// }

// export class ApiCommonUrlConfig extends UrlConfig {
//   constructor(useSsl: boolean, domain: string, port: number) {
//     super(useSsl, domain, port);
//   }

//   public get fileProfileSave(): string {
//     return this.getUrl({
//       pathname: '/Common/FileProfileSave.aspx',
//     });
//   }

//   public get fileTalkSave(): string {
//     return this.getUrl({
//       pathname: '/Common/FileTalkSave.aspx',
//     });
//   }

//   public get fileTalkDownload(): string {
//     return this.getUrl({
//       pathname: '/Common/FileTalkDownload.aspx',
//     });
//   }

//   public get fileTalkShare(): string {
//     return this.getUrl({
//       pathname: '/Common/FileTalkShare.aspx',
//     });
//   }

//   public get massTalkSave(): string {
//     return this.getUrl({
//       pathname: '/Common/MassTalkSave.aspx',
//     });
//   }

//   public get massTalkDownload(): string {
//     return this.getUrl({
//       pathname: '/Common/MassTalkDownload.aspx',
//     });
//   }

//   public get transMassTalkSave(): string {
//     return this.getUrl({
//       pathname: '/Common/TransMassTalkSave.aspx',
//     });
//   }

//   public get transMassTalkDownload(): string {
//     return this.getUrl({
//       pathname: '/Common/TransMassTalkDownload.aspx',
//     });
//   }

//   public get translationReq(): string {
//     return this.getUrl({
//       pathname: '/Common/TranslationReq.aspx',
//     });
//   }

//   public get translationSave(): string {
//     return this.getUrl({
//       pathname: '/Common/TranslationSave.aspx',
//     });
//   }
// }

// export class PiUrlConfig extends UrlConfig {
//   constructor(useSsl: boolean, domain: string, port: number) {
//     super(useSsl, domain, port);
//   }

//   public get login2(): string {
//     return this.getUrl({
//       pathname: '/uCapPi/login2',
//     });
//   }

//   public get userTermsAction(): string {
//     return this.getUrl({
//       pathname: '/uCapPi/user/terms.action',
//     });
//   }

//   public get passwordInitStep1(): string {
//     return this.getUrl({
//       pathname: '/uCapPi/password/initStep1',
//     });
//   }

//   public get passwordChange(): string {
//     return this.getUrl({
//       pathname: '/uCapPi/password/change',
//     });
//   }

//   public get policyTotal(): string {
//     return this.getUrl({
//       pathname: '/uCapPi/policy/total',
//     });
//   }

//   public get policyService(): string {
//     return this.getUrl({
//       pathname: '/uCapPi/policy/service',
//     });
//   }

//   public get policyPrivacy(): string {
//     return this.getUrl({
//       pathname: '/uCapPi/policy/privacy',
//     });
//   }

//   public get tokenCheck(): string {
//     return this.getUrl({
//       pathname: '/uCapPi/tokenCheck',
//     });
//   }

//   public get userMobileAuth(): string {
//     return this.getUrl({
//       pathname: '/uCapPi/user/mobileAuth',
//     });
//   }

//   public get userUserAuth(): string {
//     return this.getUrl({
//       pathname: '/uCapPi/user/userAuth',
//     });
//   }

//   public get userCall(): string {
//     return this.getUrl({
//       pathname: '/uCapPi/user/call',
//     });
//   }

//   public get userMoblieCallAuth(): string {
//     return this.getUrl({
//       pathname: '/uCapPi/user/moblieCallAuth',
//     });
//   }

//   public get eventSendEventMail(): string {
//     return this.getUrl({
//       pathname: '/uCapPi/event/sendEventMail',
//     });
//   }

//   public get userMobileInitial1(): string {
//     return this.getUrl({
//       pathname: '/uCapPi/user/mobileInitial1',
//     });
//   }

//   public get eventSendInvite(): string {
//     return this.getUrl({
//       pathname: '/uCapPi/event/sendInvite',
//     });
//   }

//   public get userRoom(): string {
//     return this.getUrl({
//       pathname: '/uCapPi/user/room',
//     });
//   }

//   public get scheduleRetrieveScheduleList(): string {
//     return this.getUrl({
//       pathname: '/uCapPi/schedule/retrieveScheduleList',
//     });
//   }

//   public get userScreenCapture(): string {
//     return this.getUrl({
//       pathname: '/uCapPi/user/screenCapture',
//     });
//   }
// }

// export class ProtocolUrlConfig extends UrlConfig {
//   constructor(useSsl: boolean, domain: string, port: number) {
//     super(useSsl, domain, port, true);
//   }

//   public get base(): string {
//     return this.getUrl({
//       pathname: '/',
//     });
//   }
// }

// export class VideoConfrenceUrlConfig extends UrlConfig {
//   constructor(useSsl: boolean, domain: string, port: number) {
//     super(useSsl, domain, port);
//   }

//   public get create(): string {
//     return this.getUrl({
//       pathname: '/API_CreateConf',
//     });
//   }

//   public get join(): string {
//     return this.getUrl({
//       pathname: '/AutoLogin.jsp',
//     });
//   }
// }

// export class ClickToCallUrlConfig extends UrlConfig {
//   constructor(useSsl: boolean, domain: string, port: number) {
//     super(useSsl, domain, port);
//   }

//   public get cdr(): string {
//     return this.getUrl({
//       pathname: '/clicktocall/api/messenger/cdr',
//     });
//   }

//   public get clicktocall(): string {
//     return this.getUrl({
//       pathname: '/clicktocall/api/messenger/clicktocall',
//     });
//   }
// }

// export interface Environment {
//   production?: boolean;
//   title?: string;
//   useSsl?: boolean;
//   webDomain?: string;
//   webPort?: number;
//   urls?: {
//     apiPublic: ApiPublicUrlConfig;
//     apiCommon: ApiCommonUrlConfig;
//     apiExternal: ApiExternalUrlConfig;
//     pi: PiUrlConfig;
//     protocol: ProtocolUrlConfig;
//     videoConfrence: VideoConfrenceUrlConfig;
//     clickToCall: ClickToCallUrlConfig;
//   };
//   protocol?: {
//     reconnect: {
//       delay: number;
//     };
//     requestId: {
//       min: number;
//       max: number;
//     };
//   };
//   modules?: {
//     native: {
//       serviceClass?: Type<NativeService>;
//     };
//     event: {
//       acceptableFileExtensions: string[];
//     };
//   };
// }

// export function build(production: boolean): Environment {
//   const devServer = false;
//   const useSsl = false;
//   const title = 'UCapMessenger';

//   const webDomain = devServer ? 'bizucap.uplus.co.kr' : '27.122.224.170';
//   const webPort = devServer ? 80 : 8011;

//   return {
//     production,
//     title: devServer ? `[개발]${title}` : title,
//     useSsl,
//     webDomain,
//     webPort,
//     urls: {
//       apiCommon: new ApiCommonUrlConfig(useSsl, webDomain, webPort),
//       apiPublic: new ApiPublicUrlConfig(useSsl, webDomain, webPort),
//       apiExternal: new ApiExternalUrlConfig(useSsl, webDomain, webPort),
//       pi: new PiUrlConfig(useSsl, webDomain, devServer ? 9097 : 9097),
//       protocol: new ProtocolUrlConfig(useSsl, webDomain, useSsl ? 9443 : 8080),
//       videoConfrence: new VideoConfrenceUrlConfig(
//         useSsl,
//         devServer ? '101.55.17.24' : '101.55.17.24',
//         devServer ? 80 : 80
//       ),
//       clickToCall: new ClickToCallUrlConfig(
//         useSsl,
//         devServer ? '169.56.82.147' : '169.56.82.147',
//         devServer ? 9095 : 9095
//       ),
//     },
//     protocol: {
// reconnect: {
//   delay: 1000,
// },
// requestId: {
//   min: 1,
//   max: 59999,
// },
//     },
//     modules: {
//       native: {},
//       event: {
//         acceptableFileExtensions: [
// // 문서1
// 'csv',
// 'd01',
// 'doc',
// 'docx',
// 'dot',
// 'dotx',
// 'hwp',
// 'log',
// 'one',
// 'pdf',
// 'pot',
// 'potx',
// 'pps',
// 'ppsx',
// 'ppt',
// 'pptx',
// 'ps',
// // 문서2
// 'rtf',
// 'txt',
// 'vcf',
// 'xls',
// 'xlsx',
// 'xlt',
// 'xltx',
// 'xlsm',
// 'ods',
// // CAD
// 'asc',
// 'dwg',
// 'dws',
// 'dwt',
// 'dxf',
// 'pgp',
// 'plt',
// // MAC
// 'pages',
// 'keynote',
// // 압축
// '7z',
// 'a01',
// 'a02',
// 'a03',
// 'alz',
// 'egg',
// 'gz',
// 'rar',
// 'tar',
// 'zip',
// // 오디오
// 'aac',
// 'aiff',
// 'flac',
// 'm4a',
// 'mp2',
// 'mp3',
// 'mpega',
// 'mpga',
// 'ogg',
// 'wma',
// 'wav',
// // 플래쉬
// 'fla',
// 'flv',
// 'swf',
// // 이미지
// 'ai',
// 'bmp',
// 'cdr',
// 'emf',
// 'eps',
// 'gif',
// 'jpeg',
// 'jpg',
// 'png',
// 'psd',
// 'tif',
// 'tiff',
// 'wmf',
// // 동영상
// '3gp',
// 'avi',
// 'm4v',
// 'mkv',
// 'mov',
// 'mp4',
// 'mpeg',
// 'mpg',
// 'rv',
// 'ts',
// 'webm',
// 'wmv',
// // 폴더전송용
// 'zdr',
//         ],
//       },
//     },
//   };
// }
