import {
  Component,
  OnInit,
  OnDestroy,
  Output,
  EventEmitter,
  ViewChild,
  Input,
  AfterViewChecked
} from '@angular/core';
import { Subscription, of } from 'rxjs';
import { Store, select } from '@ngrx/store';
import { tap, map, catchError } from 'rxjs/operators';

import * as AppStore from '@app/store';

import { UserInfo } from '@ucap-webmessenger/protocol-room';
import { VersionInfo2Response } from '@ucap-webmessenger/api-public';
import { SessionStorageService } from '@ucap-webmessenger/web-storage';
import { KEY_VER_INFO } from '@app/types/ver-info.type';
import { DialogService } from '@ucap-webmessenger/ui';
import { LoginResponse } from '@ucap-webmessenger/protocol-authentication';
import { KEY_LOGIN_RES_INFO } from '@app/types/login-res-info.type';
import {
  MessageApiService,
  MessageType,
  RetrieveRequest,
  MessageList,
  RetrieveSearchRequest,
  MessageSearchType
} from '@ucap-webmessenger/api-message';
import { DeviceType } from '@ucap-webmessenger/core';
import { MessageStatusCode } from '@ucap-webmessenger/api';
import { ContentType } from '@ucap-webmessenger/api-message';
import { FormGroup, FormBuilder } from '@angular/forms';
import {
  MatTabGroup,
  MatSelectChange,
  MatRadioChange
} from '@angular/material';

@Component({
  selector: 'app-layout-chat-left-sidenav-message',
  templateUrl: './message.component.html',
  styleUrls: ['./message.component.scss']
})
export class MessageBoxComponent
  implements OnInit, OnDestroy, AfterViewChecked {
  @Input()
  isVisible = false;

  @ViewChild('tabs', { static: false }) tabs: MatTabGroup;
  isInitTabs = false;

  fgSearch: FormGroup;
  fgSearchType: FormGroup;

  loginRes: LoginResponse;
  sessionVerinfo: VersionInfo2Response;

  messageList: MessageList[] = [];

  messageRecieveListSubscription: Subscription;
  messageSendListSubscription: Subscription;
  messageReservationListSubscription: Subscription;
  messageSearchListSubscription: Subscription;

  defaultPageSize = 100; // default
  recieveCurrentPage = 0; // start index is 0.
  sendCurrentPage = 0; // start index is 0.
  reservationCurrentPage = 0; // start index is 0.
  searchCurrentPage = 0; // start index is 0.

  currentTotalCount = 0;
  currentPage = 0;

  ContentType = ContentType;
  MessageType = MessageType;
  MessageSearchType = MessageSearchType;

  isSearch = false;

  constructor(
    private store: Store<any>,
    private formBuilder: FormBuilder,
    private sessionStorageService: SessionStorageService,
    private dialogService: DialogService,
    private messageApiService: MessageApiService
  ) {
    this.loginRes = this.sessionStorageService.get<LoginResponse>(
      KEY_LOGIN_RES_INFO
    );
    this.sessionVerinfo = this.sessionStorageService.get<VersionInfo2Response>(
      KEY_VER_INFO
    );
  }

  ngOnInit() {
    this.fgSearch = this.formBuilder.group({
      searchInput: null
    });
    this.fgSearchType = this.formBuilder.group({
      searchMessageType: [MessageType.All],
      searchMessageSearchType: [MessageSearchType.Name]
    });

    // 초기 검색은 수신함.
    this.getRetrieveMessage(MessageType.Receive, this.recieveCurrentPage);

    if (!!this.tabs) {
      this.tabs.realignInkBar();
    }
  }

  ngAfterViewChecked(): void {
    if (!!this.tabs && !this.isInitTabs && this.isVisible) {
      this.isInitTabs = true;
      this.tabs.realignInkBar();
    }
  }

  ngOnDestroy(): void {
    if (!!this.messageRecieveListSubscription) {
      this.messageRecieveListSubscription.unsubscribe();
    }
    if (!!this.messageSendListSubscription) {
      this.messageSendListSubscription.unsubscribe();
    }
    if (!!this.messageReservationListSubscription) {
      this.messageReservationListSubscription.unsubscribe();
    }
    if (!!this.messageSearchListSubscription) {
      this.messageSearchListSubscription.unsubscribe();
    }
  }

  onSelectedIndexChange(value: number) {
    switch (value) {
      case 0:
        {
          // Recieve
          this.getRetrieveMessage(MessageType.Receive, this.recieveCurrentPage);
        }
        break;
      case 1:
        {
          // Send
          this.getRetrieveMessage(MessageType.Send, this.sendCurrentPage);
        }
        break;
      case 2:
        {
          // Reservation
          this.getRetrieveMessage(
            MessageType.Reservation,
            this.reservationCurrentPage
          );
        }
        break;
    }
  }

  onChangeSelection(event: MatSelectChange) {
    this.searchCurrentPage = 0;
    this.getSearchMessage(
      event.value,
      this.fgSearchType.get('searchMessageSearchType').value,
      this.fgSearch.get('searchInput').value
    );
  }
  onChangeSearchType(event: MatRadioChange) {
    this.searchCurrentPage = 0;
    this.getSearchMessage(
      this.fgSearchType.get('searchMessageType').value,
      event.value,
      this.fgSearch.get('searchInput').value
    );
  }
  onKeyDownEnter(event: KeyboardEvent, search: string) {
    event.preventDefault();
    event.stopPropagation();

    this.searchCurrentPage = 0;

    this.getSearchMessage(
      MessageType.All,
      MessageSearchType.Name,
      search.trim()
    );
  }
  getSearchMessage(
    messageType: MessageType,
    searchType: MessageSearchType,
    searchStr: string
  ) {
    this.isSearch = true;
    this.messageSendListSubscription = this.messageApiService
      .retrieveSearchMessage({
        userSeq: this.loginRes.userSeq,
        deviceType: DeviceType.PC,
        tokenKey: this.loginRes.tokenString,
        type: messageType,
        pageSize: this.defaultPageSize,
        pageCount: this.searchCurrentPage,

        searchTitle: searchType === MessageSearchType.Title ? searchStr : '',
        searchName: searchType === MessageSearchType.Name ? searchStr : '',
        searchContent:
          searchType === MessageSearchType.Contents ? searchStr : ''
      } as RetrieveSearchRequest)
      .pipe(
        map(res => {
          console.log(res);
          if (res.responseCode === MessageStatusCode.Success) {
            this.currentTotalCount = res.totalCount;
            this.currentPage = res.pageCount;
            this.searchCurrentPage = res.pageCount;
            this.messageList = res.messageList;
          } else {
          }
        }),
        catchError(error => of(console.log(error)))
      )
      .subscribe();
  }

  onClickSearchCancel() {
    this.isSearch = false;
    this.getRetrieveMessage(MessageType.Receive, this.recieveCurrentPage);
  }

  getRetrieveMessage(type: MessageType, trgtPageIndex: number) {
    switch (type) {
      case MessageType.Receive:
        {
          this.messageSendListSubscription = this.messageApiService
            .retrieveReceiveMessage({
              userSeq: this.loginRes.userSeq,
              deviceType: DeviceType.PC,
              tokenKey: this.loginRes.tokenString,
              type: MessageType.Receive,
              pageSize: this.defaultPageSize,
              pageCount: this.recieveCurrentPage
            } as RetrieveRequest)
            .pipe(
              map(res => {
                console.log(res);
                if (res.responseCode === MessageStatusCode.Success) {
                  this.currentTotalCount = res.totalCount;
                  this.currentPage = res.pageCount;
                  this.recieveCurrentPage = res.pageCount;
                  this.messageList = res.messageList;
                } else {
                }
              }),
              catchError(error => of(console.log(error)))
            )
            .subscribe();
        }
        break;
      case MessageType.Send:
        {
          this.messageSendListSubscription = this.messageApiService
            .retrieveSendMessage({
              userSeq: this.loginRes.userSeq,
              deviceType: DeviceType.PC,
              tokenKey: this.loginRes.tokenString,
              type: MessageType.Send,
              pageSize: this.defaultPageSize,
              pageCount: this.sendCurrentPage
            } as RetrieveRequest)
            .pipe(
              map(res => {
                console.log(res);
                if (res.responseCode === MessageStatusCode.Success) {
                  this.currentTotalCount = res.totalCount;
                  this.currentPage = res.pageCount;
                  this.sendCurrentPage = res.pageCount;
                  this.messageList = res.messageList;
                } else {
                }
              }),
              catchError(error => of(console.log(error)))
            )
            .subscribe();
        }
        break;
      case MessageType.Reservation:
        {
          this.messageSendListSubscription = this.messageApiService
            .retrieveReservationMessage({
              userSeq: this.loginRes.userSeq,
              deviceType: DeviceType.PC,
              tokenKey: this.loginRes.tokenString,
              type: MessageType.Reservation,
              pageSize: this.defaultPageSize,
              pageCount: this.reservationCurrentPage
            } as RetrieveRequest)
            .pipe(
              map(res => {
                console.log(res);
                if (res.responseCode === MessageStatusCode.Success) {
                  this.currentTotalCount = res.totalCount;
                  this.currentPage = res.pageCount;
                  this.reservationCurrentPage = res.pageCount;
                  this.messageList = res.messageList;
                } else {
                }
              }),
              catchError(error => of(console.log(error)))
            )
            .subscribe();
        }
        break;
    }
  }
}
