import { HttpRequest } from '@angular/common/http';
import { Injectable } from '@angular/core';
import { BixiAuthConfig } from '../../config.type';
import { BaseInterceptor } from '../base.interceptor';
import { CheckJwt } from '../helper';
import { BIXI_SERVICE_TOKEN } from '../interface';
import { JWTTokenModel } from './jwt.model';

/**
 * JWT 拦截器
 *
 * ```
 * // app.module.ts
 * { provide: HTTP_INTERCEPTORS, useClass: JWTInterceptor, multi: true}
 * ```
 */
@Injectable()
export class JWTInterceptor extends BaseInterceptor {
  isAuth(options: BixiAuthConfig): boolean {
    this.model = this.injector.get(BIXI_SERVICE_TOKEN).get<JWTTokenModel>(JWTTokenModel);
    // tslint:disable-next-line:no-non-null-assertion
    return CheckJwt(this.model as JWTTokenModel, options.token_exp_offset!);
  }

  // tslint:disable-next-line:no-any
  setReq(req: HttpRequest<any>, _options: BixiAuthConfig): HttpRequest<any> {
    return req.clone({
      setHeaders: {
        Authorization: `Bearer ${ this.model.token }`
      }
    });
  }
}
