import {Component, OnDestroy, OnInit} from '@angular/core';
import {MenuService} from '../service/menu.service';
import {AuthService} from '../service/auth.service';
import {accountantMenuItems, brokerMenuItems, mainMenuItems, managerMenuItems, peopleMenuItems, userMenuItems} from '../main-menu-items';
import {ApiV1LoginResponse} from '../models/api-v1-login-response';
import {Subscription} from 'rxjs';
import {PeopleModel} from '../models/people.model';
import {SessionService} from '../service/session.service';


@Component({
  selector: 'app-top-bar',
  templateUrl: './top-bar.component.html',
  styleUrls: ['./top-bar.component.scss']
})
export class TopBarComponent implements OnInit , OnDestroy {
  login  = false;
  public LoggedInUser: PeopleModel;

  Avatar = './assets/img/logout.png';
  public items: any[] = mainMenuItems;
  private loginSub: Subscription;
  private logoutSub: Subscription;

  public showMenu = true;
  public opened = false;

  constructor(private menuService: MenuService,
              private ss: SessionService,
              private authService: AuthService) {
  }

  ngOnInit(): void {
    this.initAndSubLogin();
  }

  public initAndSubLogin(): void{
    this.login = this.ss.loggedIn.login;
    this.LoggedInUser = this.ss.loggedIn.User;

    this.selectMenuShow(this.ss.loggedIn.role);

    this.loginSub = this.ss.loginResult.subscribe(
      (rsp: ApiV1LoginResponse) => {
        this.login = rsp.login;
        this.LoggedInUser = this.ss.CurrentUser;
        this.selectMenuShow(rsp.role);
      }
    );

    this.logoutSub = this.ss.logoutEvent.subscribe(
      resp => {
        this.login = false;
        this.LoggedInUser = this.ss.CurrentUser; // always empty user
      }
    );
  }

  private selectMenuShow(role: string): void {
    this.showMenu = true;
    switch ( role.toLowerCase() ){
      case 'admin':
        this.items = mainMenuItems;
        break;
      case 'broker':
        this.items = brokerMenuItems;
        break;
      case 'user':
        this.items = userMenuItems;
        break;
      case 'people':
        this.items = peopleMenuItems;
        break;
      case 'manager':
        this.items = managerMenuItems;
        break;
      case 'accountant':
        this.items = accountantMenuItems;
        break;
      default:
        this.showMenu = false;
    }
  }

  // check menuItem has fontawesome
  public menuItemHasFontawesome(item: any): boolean {
    return item.hasOwnProperty('fa');
  }

  // menuItem clicked
  public onSelect({ item }): void {
    if (!item.items) {
      this.menuService.itemClicked.emit(item);

      // handle logout
      if (item.text.toLowerCase() === 'logout'){
        this.logout();
      }
    }
  }

  ngOnDestroy(): void {
    this.loginSub.unsubscribe();
    this.logoutSub.unsubscribe();
  }

  public logout(): void{
    this.opened = true;
  }

  public close(action: string): void {
    this.opened = false;
    if ( action === 'yes') {
      // this.login = false;
      this.authService.logout();
    }
  }

  public loggedInUserAvatar(): string {
    return this.authService.getUrl('avatar/') + this.ss.loggedIn.User.Id;
  }

  public profile(): void {
    this.menuService.showProfile();
}

}
