import { defineComponent, onMounted, reactive, ref } from 'vue';
import styles from './index.module.less';
import {
  NBreadcrumb,
  NBreadcrumbItem,
  // NScrollbar,
  NSlider,
  NSpace,
  NSpin
} from 'naive-ui';
import icon_back from '../../xiaoku-music/images/icon_back.png';
// import icon_default from '../../xiaoku-music/images/icon_default.png';
// import icon_separator from '../../xiaoku-music/images/icon_separator.png';
import iconT from '../images/icon-t.png';
import iconAddT from '../images/icon-add-t.png';
import iconPlusT from '../images/icon-plus-t.png';
import {
  api_lessonCoursewareDetail_listKnowledge,
  api_lessonCoursewareKnowledgeDetail
} from '../api';
import TheEmpty from '/src/components/TheEmpty';
import { useRouter } from 'vue-router';
import { useSpeak } from '../useSpeak';

export default defineComponent({
  name: 'cotnent-knowledge',
  setup() {
    const router = useRouter();
    const show = ref(false);
    const content = ref(false);
    const speak = useSpeak();
    const musicContentRef = ref();
    const state = reactive({
      fontSize: 18,
      tableList: [] as any,
      selectKey: null,
      details: {} as any
    });

    const getDetails = async () => {
      show.value = true;
      content.value = true;
      try {
        const { data } = await api_lessonCoursewareDetail_listKnowledge({
          type: 'COURSEWARE'
        });

        state.tableList = data || [];
        if (state.tableList.length) {
          const item =
            state.tableList[0].lessonCoursewareDetailKnowledgeDetailList;
          state.tableList[0].selected = true;
          if (item && item.length) {
            const child = item[0];
            state.selectKey = child.id;
            await getDetail();
          }
        }
      } catch {
        //
      }
      content.value = false;
      show.value = false;
    };

    const getDetail = async () => {
      content.value = true;
      try {
        const { data } = await api_lessonCoursewareKnowledgeDetail({
          id: state.selectKey
        });
        // 使用 DOMParser 解析 HTML 字符串
        const parser = new DOMParser();
        const doc = parser.parseFromString(data.desc, 'text/html');

        const hasChilds = document.querySelectorAll('.only-child-select');
        if (hasChilds.length > 0) {
          hasChilds.forEach(child => {
            child.remove();
          });
        }

        const childNodes = doc.body.childNodes;
        childNodes?.forEach((node: any) => {
          node?.classList.add('only-child-select');
        });

        // 提取并分割 HTML 文档中的内容
        const result = document.createElement("div")
        result.classList.add("html-to-dom")
        result.appendChild(speak.processNode(doc.body))
        document
          .querySelector('#musicContent')
          ?.appendChild(result);
        state.details = data;
      } catch {
        //
      }
      content.value = false;
    };

    onMounted(() => {
      getDetails();
    });
    return () => (
      <div class={styles.container}>
        <NSpace align="center" wrapItem={false} size={16}>
          <img
            style={{ cursor: 'pointer' }}
            src={icon_back}
            class={styles.iconBack}
            onClick={() => {
              //
              router.push('/');
            }}
          />
          <NBreadcrumb separator="">
            <NBreadcrumbItem
              onClick={() => {
                //
              }}>
              乐理知识
            </NBreadcrumbItem>
          </NBreadcrumb>
        </NSpace>
        <div class={[styles.wrap]}>
          <div class={styles.content}>
            <div class={styles.contentWrap}>
              <div class={styles.directoryList}>
                <div
                  class={[
                    styles.scrollBar,
                    !show.value && state.tableList.length <= 0
                      ? styles.empty
                      : ''
                  ]}
                  style={{ minHeight: '100%' }}>
                  <NSpin show={show.value}>
                    <div class={[styles.listSection]}>
                      {state.tableList.map((item: any, index: number) => (
                        <div class={styles.treeParent} key={'parent' + index}>
                          <div
                            class={[styles.treeItem, styles.parentItem]}
                            onClick={() => {
                              state.tableList.forEach((child: any) => {
                                if (item.id !== child.id) {
                                  child.selected = false;
                                }
                              });
                              item.selected = item.selected ? false : true;
                            }}>
                            {item.lessonCoursewareDetailKnowledgeDetailList &&
                              item.lessonCoursewareDetailKnowledgeDetailList
                                .length > 0 && (
                                <span
                                  class={[
                                    styles.arrow,
                                    item.selected ? styles.arrowSelect : ''
                                  ]}></span>
                              )}
                            <p
                              class={[
                                styles.title,
                                item.selected ? styles.titleSelect : ''
                              ]}>
                              <span
                                class={[
                                  styles.dir,
                                  item.selected ? styles.dirSelect : ''
                                ]}></span>
                              {item.name}
                            </p>
                          </div>

                          {item.selected &&
                            item.lessonCoursewareDetailKnowledgeDetailList &&
                            item.lessonCoursewareDetailKnowledgeDetailList.map(
                              (child: any, j: number) => (
                                <div
                                  key={'child' + j}
                                  class={[
                                    styles.treeItem,
                                    styles.childItem,
                                    styles.animation,
                                    state.selectKey === child.id
                                      ? styles.childSelect
                                      : ''
                                  ]}
                                  onClick={() => {
                                    if (state.selectKey === child.id) return;
                                    state.selectKey = child.id;
                                    getDetail();
                                    speak.onCloseSpeak();
                                    musicContentRef.value.$el.scrollTo(0, 0);
                                  }}>
                                  <span class={styles.childArrow}></span>
                                  <p class={styles.title}>{child.name}</p>
                                </div>
                              )
                            )}
                        </div>
                      ))}
                    </div>
                  </NSpin>
                  {!show.value && state.tableList.length <= 0 && (
                    <TheEmpty style={{ height: '100%' }} />
                  )}
                </div>
              </div>

              <div class={styles.musicStaff}>
                <div class={styles.musicTitleRight}>
                  {speak.isSpeak.value ? (
                    <span class={styles.textClose} onClick={speak.onCloseSpeak}>
                      <i class={styles.icon}></i>关闭朗读
                    </span>
                  ) : (
                    <span class={styles.textRead} onClick={speak.onAllSpeak}>
                      <i class={styles.icon}></i>全文朗读
                    </span>
                  )}
                </div>
                <NSpin
                  show={content.value}
                  ref={musicContentRef}
                  class={
                    !content.value && !state.details?.desc ? styles.empty : ''
                  }>
                  <div
                    class={styles.musicContent}
                    id="musicContent"
                    style={{ fontSize: state.fontSize + 'px' }}>
                    {/* 选中的内容 */}
                    <div
                      id="selectionCouser"
                      class={[
                        styles.selectionCouser,
                        !speak.showDom.value && styles.hide
                      ]}>
                      <span
                        class={styles.textStart}
                        onClick={speak.onTextStart}>
                        开始朗读<i class={styles.icon}></i>
                      </span>
                      <span
                        class={styles.textReadOnly}
                        onClick={speak.onTextReadOnly}>
                        只读这段<i class={styles.icon}></i>
                      </span>
                    </div>
                  </div>
                  {!content.value && !state.details?.desc && <TheEmpty />}
                </NSpin>
              </div>

              <div class={styles.changeSizeSection}>
                <img src={iconT} class={styles.iconT} />
                <img
                  src={iconAddT}
                  class={styles.iconAddT}
                  onClick={() => {
                    if (state.fontSize >= 32) return;
                    state.fontSize += 1;
                  }}
                />
                <NSlider
                  v-model:value={state.fontSize}
                  vertical
                  min={12}
                  max={32}
                />
                <img
                  src={iconPlusT}
                  class={styles.iconPlusT}
                  onClick={() => {
                    if (state.fontSize <= 12) return;
                    state.fontSize -= 1;
                  }}
                />
              </div>
            </div>
          </div>
        </div>
      </div>
    );
  }
});
