import {
  Component,
  OnInit,
  Input,
  EventEmitter,
  Output,
  ViewEncapsulation
} from '@angular/core';

import {
  Info,
  EventType,
  InfoResponse
} from '@ucap-webmessenger/protocol-event';
import { LoginResponse } from '@ucap-webmessenger/protocol-authentication';
import { UserInfo } from '@ucap-webmessenger/protocol-room';
import { NGXLogger } from 'ngx-logger';
import { VersionInfo2Response } from '@ucap-webmessenger/api-public';
import { FileInfo } from '../models/file-info.json';
import { DatePipe } from '@angular/common';

@Component({
  selector: 'ucap-chat-messages',
  templateUrl: './messages.component.html',
  styleUrls: ['./messages.component.scss']
})
export class MessagesComponent implements OnInit {
  @Input()
  loginRes: LoginResponse;
  @Input()
  messages: Info[];
  @Input()
  eventInfoStatus?: InfoResponse;
  @Input()
  userInfos?: UserInfo[];
  @Input()
  sessionVerInfo: VersionInfo2Response;

  @Output()
  massDetail = new EventEmitter<number>();
  @Output()
  imageViewer = new EventEmitter<FileInfo>();
  @Output()
  save = new EventEmitter<{ fileInfo: FileInfo; type: string }>();

  @Output()
  contextMenu = new EventEmitter<{
    event: MouseEvent;
    message: Info;
  }>();

  EventType = EventType;
  profileImageRoot: string;

  constructor(private logger: NGXLogger, private datePipe: DatePipe) {}

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

  /**
   * UserInfo getter
   */
  getUserName(seq: number): string {
    if (!this.userInfos) {
      return '';
    }

    const userInfo: UserInfo[] = this.userInfos.filter(
      user => user.seq === seq
    );
    if (!!userInfo && userInfo.length > 0) {
      return userInfo[0].name;
    }
    return '(알수없는 사용자)';
  }
  getUserProfile(seq: number): string {
    if (!this.userInfos) {
      return '';
    }

    const userInfo: UserInfo[] = this.userInfos.filter(
      user => user.seq === seq
    );
    if (!!userInfo && userInfo.length > 0) {
      return userInfo[0].profileImageFile;
    }
    return '';
  }

  getUnreadCount(message: Info): string | number {
    const unreadCnt = this.userInfos.filter(user => {
      if (message.senderSeq === user.seq) {
        // 본인 글은 unreadCount 에 포함하지 않는다.
        return false;
      }
      return user.lastReadEventSeq < message.seq;
    }).length;
    return unreadCnt === 0 ? '' : unreadCnt;
  }

  /**
   * 정보성 Event 인지 판단.
   * @description 정보성 event 일 경우 프로필, 일시 를 표현하지 않는다.
   * Edit with reducers.ts / sync / updateRoomForNewEventMessage
   */
  getIsInformation(info: Info) {
    if (
      info.type === EventType.Join ||
      info.type === EventType.Exit ||
      info.type === EventType.RenameRoom ||
      info.type === EventType.NotificationForTimerRoom ||
      info.type === EventType.GuideForRoomTimerChanged
    ) {
      return true;
    }
    return false;
  }

  /** Date Splitter show check */
  getDateSplitter(curIndex: number): boolean {
    if (curIndex === 0) {
      return true;
    }
    if (curIndex > 0) {
      return (
        this.datePipe.transform(
          this.messages[curIndex].sendDate,
          'yyyyMMdd'
        ) !==
        this.datePipe.transform(
          this.messages[curIndex - 1].sendDate,
          'yyyyMMdd'
        )
      );
    }
    return false;
  }

  /** [Event] MassTalk Detail View */
  onMassDetail(value: number) {
    this.massDetail.emit(value);
  }

  /** [Event] Image Viewer */
  onImageViewer(value: FileInfo) {
    this.imageViewer.emit(value);
  }

  /** [Event] Attach File Save & Save As */
  onSave(value: { fileInfo: FileInfo; type: string }) {
    this.save.emit(value);
  }

  /** [Event] Context Menu */
  onContextMenuMessage(event: MouseEvent, message: Info) {
    this.contextMenu.emit({ event, message });
  }
}