import { Injectable } from '@angular/core';
import { DomSanitizer } from '@angular/platform-browser';
import { TranslateService } from '@ngx-translate/core';
import { en_US, NzI18nService, zh_CN } from 'ng-zorro-antd/i18n';
import { Subject } from 'rxjs';
import { ENUS } from './en-US';
import { BixiI18NService } from './service.type';
import { ZHCN } from './zh-CN';

export type LangType = 'en-US' | 'zh-CN';

@Injectable({ providedIn: 'root' })
export class I18NService implements BixiI18NService {
  private change$: Subject<LangType> = new Subject<LangType>();

  private _langs = [
    { code: 'en-US', text: 'English' },
    { code: 'zh-CN', text: '中文' }
  ];

  constructor(private zorroI18n: NzI18nService, private translate: TranslateService, private dom: DomSanitizer) {
    this.translate.setTranslation('en-US', ENUS);
    this.translate.setTranslation('zh-CN', ZHCN);
    this.translate.setDefaultLang('en-US');
    // from browser
    const lang = (this.getBrowserLang() || this.defaultLang) as LangType;
    this.use(lang, false);
  }

  private getBrowserLang(): string | undefined {
    // tslint:disable-next-line:no-any
    const winNav: any = window.navigator;
    if (typeof window === 'undefined' || typeof winNav === 'undefined') {
      return undefined;
    }

    // tslint:disable-next-line:no-any
    let browserLang: any = winNav.languages ? winNav.languages[0] : null;
    browserLang = browserLang || winNav.language || winNav.browserLanguage || winNav.userLanguage;

    if (browserLang.indexOf('-') !== -1) {
      browserLang = browserLang.split('-')[0];
    }

    if (browserLang.indexOf('_') !== -1) {
      browserLang = browserLang.split('_')[0];
    }

    return this.getFullLang(browserLang);
  }

  get change() {
    return this.change$.asObservable();
  }

  use(lang: LangType, emit = true) {
    this.translate.use(lang);
    this.zorroI18n.setLocale(lang === 'en-US' ? en_US : zh_CN);
    if (emit) this.change$.next(lang);
  }

  // tslint:disable-next-line:no-any
  getLangs(): any[] {
    return this._langs;
  }

  get defaultLang(): LangType {
    return 'zh-CN';
  }

  get lang() {
    return this.translate.currentLang;
  }

  get zone() {
    return this.translate.currentLang.split('-')[0];
  }

  get langs() {
    return ['zh-CN', 'en-US'];
  }

  fanyi(key: string, interpolateParams?: {}, isSafe?: boolean) {
    const res = this.translate.instant(key, interpolateParams);
    if (isSafe === true) {
      return this.dom.bypassSecurityTrustHtml(res);
    }
    return res;
  }

  // tslint:disable-next-line:no-any
  get(i: any) {
    return typeof i === 'string' ? i : i[this.lang] || i[this.defaultLang] || '';
  }

  getFullLang(lang: string) {
    const res = this._langs.filter(l => l.code.split('-')[0] === lang);
    return res.length > 0 ? res[0].code : this.defaultLang;
  }

  getRealUrl(url: string) {
    const arr = url.split('#')[0].split('?')[0].split('/');
    arr.splice(-1);
    return arr.join('/');
  }
}
