import {
  Component,
  OnInit,
  OnDestroy,
  ChangeDetectionStrategy,
  ChangeDetectorRef,
  Input,
  EventEmitter,
  Output,
  ElementRef,
  Self
} from '@angular/core';
import { UserInfo, GroupDetailData } from '@ucap/protocol-sync';
import { UserInfoSS, UserInfoF, UserInfoDN } from '@ucap/protocol-query';
import { UserInfo as RoomUserInfo } from '@ucap/protocol-room';
import { StatusBulkInfo, StatusInfo } from '@ucap/protocol-status';
import { PresenceType, StatusCode } from '@ucap/core';
import { I18nService } from '@ucap/ng-i18n';
import { ucapAnimations } from '@ucap/ng-ui';

export type UserInfoTypes =
  | UserInfo
  | UserInfoSS
  | UserInfoF
  | UserInfoDN
  | RoomUserInfo;

@Component({
  selector: 'app-group-profile-list-item',
  templateUrl: './profile-list-item.component.html',
  styleUrls: ['./profile-list-item.component.scss'],
  animations: ucapAnimations,
  changeDetection: ChangeDetectionStrategy.OnPush
})
export class ProfileListItemComponent implements OnInit, OnDestroy {
  @Input()
  userInfo: UserInfoF;

  @Input()
  group: GroupDetailData;

  @Input()
  isSearchData = false;

  @Input()
  defaultProfileImage: string;

  @Input()
  profileImageRoot: string;

  @Input()
  set presence(info: StatusBulkInfo | StatusInfo) {
    this._presence = info;
  }
  get presence(): StatusBulkInfo | StatusInfo {
    return this._presence;
  }
  _presence: StatusBulkInfo | StatusInfo;

  @Input()
  showMenu = true;

  @Input()
  checkable = false;
  @Input()
  set isChecked(checked: boolean) {
    this._isChecked = checked;
  }

  get isChecked(): boolean {
    return this._isChecked;
  }
  _isChecked = false;

  @Output()
  checked = new EventEmitter<{
    isChecked: boolean;
    userInfo: UserInfoTypes;
  }>();

  @Output()
  moreMenu: EventEmitter<{
    event: MouseEvent;
    userInfo: UserInfoTypes;
    group: GroupDetailData;
    rect: any;
  }> = new EventEmitter();

  isClicked = false;
  isShowMenu = false;

  @Input()
  isMe = false;

  PresenceType = PresenceType;
  isClickMore = false;

  constructor(
    private changeDetectorRef: ChangeDetectorRef,
    private i18nService: I18nService,
    @Self() private elementRef: ElementRef
  ) {
    this.i18nService.setDefaultNamespace('organization');
  }

  ngOnInit(): void {}

  ngOnDestroy(): void {}

  onClickProfileImage(event: Event, userInfo: UserInfoTypes): void {}

  onChangeCheck(value: boolean, userInfo: UserInfoTypes) {
    this.checked.emit({
      isChecked: value,
      userInfo
    });
  }

  getPresence(type: PresenceType): string {
    let status: string;
    let rtnClass = '';
    switch (type) {
      case PresenceType.PC:
        status = !!this.presence ? this.presence.pcStatus : undefined;
        break;
      case PresenceType.MOBILE:
        status = !!this.presence ? this.presence.mobileStatus : undefined;
        break;
    }

    switch (status) {
      case StatusCode.OnLine:
        rtnClass = 'online';
        break;
      case StatusCode.Away:
        rtnClass = 'absence';
        break;
      case StatusCode.Busy:
        rtnClass = 'other-business';
        break;
      default:
        rtnClass = 'offline';
        break;
    }

    return rtnClass;
  }

  getPresenceMsg(): string {
    let presenceMsg = this.i18nService.t('presence.offline');

    if (!!this.presence) {
      switch (this.presence.pcStatus) {
        case StatusCode.OnLine:
          presenceMsg = this.i18nService.t('presence.online');
          break;
        case StatusCode.Away:
          presenceMsg = this.i18nService.t('presence.away');
          break;
        case StatusCode.Busy:
          if (
            !!this.presence.statusMessage &&
            this.presence.statusMessage !== '.'
          ) {
            presenceMsg = this.presence.statusMessage;
          } else {
            presenceMsg = this.i18nService.t('presence.statusMessage1');
          }
          break;
      }
    }

    return presenceMsg;
  }

  onClickMore(event: MouseEvent) {
    this.isClickMore = true;
    const rect = this.elementRef.nativeElement.getBoundingClientRect();

    this.moreMenu.emit({
      event,
      userInfo: this.userInfo,
      group: this.group,
      rect
    });
  }

  onClickProfileContextMenu(event: MouseEvent, type: string) {}
  onClickProfile(event: MouseEvent) {
    event.preventDefault();
    event.stopPropagation();
    if (this.showMenu && !this.isMe) {
      this.isShowMenu = true;
    }
  }
  onMouseover(event: MouseEvent): void {
    if (this.showMenu && !this.isMe) {
      this.isShowMenu = true;
      if (this.isClickMore) {
        this.isClickMore = false;
      }
    }
    event.preventDefault();
    event.stopPropagation();
  }
  onMouseleave(event: MouseEvent): void {
    if (this.showMenu && !this.isMe) {
      this.isShowMenu = false;
    }

    event.preventDefault();
    event.stopPropagation();
  }
}
