import {Injectable, Injector} from "@angular/core";
import {ActivatedRouteSnapshot, CanActivate, Router} from "@angular/router";
import {HttpClient, HttpEvent, HttpHandler, HttpInterceptor, HttpRequest, HttpResponse} from "@angular/common/http";
import {Constants} from "../config/constants";
import {CustomResponse} from "../config/CustomResponse";
import {BehaviorSubject, Observable} from "rxjs";

@Injectable()
export class AuthenticationService implements CanActivate, HttpInterceptor {
    private currentUserSubject = new BehaviorSubject<any>(null);
    _currentUser: any = null;
    getCurrentUser(): Observable<any> {
        return this.currentUserSubject.asObservable();
    }
    private refreshCurrentUser(currentUserData: any) {
        this._currentUser = currentUserData;
        localStorage.setItem('currentUser', JSON.stringify(currentUserData));
        this.currentUserSubject.next(this._currentUser);
    }

    constructor(
        public injector: Injector,
        private router: Router
    ) {
    }

    canActivate(route: ActivatedRouteSnapshot): boolean {
        this._currentUser = JSON.parse(localStorage.getItem('currentUser'));
        if(this._currentUser === null) {
            this.login();
            return false;
        }
        return true;
    }

    login() {
        const url = Constants.API_URL + Constants.ANONYMOUS_USER_LOGIN_EP;
        const http = this.injector.get(HttpClient);
        return http.post<CustomResponse<any>>(url, {code: Constants.TEST_USER_CODE})
            .subscribe(
                response => {
                    if(response && response.code === Constants.RESPONSE_OK) {
                        this.refreshCurrentUser(response.data);
                    } else {
                        this.refreshCurrentUser(null);
                    }
                },
                error => {
                    console.log(error);
                    this.refreshCurrentUser(null);
                }
            )
    }

    logout() {
        const url = Constants.API_URL + Constants.LOG_OUT_EP;
        const http = this.injector.get(HttpClient);
        return http.post<CustomResponse<any>>(url, {})
            .subscribe(
                response => {
                    if(response && response.code === Constants.RESPONSE_OK) {
                        this.refreshCurrentUser(null);
                    } else {
                        this.refreshCurrentUser(null);
                    }
                },
                error => {
                    this.refreshCurrentUser(null);
                }
            )
    }

    intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
        this._currentUser = JSON.parse(localStorage.getItem('currentUser'));
        if (this._currentUser && this._currentUser.bearertoken) {
            request = request.clone(
                {
                    setHeaders:
                        {
                            Authorization: `bearer ${this._currentUser.bearertoken}`
                        }
                }
            );
        }
        return next.handle(request);/*.map((event: HttpEvent<any>) => {
                if (event instanceof HttpResponse) {
                    if (event['body']['code'] === '002') {
                        this.logout();
                    }
                }
            }
        );*/
    }
}
