import {
  Component,
  OnInit,
  Input,
  Output,
  EventEmitter,
  ViewEncapsulation
} from '@angular/core';
import { UserInfo } from '@ucap-webmessenger/protocol-sync';
import {
  UserInfoSS,
  UserInfoF,
  UserInfoDN
} from '@ucap-webmessenger/protocol-query';
import {
  StatusBulkInfo,
  StatusInfo,
  WorkStatusType
} from '@ucap-webmessenger/protocol-status';
import { NGXLogger } from 'ngx-logger';
import { StatusCode, PresenceType } from '@ucap-webmessenger/core';
import { VersionInfo2Response } from '@ucap-webmessenger/api-public';

@Component({
  selector: 'ucap-profile-user-list-item',
  templateUrl: './user-list-item.component.html',
  styleUrls: ['./user-list-item.component.scss'],
  encapsulation: ViewEncapsulation.None
})
export class UserListItemComponent implements OnInit {
  @Input()
  userInfo: UserInfo | UserInfoSS | UserInfoF | UserInfoDN;
  @Input()
  profileImageRoot?: string;
  @Input()
  presence: StatusBulkInfo | StatusInfo;
  @Input()
  checkable = false;
  @Input()
  checkDisabled = false;
  @Input()
  isChecked = false;
  @Input()
  compactable = false;
  @Input()
  sessionVerinfo: VersionInfo2Response;
  @Input()
  /** 선택된 사용자의 리스트 */
  selectedUserList?: (UserInfo | UserInfoSS | UserInfoF | UserInfoDN)[] = [];

  @Output()
  checkUser = new EventEmitter<{
    isChecked: boolean;
    userInfo: UserInfo | UserInfoSS | UserInfoF | UserInfoDN;
  }>();
  @Output()
  openProfile = new EventEmitter<number>();

  PresenceType = PresenceType;

  constructor(private logger: NGXLogger) {}

  ngOnInit() {
    this.profileImageRoot =
      this.profileImageRoot || this.sessionVerinfo.profileRoot;
  }

  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;
    }

    if (!!status) {
      switch (status) {
        case StatusCode.OnLine:
          rtnClass = type + 'On';
          break;
        case StatusCode.Away:
          rtnClass = type + 'Out';
          break;
        case StatusCode.Busy:
          rtnClass = type + 'Other';
          break;
        default:
          rtnClass = type + 'Off';
          break;
      }
    }

    return rtnClass;
  }
  getPresenceMsg(): string {
    if (
      !!this.presence &&
      !!this.presence.statusMessage &&
      this.presence.statusMessage !== '.'
    ) {
      return this.presence.statusMessage;
    } else {
      return '';
    }
  }

  /** 리스트가 checkable 할 경우 checkbox 의 change 이벤트를 상위 컴포넌트로 전달한다. */
  onChangeCheck(
    value: boolean,
    userInfo: UserInfo | UserInfoSS | UserInfoF | UserInfoDN
  ) {
    this.checkUser.emit({
      isChecked: value,
      userInfo
    });
  }

  onClickOpenProfile(event: MouseEvent, userSeq: number) {
    event.preventDefault();
    event.stopPropagation();

    this.openProfile.emit(userSeq);
  }

  getWorkstatusInfo(type: string): string {
    let workstatus = this.userInfo.workstatus;

    if (
      !!this.presence &&
      !!this.presence.workstatus &&
      this.presence.workstatus.trim().length > 0
    ) {
      workstatus = this.presence.workstatus;
    }

    let text = '';
    // morning-off: 오전 afternoon-off: 오후  day-off: 휴가 long-time: 장기  leave-of-absence: 휴직
    let style = '';
    switch (workstatus) {
      case WorkStatusType.VacationAM:
        style = 'morning-off';
        text = '오전';
        break;
      case WorkStatusType.VacationPM:
        style = 'afternoon-off';
        text = '오후';
        break;
      case WorkStatusType.VacationAll:
        style = 'day-off';
        text = '휴가';
        break;
      case WorkStatusType.LeaveOfAbsence:
        style = 'leave-of-absence';
        text = '휴직';
        break;
      case WorkStatusType.LongtermRefresh:
        style = 'long-time';
        text = '장기';
        break;
    }

    return type === 'text' ? text : style;
  }
}
