<template>
  <Dialog
    :show="true"
    :isH5="!isPC"
    :isHeaderShow="false"
    :isFooterShow="false"
    :background="false"
    @update:show="closeCreated"
  >
    <div
      class="group"
      :class="[!isPC ? 'group-h5' : '']"
    >
      <div class="group-box">
        <header class="group-box-header">
          <Icon
            :file="isPC ? closeIcon : backIcon"
            class="icon-close"
            size="16px"
            @onClick="closeCreated"
          />
          <h1 class="group-box-header-title">
            {{ headerTitle }}
          </h1>
        </header>
        <ul
          v-if="!groupInfo.isEdit"
          class="group-list"
        >
          <li class="group-list-item">
            <label class="group-list-item-label">{{ TUITranslateService.t('TUIGroup.群头像') }}</label>
            <Avatar :url="groupInfo.profile.avatar" />
          </li>
          <ul>
            <li
              v-for="(item, index) in createInfo"
              :key="index"
              class="group-list-item"
            >
              <label class="group-list-item-label">{{ item.name }}</label>
              <input
                v-if="isPC"
                v-model="groupInfo.profile[item.key]"
                type="text"
                :placeholder="item.placeholder"
              >
              <span
                v-else
                class="group-h5-list-item-content"
                @click="edit(item.key)"
              >
                <p class="content">{{ groupInfo.profile[item.key] }}</p>
                <Icon :file="rightIcon" />
              </span>
            </li>
            <li class="group-list-introduction">
              <div class="group-list-item">
                <label class="group-list-item-label">{{ TUITranslateService.t('TUIGroup.群类型') }}</label>
                <GroupIntroduction
                  v-if="isPC"
                  :groupType="groupInfo.profile.type"
                  @selectType="selected"
                />
                <span
                  v-else
                  class="group-h5-list-item-content"
                  @click="edit('type')"
                >
                  <p class="content">{{ groupTypeDetail.label }}</p>
                  <Icon :file="rightIcon" />
                </span>
              </div>
              <article
                v-if="!isPC"
                class="group-h5-list-item-introduction"
              >
                <label class="introduction-name">{{ groupTypeDetail.label }}:</label>
                <span class="introduction-detail">{{ groupTypeDetail.detail }}</span>
                <a
                  :href="documentLink.product.url"
                  target="view_window"
                >
                  {{ TUITranslateService.t(`TUIGroup.${groupTypeDetail.src}`) }}
                </a>
              </article>
            </li>
          </ul>
        </ul>
        <!-- Edit Group Name -->
        <div
          v-else
          class="group-list group-list-edit"
        >
          <input
            v-if="groupInfo.groupConfig.type === 'input'"
            v-model="groupInfo.groupConfig.value"
            class="group-name-input"
            type="text"
            :placeholder="TUITranslateService.t(`TUIGroup.${groupInfo.groupConfig.placeholder}`)"
          >
          <GroupIntroduction
            v-else
            class="group-introduction-list"
            :groupType="groupInfo.groupConfig.value"
            @selectType="selected"
          />
        </div>
        <footer class="group-profile-footer">
          <button
            v-if="isPC && !groupInfo.isEdit"
            class="btn-default"
            @click="closeCreated"
          >
            {{ TUITranslateService.t('TUIGroup.取消') }}
          </button>
          <button
            class="btn-submit"
            :disabled="submitDisabledStatus"
            @click="submit"
          >
            {{ TUITranslateService.t('TUIGroup.确认') }}
          </button>
        </footer>
      </div>
    </div>
  </Dialog>
</template>
<script lang="ts" setup>
import TUIChatEngine, {
  TUITranslateService,
  TUIGroupService,
  TUIStore,
  StoreName,
} from '@tencentcloud/chat-uikit-engine';
import { computed, reactive, watchEffect } from '../../../adapter-vue';
import documentLink from '../../../utils/documentLink';
import { isPC } from '../../../utils/env';
import Icon from '../../common/Icon.vue';
import backIcon from '../../../assets/icon/back.svg';
import closeIcon from '../../../assets/icon/icon-close.svg';
import rightIcon from '../../../assets/icon/right-icon.svg';
import GroupIntroduction from './group-introduction/index.vue';
import { groupIntroConfig, findGroupIntroConfig } from './group-introduction/config';
import Dialog from '../../common/Dialog/index.vue';
import { Toast, TOAST_TYPE } from '../../common/Toast/index';
import Avatar from '../../common/Avatar/index.vue';
import Server from '../server';
import { IUserProfile } from '../../../interface';
const TUIGroupServer = Server.getInstance();
const TUIConstants = TUIGroupServer.constants;

const groupInfo = reactive<any>({
  profile: {
    groupID: '',
    name: '',
    type: groupIntroConfig[0].type,
    avatar: groupIntroConfig[0].icon,
    introduction: '',
    notification: '',
    // joinOption: '',
    memberList: [],
    isSupportTopic: false,
  },
  groupConfig: {
    title: '',
    value: '',
    key: '',
    type: '',
    placeholder: '',
  },
  isEdit: false,
});

watchEffect(() => {
  const params = TUIGroupServer.getOnCallParams(TUIConstants.TUIGroup.SERVICE.METHOD.CREATE_GROUP);
  groupInfo.profile.memberList = params.memberList;
  groupInfo.groupConfig.title = params.title;
});

const groupTypeDetail = computed(() => {
  return findGroupIntroConfig(groupInfo.profile.type);
});

const headerTitle = computed(() => {
  let name = '添加群聊';
  if (groupInfo.isEdit) {
    name = groupInfo.groupConfig.title;
  }
  return TUITranslateService.t(`TUIGroup.${name}`);
});

const createInfo = computed(() => {
  const groupNameInput = {
    name: TUITranslateService.t('TUIGroup.群名称'),
    key: 'name',
    placeholder: TUITranslateService.t('TUIGroup.请输入群名称'),
  };
  const groupIDInput = {
    name: `${TUITranslateService.t('TUIGroup.群ID')}(${TUITranslateService.t('TUIGroup.选填')})`,
    key: 'groupID',
    placeholder: TUITranslateService.t('TUIGroup.请输入群ID'),
  };
  return groupInfo.profile.type === TUIChatEngine.TYPES.GRP_COMMUNITY
    ? [groupNameInput]
    : [groupNameInput, groupIDInput];
});

const submitDisabledStatus = computed(() => {
  return groupInfo.profile.name === '' && !groupInfo.isEdit;
});

const selected = (type: any) => {
  if (groupInfo.profile.type !== type) {
    groupInfo.profile.type = type;
    groupInfo.profile.avatar = findGroupIntroConfig(type).icon;
    if (groupInfo.isEdit) {
      groupInfo.groupConfig.value = type;
    }
  }
};

const createGroup = async (options: any) => {
  try {
    options.memberList = options.memberList.map((item: IUserProfile) => {
      return { userID: item.userID };
    });
    if (options.type === TUIChatEngine.TYPES.GRP_COMMUNITY) {
      delete options.groupID;
    }
    const res = await TUIGroupService.createGroup(options);
    const { type } = res.data.group;
    if (type === TUIChatEngine.TYPES.GRP_AVCHATROOM) {
      await TUIGroupService.joinGroup({
        groupID: res.data.group.groupID,
        applyMessage: '',
      });
    }
    handleCompleteCreate(res.data.group);
    Toast({
      message: TUITranslateService.t('TUIGroup.群组创建成功'),
      type: TOAST_TYPE.SUCCESS,
    });
  } catch (err: any) {
    Toast({
      message: err.message,
      type: TOAST_TYPE.ERROR,
    });
  }
};

const submit = () => {
  const { profile } = groupInfo;
  if (groupInfo.isEdit) {
    groupInfo.profile[groupInfo.groupConfig.key] = groupInfo.groupConfig.value;
    return groupInfo.isEdit = !groupInfo.isEdit;
  } else {
    createGroup(profile);
  }
};

const closeCreated = () => {
  if (groupInfo.isEdit) {
    return groupInfo.isEdit = !groupInfo.isEdit;
  }
  handleCompleteCreate(null);
};

const edit = (label: string) => {
  groupInfo.isEdit = !groupInfo.isEdit;
  groupInfo.groupConfig.key = label;
  groupInfo.groupConfig.value = (groupInfo.profile as any)[label];
  switch (label) {
    case 'name':
      groupInfo.groupConfig.title = '设置群名称';
      groupInfo.groupConfig.placeholder = '请输入群名称';
      groupInfo.groupConfig.type = 'input';
      break;
    case 'groupID':
      groupInfo.groupConfig.title = '设置群ID';
      groupInfo.groupConfig.placeholder = '请输入群ID';
      groupInfo.groupConfig.type = 'input';
      break;
    case 'type':
      groupInfo.groupConfig.title = '选择群类型';
      groupInfo.groupConfig.type = 'select';
      break;
  }
};

const handleCompleteCreate = (group: any) => {
  TUIStore.update(StoreName.GRP, 'isShowCreateComponent', false);
  const callback = TUIGroupServer.getOnCallCallback(TUIConstants.TUIGroup.SERVICE.METHOD.CREATE_GROUP);
  callback && callback(group);
};

</script>
<style lang="scss" scoped src="./style/index.scss"></style>