<template>
  <div class="live">
    <!--顶部-->
    <div class="live-top">
      <div class="live-title">
        <div class="live-title-name">{{ roomInfo.cs_item_name }} {{ roomInfo.task_name }}</div>
        <div>
          <el-button @click="exitRoom">退出房间</el-button>
        </div>
      </div>
      <div class="live-course-name">{{ roomInfo.course_name }}</div>
      <div class="live-teacher">
        <span class="live-teacher-name">
          <svg-icon icon-class="person" />{{ roomInfo.teacher_name }}
        </span>
        <span><svg-icon icon-class="people" />{{ roomInfo.student_count }}</span>
      </div>
    </div>
    <!-- 主容器 -->
    <div class="live-container">
      <!-- 左侧 -->
      <div class="live-container-left">
        <div v-show="callLoading" class="loading">
          <div class="loading-wrapper">
            <el-avatar icon="el-icon-user" :src="roomInfo.teacher_image_url" />
            <p class="loading-title">{{ roomInfo.teacher_name }}邀请您连线中</p>
            <div>
              <el-button type="success" icon="el-icon-phone-outline" circle @click="inviteAccept" />
            </div>
          </div>
        </div>
        <div v-show="connect" class="student-parent">
          <div v-show="roomInfo.video_mode === 1 || remoteStreamType === 1" id="student"></div>

          <template v-if="remoteStreamType !== 1">
            <template v-if="roomInfo.video_mode === 1">
              <el-button v-show="invite" type="danger" @click="handsDown">
                <svg-icon icon-class="hang-up" /> 挂断
              </el-button>
            </template>
            <template v-else>
              <div class="student-audio">
                <el-avatar
                  icon="el-icon-user"
                  :src="invite ? roomInfo.teacher_image_url : connectStudent.student_image_url"
                />
                <span class="connect-name">
                  {{ invite ? roomInfo.teacher_name : connectStudent.student_name }}
                </span>
                <el-button v-show="invite" type="danger" circle @click="handsDown">
                  <svg-icon icon-class="hang-up" />
                </el-button>
              </div>
            </template>
          </template>
        </div>
        <div v-show="isDraw" id="draw-parent"></div>
        <div class="button-group">
          <div class="button-group-left"></div>
          <div class="button-group-right"></div>
        </div>
        <div class="live-container-left-chat">
          <div class="chat-top">
            <span>聊天</span>
          </div>
          <div class="chat-window">
            <ul class="chat-window-ul">
              <li v-for="(item, i) in chatList" :key="i">
                <div class="msg-normal">
                  <span>{{ item.username }}: </span>
                  <span>{{ item.msg }}</span>
                </div>
              </li>
            </ul>
          </div>
          <div class="chat-speak">
            <el-input
              v-model="msg"
              placeholder="输入发言"
              maxlength="400"
              @keydown.enter.native="sendMsg"
            >
              <el-button slot="append" @click="sendMsg">发送</el-button>
            </el-input>
          </div>
        </div>
      </div>
      <!-- 右侧 -->
      <div class="live-container-right">
        <div
          class="live-teacher-lens"
          @mouseover="liveMenuShow = true"
          @mouseout="liveMenuShow = false"
        >
          <div id="live"></div>
          <div :style="{ bottom: liveMenuShow ? '0' : '-40px' }" class="live-wrapper">
            <div>
              {{ roomInfo.teacher_name }}
            </div>
            <div></div>
          </div>
        </div>
        <div class="student-list">
          <div class="student-list-title">学生列表</div>
          <ul>
            <li v-for="item in student_list" :key="item.room_user_id">
              <div class="student-list-left">
                <el-avatar icon="el-icon-user" size="small" :src="item.student_image_url" />
                <span class="name">{{ item.student_name }}</span>
              </div>
            </li>
          </ul>
        </div>
      </div>
    </div>

    <!-- 学员当前推送资料 -->
    <cur-material
      :task-id="task_id"
      :dialog-visible-material="dialogVisibleMaterial"
      :material-id="material_id"
      :material-name="material_name"
      :material-type="material_type"
      :material-picture-url="material_picture_url"
      @dialogMaterialClose="dialogMaterialClose"
    />
  </div>
</template>

<script>
import {
  GetLiveRoomStudentList,
  StudentExitLiveRoom,
  GetCurMaterialSent,
  GetLiveRoomInfo,
  GetGroupStatus,
  GetMyGroupInfo_Student
} from '@/api/live';
import CurMaterial from '@/components/live/CurMaterial.vue';
import * as common from './live';

export default {
  name: 'Live',
  components: {
    CurMaterial
  },
  data() {
    return {
      task_id: this.$route.query.task_id,
      room_user_id: this.$route.query.room_user_id,
      // 已连接
      connect: false,
      invite: false,
      connectStudent: '',
      // 等待接通
      callLoading: false,
      dialogVisibleMaterial: false,
      // 资料信息
      material_id: '',
      material_name: '',
      material_type: '',
      material_picture_url: '',
      // 定时器
      timer: null,
      timer_group: null,
      remoteStreamType: -1,
      rtc: null,
      roomData: {
        desc: '直播间标题',
        name: '姓名',
        user: {
          id: '',
          name: '',
          role: 'talker',
          rommid: ''
        },
        max_users: 1,
        allow_chat: true,
        allow_audio: true,
        allow_speak: true
      },
      roomInfo: {
        room_id: '',
        video_mode: 1,
        task_name: '',
        cs_item_name: '',
        course_name: '',
        teacher_name: '',
        student_count: 0,
        teacher_image_url: ''
      },
      loadedNumber: 0,
      speakData: {},
      roomContext: {},
      msg: '',
      chatList: [],
      // 直播间学员列表
      student_list: [],
      // 直播状态
      liveStat: false,
      liveMenuShow: false
    };
  },
  computed: {
    // 画板模式
    isDraw() {
      return !this.connect && !this.callLoading;
    }
  },
  watch: {
    loadedNumber(newVal) {
      if (newVal === 5) {
        common.createScript(
          'https://class.csslcloud.net/static/SDK/docSDK/drawSdk_3.0.js'
        ).onload = () => {
          const { live_room_sys_user_id, room_id, session_id } = this.$route.query;
          this.rtc = common.initSDK({
            userid: live_room_sys_user_id,
            roomid: room_id,
            sessionid: session_id
          });
          common.initListener(this); // 注册监听事件
          this.getLiveStat();
          this.$loading().close();
        };
      }
    }
  },
  created() {
    GetGroupStatus({ task_id: this.task_id }).then(({ is_enable_group }) => {
      if (is_enable_group === 'true') {
        this.getMyGroupInfo_Student();
      } else {
        this.$loading({
          text: '加载直播所需SDK中...',
          background: '#fff'
        });
        common.downloadWebSDK(this);
        this.getLiveRoomStudentList();
        this.getLiveRoomInfo();
      }
    });
  },
  mounted() {
    this.getCurMaterialSent();
    this.getLiveRoomStudentListPolling();
    this.GetGroupStatus();
  },
  beforeDestroy() {
    // 清除所有定时器
    // let end = setInterval(() => {}, 1000);
    // for (let i = 1; i <= end; i++) {
    //   clearInterval(i);
    // }
    clearInterval(this.timer);
    clearInterval(this.timer_group);
    StudentExitLiveRoom({ task_id: this.task_id, room_user_id: this.room_user_id });
    if (this.callLoading || this.connect) {
      this.handsDown();
    }
  },
  methods: {
    getLiveRoomInfo() {
      GetLiveRoomInfo({ task_id: this.task_id }).then(
        ({
          room_id,
          video_mode,
          task_name,
          cs_item_name,
          course_name,
          teacher_name,
          student_count,
          teacher_image_url
        }) => {
          this.roomInfo = {
            room_id,
            video_mode,
            task_name,
            cs_item_name,
            course_name,
            teacher_name,
            student_count,
            teacher_image_url
          };
        }
      );
    },

    exitRoom() {
      StudentExitLiveRoom({ task_id: this.task_id, room_user_id: this.room_user_id }).then(() => {
        this.$router.push('/');
      });
    },

    getLiveStat() {
      common.getLiveStat({
        success: data => {
          this.liveStat = data.started;
        },
        fail: str => {
          this.liveStat = false;
          console.log('直播关闭状态或查询直播失败', str);
        }
      });
    },

    // 下麦
    handsDown() {
      common.handsDown({
        uid: this.room_user_id,
        success: str => {
          this.callLoading = false;
          console.log('下麦成功', str);
          this.$message.success('下麦成功');
        },
        fail: data => {
          this.connect = false;
          this.callLoading = false;
          console.log('下麦失败', data);
        }
      });
    },

    // 发消息
    sendMsg() {
      common.sendMsg(this.msg);
      this.msg = '';
    },

    getDevice() {
      common.getDevice();
    },

    inviteAccept() {
      common.inviteAccept({
        success: str => {
          console.log('接受邀请成功', str);
        },
        fail: data => {
          console.log('接受邀请失败', data);
          this.$message.warning(`接受邀请失败 ${data.errorMsg}`);
          this.callLoading = false;
        }
      });
    },

    getLiveRoomStudentList() {
      GetLiveRoomStudentList({ task_id: this.task_id }).then(({ student_list }) => {
        this.student_list = student_list;
      });
    },

    getLiveRoomStudentListPolling() {
      this.timer = setInterval(() => {
        this.getLiveRoomStudentList();
      }, 5000);
    },

    // 分组讨论
    GetGroupStatus() {
      this.timer_group = setInterval(() => {
        GetGroupStatus({ task_id: this.task_id })
          .then(({ is_enable_group }) => {
            if (is_enable_group === 'true') {
              clearInterval(this.timer_group);
              this.getMyGroupInfo_Student();
            }
          })
          .catch(() => {
            clearInterval(this.timer_group);
          });
      }, 5000);
    },

    getMyGroupInfo_Student() {
      GetMyGroupInfo_Student({
        task_id: this.task_id
      }).then(({ live_room_sys_user_id, room_id, student_list }) => {
        let data = student_list.find(el => {
          return el.is_self === 'true';
        });
        this.$router.push({
          path: '/live/student/group',
          query: {
            task_id: this.task_id,
            live_room_sys_user_id,
            room_id,
            sessionid: data.session_id
          }
        });
      });
    },

    // 弹出框方法
    dialogMaterialClose() {
      this.dialogVisibleMaterial = false;
      this.getCurMaterialSent();
    },

    getCurMaterialSent() {
      const timer = setInterval(() => {
        GetCurMaterialSent({ task_id: this.task_id })
          .then(({ material_id, material_name, material_type, material_picture_url }) => {
            if (material_id !== undefined && material_id.length > 0) {
              this.dialogVisibleMaterial = true;
              this.material_id = material_id;
              this.material_name = material_name;
              this.material_type = material_type;
              this.material_picture_url = material_picture_url;
              clearInterval(timer);
            }
          })
          .catch(() => {
            clearInterval(timer);
          });
      }, 2000);
    }
  }
};
</script>

<style lang="scss">
@import '~@/styles/mixin.scss';
$live-bc: #3d3938;

.live {
  @include container;

  // 顶部
  &-top {
    background-color: #fff;
    padding: 24px 32px;
    border-top-left-radius: 8px;
    border-top-right-radius: 8px;

    .live-title {
      display: flex;
      justify-content: space-between;

      &-name {
        font-size: 22px;
      }

      .el-button {
        border-radius: 4px;
        padding: 7px 12px;
      }
    }

    .live-course-name {
      font-size: 14px;
      color: #737373;
      line-height: 30px;
    }

    .live-teacher {
      margin-top: 12px;

      .svg-icon {
        margin-right: 8px;
      }

      &-name {
        margin-right: 60px;
      }
    }
  }

  // 主容器
  &-container {
    display: flex;
    justify-content: left;

    &-left {
      width: 832px;
      background-color: #fff;
      border-radius: 8px;

      // 等待接通
      .loading {
        position: relative;
        width: 100%;
        height: 468px;
        color: #fff;
        background-color: #646464;
        display: flex;
        justify-content: center;
        align-items: center;

        &-wrapper {
          text-align: center;

          > .el-avatar {
            width: 96px;
            height: 96px;
            line-height: 96px;

            &--icon {
              font-size: 36px;
            }
          }

          .loading-title {
            margin: 24px;
          }
        }
      }

      // 连线
      .student-parent {
        position: relative;
        width: 100%;
        height: 468px;

        #student {
          width: 100%;
          height: 468px;
          position: relative;
          background-color: $live-bc;
        }

        > .el-button {
          position: absolute;
          bottom: 40px;
          left: calc(50% - 44px);
        }

        .student-audio {
          width: 100%;
          height: 100%;
          background-color: #646464;
          display: flex;
          flex-direction: column;
          justify-content: center;
          align-items: center;

          .connect-name {
            color: #fff;
            margin: 24px 0;
          }

          > .el-avatar {
            width: 96px;
            height: 96px;
            line-height: 96px;

            &--icon {
              font-size: 36px;
            }
          }
        }
      }

      // 分组讨论
      .group {
        width: 100%;
        height: 468px;
        position: relative;
        background-color: $live-bc;
        overflow: hidden;
      }

      // 画板
      #draw-parent {
        width: 100%;
        height: 468px;
        position: relative;
        background-color: $live-bc;
        overflow: hidden;

        // 设置屏幕画笔
        .draw-setting {
          position: absolute;
          bottom: 13px;
          left: 22px;
          z-index: 9999;
          background-color: #a0a0a0;
          padding: 6px;
          border-radius: 40px;
          height: 40px;
          width: 275px;
          line-height: 28px;

          & > span {
            display: inline-block;
            text-align: center;
            margin-right: 10px;
          }

          & > span.brush-shape {
            width: 28px;
            height: 28px;
            border-radius: 50%;
            background-color: #fff;
            cursor: pointer;
          }

          .draw-color {
            position: relative;
            top: 5px;
            height: 18px;
            width: 18px;
            border-radius: 50%;
            cursor: pointer;
          }

          .current::after {
            content: '';
            position: absolute;
            bottom: -7px;
            left: 7px;
            width: 4px;
            height: 4px;
            border-radius: 50%;
            background-color: #292929;
          }

          .draw-thickness {
            height: 18px;
            width: 18px;
            cursor: pointer;
            display: inline-flex;
            flex-direction: column;
            justify-content: center;
            vertical-align: middle;
            align-items: center;

            > span {
              border-radius: 50%;
              background-color: #000;
            }
          }

          & > .brush-clear {
            width: 28px;
            height: 28px;
            border-radius: 50%;
            background-color: #666;
            cursor: pointer;
            margin-right: 0;
          }
        }
      }

      .button-group {
        display: flex;
        justify-content: space-between;
        height: 48px;
        background-color: #4d4d4d;
        padding: 0 15px;
        border-bottom-left-radius: 5px;

        .svg-icon {
          font-size: 20px;
        }

        &-left {
          > span {
            display: inline-block;
            height: 100%;
            padding: 14px 16px;
            cursor: pointer;

            &:active,
            &:hover {
              background-color: #3d3d3d;
            }
          }
        }
      }

      // 聊天窗口
      &-chat {
        height: 278px;
        border: 1px solid #ccc;
        border-bottom-left-radius: 8px;
        display: flex;
        flex-direction: column;
        justify-content: space-between;

        .chat-top {
          display: flex;
          justify-content: space-between;
          padding: 15px 15px 10px;
          border-bottom: 1px solid #e6e6e6;
          color: #959595;

          label {
            cursor: pointer;
          }

          .allow-chat {
            margin-right: 12px;
          }
        }

        .chat-window {
          position: relative;
          width: 100%;
          height: 100%;
          overflow: hidden;

          &-ul {
            position: absolute;
            top: 0;
            left: 0;
            width: 100%;
            height: 100%;
            overflow: auto;

            .msg-normal {
              padding: 7px 16px;
            }
          }
        }

        .chat-speak {
          padding: 16px;
        }
      }
    }

    &-right {
      padding: 8px;
      background-color: #2c2c2c;
      border-end-end-radius: 8px;

      .live-teacher-lens {
        position: relative;
        overflow: hidden;

        #live {
          width: 352px;
          height: 198px;
          background-color: $live-bc;
        }

        .live-wrapper {
          position: absolute;
          height: 40px;
          width: 100%;
          background-color: #000;
          opacity: 0.7;
          color: #fff;
          line-height: 40px;
          padding: 0 16px;
          transition: all 300ms ease-in 0s;
        }
      }

      .student-list {
        width: 100%;
        padding: 24px 16px;
        margin-top: 2px;
        height: calc(100% - 200px);
        background-color: #2c2c2c;
        font-size: 14px;
        color: #fff;

        &-title {
          margin-bottom: 16px;
        }

        li {
          display: flex;
          margin-bottom: 16px;

          .student-list-left {
            flex: 7;

            .name {
              vertical-align: super;
              margin-left: 8px;
            }
          }

          .student-list-right {
            flex: 3;

            .svg-icon {
              font-size: 18px;
              cursor: pointer;
              margin-top: 7px;
              margin-right: 8px;
            }
          }
        }
      }
    }
  }
}
</style>
