import { Component, OnInit, Inject } from '@angular/core';
import { Router } from '@angular/router';
import { combineLatest } from 'rxjs';
import { take } from 'rxjs/operators';

import { AuthenticationService } from 'app/authentication/authentication.service';
import { GeneralEnvironmentConfig } from 'app/core/environment-config';
import { AuthenticationConfig } from 'app/core/authentication-config';
import { GENERAL_ENVIRONMENT_CONFIG, AUTHENTICATION_CONFIG } from 'app/core/provider-name-token';
@Component({
  selector: 'app-callback',
  templateUrl: './callback.component.html',
  styleUrls: ['./callback.component.scss']
})
export class CallbackComponent implements OnInit {

  constructor(
    private authenticationService: AuthenticationService,
    private router: Router,
    @Inject(GENERAL_ENVIRONMENT_CONFIG) private generalEnvironmentConfig: GeneralEnvironmentConfig,
    @Inject(AUTHENTICATION_CONFIG) private authenticationConfig: AuthenticationConfig
  ) { }

  ngOnInit(): void {
    const url = new URL(window.location.href)
    const token = url.searchParams.get('token')
    const redirectUrl = url.searchParams.get('redirect_url')

    // ถ้ามีการส่ง token มาให้หน้า callback แอพจะทำการ refresh token เพื่อขอ token ใหม่
    if (token) {
      combineLatest([
        this.authenticationService.serviceConfiguration(),
        this.authenticationService.tokenResponse()
      ])
        .pipe(take(1))
        .subscribe(() => {
          this.authenticationService.refreshTokenRequest(token)
            .then(() => {
              // ถ้ามีการส่ง redirectUrl หลังจากที่ refresh token เสร็จ ระบบจะ redirect ไปยัง url ที่ส่งมา 
              // ถ้าไม่ ระบบจะ redirect ไปหน้าหลัก
              if (!!redirectUrl) {
                window.location.assign(redirectUrl)
              } else {
                window.location.assign(window.document.baseURI)
              }
            })
            .catch(() => {
              // กรณีที่ token ส่งมาหมดอายุ หรือไม่ถูกต้อง จะบังคับไปหน้าล็อกอิน
              // หลังจากล็อกอินสำเร็จ จะทำการ redirect ไปยัง url ที่ส่งมา
              if (!!redirectUrl) {
                this.authenticationConfig.redirectUrlAfterLogedIn = redirectUrl
              }
              this.authenticationService.signIn()
            })
        })
    } else {
      if (this.generalEnvironmentConfig.fullSecureAuthentication === true) {
        if (!window.location.hash || window.location.hash.length === 0) {
          const queryString = window.location.search.substring(1); // substring strips '?'
          const path = [window.location.pathname, queryString].join('#');
          window.location.assign(new URL(path, window.location.href).toString());
        } else if (new URLSearchParams(window.location.hash.substring(1)).has('code')) {
          this.authenticationService.completeAuthorizationRequest()
            .then(() => {
              this.navigateWhenFinishLogedIn();
            })
            .catch(() => {
              console.warn('Please implement loged in fail!');
            });
        } else {
          this.navigateWhenFinishLogedIn();
        }
      } else {
        this.navigateWhenFinishLogedIn();
      }
    }
  }

  private navigateWhenFinishLogedIn() {
    const navigateUrl = this.authenticationService.getRedirectUrlAfterLogedIn();
    this.authenticationService.removeRedirectUrlAfterLogedIn();
    window.location.assign(navigateUrl);
  }

}
