import { InjectionToken } from '@angular/core';
import { Observable } from 'rxjs';
import { BixiAuthConfig } from '../config.type';
import { BIXI_SERVICE_TOKEN_FACTORY } from './token.service';

export const BIXI_SERVICE_TOKEN = new InjectionToken<ITokenService>('BIXI_SERVICE_TOKEN', {
  providedIn: 'root',
  factory: BIXI_SERVICE_TOKEN_FACTORY
});

// tslint:disable-next-line: interface-name
export interface ITokenModel {
  // tslint:disable-next-line:no-any
  [key: string]: any;

  token: string | null | undefined;
}

// tslint:disable-next-line:interface-name
export interface AuthReferrer {
  url?: string | null | undefined;
}

// tslint:disable-next-line: interface-name
export interface ITokenService {
  /** 获取登录地址 */
  readonly login_url: string | undefined;

  /** 获取授权失败前路由信息 */
  readonly referrer?: AuthReferrer;

  readonly options: BixiAuthConfig;

  set(data: ITokenModel | null): boolean;

  /**
   * 获取Token，形式包括：
   * - `get()` 获取 Simple Token
   * - `get<JWTTokenModel>(JWTTokenModel)` 获取 JWT Token
   */
  // tslint:disable-next-line:no-any
  get(type?: any): ITokenModel | null;

  /**
   * 获取Token，形式包括：
   * - `get()` 获取 Simple Token
   * - `get<JWTTokenModel>(JWTTokenModel)` 获取 JWT Token
   */
  // tslint:disable-next-line:no-any
  get<T extends ITokenModel>(type?: any): T;

  /**
   * Clean authorization data
   */
  clear(options?: { onlyToken: boolean }): void;

  change(): Observable<ITokenModel | null>;
}
