import { message, ConfigProvider, Progress } from 'antd';
import { useEffect, useState, useContext, useRef, useImperativeHandle } from 'react';
import TestVideo from '../index';
import classNames from 'classnames';
import Empty from '@wisdom-components/empty';
import empty_icon from '../assets/缺省页.png';
import { videoPlayback, newPlayback } from '../apis';
import './index.less';
import moment from 'moment';
import TimeSlider from './TimeSlider';

const RecVideo = (props, ref) => {
  const { getPrefixCls } = useContext(ConfigProvider.ConfigContext);
  const prefixCls = getPrefixCls('rec-video-view');

  const { VideoInfo, JessibucaObj, ProgressBar, EmptyIcon = '', } = props;
  const jessibuca = useRef(null);
  const [hoursRuler, setHoursRuler] = useState(VideoInfo.hoursRuler || 24);
  const [showId, setShowId] = useState(null); //视频ID
  const [peridos, setPeridos] = useState([]); //可播放视频时间段
  const [playTimestamp, setPlayTimestamp] = useState(null); //当前正在播放时间段
  const [minTimestamp, setMinTimestamp] = useState(null); //时间轴最小时间
  const [maxTimestamp, setMaxTimestamp] = useState(null); //时间轴最大时间
  const [loading, setLoading] = useState(true);
  const [percent, setPercent] = useState(0);
  const timeRef = useRef(null);

  useEffect(() => {
    changeReplayCfg();
  }, [props.VideoInfo]);

  useEffect(() => {
    let current = percent;
    if (loading)
      timeRef.current = setInterval(() => {
        current = current + 1;
        setPercent(current > 99 ? 99 : current);
      }, 20);

    return () => {
      if (timeRef.current) {
        clearInterval(timeRef.current);
        timeRef.current = null;
        setPercent(0);
      }
    };
  }, [loading]);

  useImperativeHandle(ref, () => {
    // changeVal 就是暴露给父组件的方法, newVal是父组件传递的参数
    return jessibuca.current; // _video&& _video.current&&_video.current.jessibuca
  });

  useEffect(() => {
    const { endTime = moment().format('YYYY-MM-DD 23:59:59') } = VideoInfo;
    const edTimes = moment(endTime).format('YYYY-MM-DD HH:mm:ss');
    if (playTimestamp) {
      let momentObj = moment(playTimestamp);
      let formattedTime = momentObj.format('YYYY-MM-DD HH:mm:ss');
      const edDates = moment(edTimes).format('YYYY-MM-DD HH:mm:ss');
      const params = {
        id: VideoInfo.id,
        force: 1,
        startTime: formattedTime,
        endTime: edDates,
        'site-code':
          window?.globalConfig?.userInfo?.LocalSite || window?.globalConfig?.userInfo?.site || '',
      };
      rePaly(params);
    }
  }, [playTimestamp]);

  const changeReplayCfg = () => {
    const {
      beginTime = moment().format('YYYY-MM-DD 00:00:00'),
      endTime = moment().format('YYYY-MM-DD 23:59:59'),
    } = VideoInfo;
    const hoursPerRuler = calculateHours(beginTime, endTime) || 24;
    const stTimes = moment(beginTime).format('YYYY-MM-DD HH:mm:ss');
    const edTimes = moment(endTime).format('YYYY-MM-DD HH:mm:ss');
    const param = {
      id: VideoInfo.id,
      force: 1,
      startTime: stTimes,
      endTime: edTimes,
      'site-code':
        window?.globalConfig?.userInfo?.LocalSite || window?.globalConfig?.userInfo?.site || '',
    };
    setHoursRuler(hoursPerRuler);
    setMinTimestamp(moment(stTimes).valueOf());
    setMaxTimestamp(moment(edTimes).valueOf());
    getVideoPlBack(param);
  };

  const getVideoPlBack = (param) => {
    setLoading(true);
    videoPlayback(param)
      .then((res) => {
        setLoading(false);
        if (res.code === 200) {
          setPeridos(
            res.data.peridos.map((times, i) => {
              let beginTime = moment(times.StartTime.replaceAll('T', ' ').replaceAll('Z', ' '));
              let endTime = moment(times.EndTime.replaceAll('T', ' ').replaceAll('Z', ' '));
              return {
                ...times,
                idx: i,
                beginTime: beginTime.valueOf(),
                endTime: endTime.valueOf(),
                style: { background: '#637DEC' },
              };
            }),
          );
          setShowId(res.data.url);
        } else {
          message.warn(res.msg);
          setShowId(null);
        }
      })
      .catch((error) => {
        setLoading(false);
      });
  };

  const rePaly = (params) => {
    newPlayback(params).then((res) => {
      if (res.code === 200) {
        setShowId(res.data);
      } else {
        message.warn(res.msg);
      }
    });
  };

  const calculateHours = (time1, time2) => {
    const date1 = new Date(time1);
    const date2 = new Date(time2);
    const diff = Math.abs(date1.getTime() - date2.getTime());
    return Math.ceil(diff / (1000 * 60 * 60));
  };

  return (
    <div className={classNames(prefixCls)}>
      {loading ? (
        <>
          <div className={classNames(`${prefixCls}-load`)}>
            <Progress
              className={classNames(`${prefixCls}-progress`)}
              strokeColor={ProgressBar?.strokeColor || ''}
              format={(percent) => {
                return (
                  <span style={{ color: ProgressBar?.textColor || 'unset' }}>{percent + '%'}</span>
                );
              }}
              strokeWidth={14}
              percent={percent}
            />
            <span style={{ color: ProgressBar?.textColor || 'unset' }}>
              视频回放信息获取中，请稍后...
            </span>
          </div>
        </>
      ) : showId ? (
        <>
          <div className={classNames(`${prefixCls}-video`)}>
            {showId && (
              <TestVideo
                VideoInfo={{ ...VideoInfo, id: showId, type: 'rec' }}
                JessibucaObj={{ ...JessibucaObj }}
                key={showId}
                ref={jessibuca}
              />
            )}
          </div>
          {/* 时间轴 */}
          <div className={classNames(`${prefixCls}-time`)}>
            {peridos.length ? (
              <TimeSlider
                minTimestamp={minTimestamp}
                key={JSON.stringify(peridos) + (hoursRuler || 24)}
                maxTimestamp={maxTimestamp}
                hoursPerRuler={hoursRuler || 24}
                playTimestamp={playTimestamp ? playTimestamp : peridos[0].beginTime}
                playTimestampChange={(time, recordInfo, playOffset) => {
                  if (recordInfo && playOffset) {
                    setPlayTimestamp(time);
                  } else {
                    message.warn('当前时间节点没有视频可以播放哦！');
                  }
                }}
                timecell={peridos}
              />
            ) : null}
          </div>
        </>
      ) : (
        <div className={classNames(`${prefixCls}-empty`)}>
          <Empty
            image={EmptyIcon || empty_icon}
            theme={'dark'}
            description={'咦~暂时没有查询到视频回放信息呢~'}
          />
        </div>
      )}
    </div>
  );
};

export default React.forwardRef(RecVideo);
