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

/**
 * Simple 拦截器
 *
 * ```
 * // app.module.ts
 * { provide: HTTP_INTERCEPTORS, useClass: SimpleInterceptor, multi: true}
 * ```
 */
@Injectable()
export class SimpleInterceptor extends BaseInterceptor {
  isAuth(_options: BixiAuthConfig): boolean {
    this.model = this.injector.get(BIXI_SERVICE_TOKEN).get() as SimpleTokenModel;
    return CheckSimple(this.model as SimpleTokenModel);
  }

  // tslint:disable-next-line:no-any
  setReq(req: HttpRequest<any>, options: BixiAuthConfig): HttpRequest<any> {
    const { token_send_template, token_send_key } = options;
    // tslint:disable-next-line:no-non-null-assertion
    const token = token_send_template!.replace(/\$\{([\w]+)\}/g, (_: string, g) => this.model[g]);
    switch (options.token_send_place) {
      case 'header':
        // tslint:disable-next-line:no-any
        const obj: any = {};
        // tslint:disable-next-line:no-non-null-assertion
        obj[token_send_key!] = token;
        req = req.clone({
          setHeaders: obj
        });
        break;
      case 'body':
        const body = req.body || {};
        // tslint:disable-next-line:no-non-null-assertion
        body[token_send_key!] = token;
        req = req.clone({
          body
        });
        break;
      case 'url':
        req = req.clone({
          // tslint:disable-next-line:no-non-null-assertion
          params: req.params.append(token_send_key!, token)
        });
        break;
    }
    return req;
  }
}
