/*
 * @Author: Maple
 * @Date: 2021-03-22 11:42:26
 * @LastEditors: Do not edit
 * @LastEditTime: 2021-05-27 11:22:02
 * @Description: 全局账号服务
 */
import { Injectable, Injector } from '@angular/core';
import { Router } from '@angular/router';
import { CoreService, StartupService } from '@core';
import { ReuseTabService } from '@delon/abc/reuse-tab';
import { BaseService } from '../core/base.service';
@Injectable({
  providedIn: 'root',
})
export class EAAccountService extends BaseService {
  // 验证码登录
  public $api_login_by_captcha = `/scm/cuc/cuc/user/sms/login?_allow_anonymous=true`;
  // 账号密码登录
  public $api_login_by_account = `/scm/cuc/cuc/user/login?_allow_anonymous=true`;
  // 退出登录
  public $api_logout = `/chia/user/logout`;

  constructor(public injector: Injector) {
    super(injector);
  }

  // 注入核心服务
  private get coreSrv(): CoreService {
    return this.injector.get(CoreService);
  }

  // 注入路由
  private get router(): Router {
    return this.injector.get(Router);
  }

  // 注入路由复用服务
  private get reuseTabService(): ReuseTabService {
    return this.injector.get(ReuseTabService);
  }
  // 注入全局启动服务
  private get startSrv(): StartupService {
    return this.injector.get(StartupService);
  }

  // 登录状态
  public get loginStatus(): boolean {
    return this.coreSrv.loginStatus;
  }

  /**
   * 账号密码登录
   * @param username 登录账号
   * @param password 登录密码
   */
  loginByAccount(username: string, password: string): void {
    this.asyncRequest(this.$api_login_by_account, { username, password, type: 0 }, 'POST', true, 'FORM').then((res) => {
      console.log(res);
      this.doAfterLogin(res);
    });
  }

  /**
   * 短信验证码登录
   * @param phone 手机号码
   * @param smsCode 短信验证码
   */
  loginByCaptcha(phone: string, smsCode: string): void {
    this.asyncRequest(this.$api_login_by_captcha, { phone, smsCode }, 'POST', true, 'FORM').then((res) => {
      this.doAfterLogin(res);
    });
  }

  private doAfterLogin(res: any): void {
    const token = res?.token;
    if (token) {
      // 清空路由复用信息
      this.reuseTabService.clear();

      // 设置用户Token信息
      // TODO: Mock expired value
      // res.user.expired = +new Date() + 1000 * 60 * 5;
      this.coreSrv.tokenSrv.set({ token });
      // 重新获取 StartupService 内容，我们始终认为应用信息一般都会受当前用户授权范围而影响
      this.startSrv.load().then(() => {
        let url = this.coreSrv.tokenSrv.referrer!.url || '/';
        if (url.includes('/passport')) {
          url = '/';
        }
        this.router.navigateByUrl(url);
      });
    }
  }

  /**
   * 登出系统
   * @param showMsg 是否显示登录过期弹窗
   */
  logout(showMsg: boolean): void {
    this.coreSrv.logout(showMsg);
  }

  /**
   * 向服务器请求登出
   */
  requestLogout(): void {
    this.asyncRequest(this.$api_logout).finally(() => {
      this.logout(false);
    });
  }
}
