package com.fs.course.service.impl;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.fs.common.BeanCopyUtils;
import com.fs.common.core.domain.R;
import com.fs.common.core.domain.model.LoginUser;
import com.fs.common.exception.ServiceException;
import com.fs.common.utils.DateUtils;
import com.fs.course.domain.FsUserCourseVideo;
import com.fs.course.domain.FsVideoBarrage;
import com.fs.course.mapper.FsVideoBarrageMapper;
import com.fs.course.param.FsVideoBarrageQueryParam;
import com.fs.course.service.IFsUserCourseVideoService;
import com.fs.course.service.IFsVideoBarrageService;
import com.fs.course.vo.FsVideoBarrageExcelVo;
import com.fs.course.vo.FsVideoBarrageVO;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;

/**
 * 视频弹幕Service业务层处理
 *
 * @author fs
 * @date 2025-04-07
 */
@Service
@Slf4j
public class FsVideoBarrageServiceImpl extends ServiceImpl<FsVideoBarrageMapper, FsVideoBarrage> implements IFsVideoBarrageService {


    @Autowired
    private FsVideoBarrageMapper barrageMapper;
    @Autowired
    private IFsUserCourseVideoService courseVideoService;
    /**
     * 查询视频弹幕
     *
     * @param id 视频弹幕主键
     * @return 视频弹幕
     */
    @Override
    public FsVideoBarrage selectFsVideoBarrageById(String id)
    {
        return baseMapper.selectFsVideoBarrageById(id);
    }

    /**
     * 查询视频弹幕列表
     *
     * @param fsVideoBarrage 视频弹幕
     * @return 视频弹幕
     */
    @Override
    public List<FsVideoBarrageVO> selectFsVideoBarrageList(FsVideoBarrageQueryParam fsVideoBarrage)
    {
        return baseMapper.selectFsVideoBarrageList(fsVideoBarrage);
    }

    /**
     * 新增视频弹幕
     *
     * @param fsVideoBarrage 视频弹幕
     * @return 结果
     */
    @Override
    public int insertFsVideoBarrage(FsVideoBarrage fsVideoBarrage)
    {
        FsUserCourseVideo fsUserCourseVideo = courseVideoService.selectFsUserCourseVideoByVideoId(fsVideoBarrage.getVideoId());
        if (null==fsUserCourseVideo.getDuration()||0>fsUserCourseVideo.getDuration()){
            throw new ServiceException("视频时长异常，请检查");
        }
        if (fsVideoBarrage.getTimePoint()>fsUserCourseVideo.getDuration()){
            throw new ServiceException("弹幕时间节点不能大于视频时长,视频时长："+fsUserCourseVideo.getDuration()+"秒");
        }
        fsVideoBarrage.setCreateTime(DateUtils.getNowDate());
        return baseMapper.insertFsVideoBarrage(fsVideoBarrage);
    }

    /**
     * 修改视频弹幕
     *
     * @param fsVideoBarrage 视频弹幕
     * @return 结果
     */
    @Override
    public int updateFsVideoBarrage(FsVideoBarrage fsVideoBarrage)
    {
        FsUserCourseVideo fsUserCourseVideo = courseVideoService.selectFsUserCourseVideoByVideoId(fsVideoBarrage.getVideoId());
        if (fsUserCourseVideo != null && fsUserCourseVideo.getDuration() != null){
            if (fsVideoBarrage.getTimePoint()>fsUserCourseVideo.getDuration()){
                throw new ServiceException("弹幕时间节点不能大于视频时长,视频时长："+fsUserCourseVideo.getDuration()+"秒");
            }
        }
        return baseMapper.updateFsVideoBarrage(fsVideoBarrage);
    }

    /**
     * 批量删除视频弹幕
     *
     * @param ids 需要删除的视频弹幕主键
     * @return 结果
     */
    @Override
    public int deleteFsVideoBarrageByIds(String[] ids)
    {
        return baseMapper.deleteFsVideoBarrageByIds(ids);
    }

    /**
     * 删除视频弹幕信息
     *
     * @param id 视频弹幕主键
     * @return 结果
     */
    @Override
    public int deleteFsVideoBarrageById(String id)
    {
        return baseMapper.deleteFsVideoBarrageById(id);
    }

    @Override
    public int saveBarrage(FsVideoBarrage barrage) {
        return barrageMapper.insertBarrage(barrage);
    }

    @Override
    public List<FsVideoBarrage> getBarrageByVideoId(Long videoId) {
        return barrageMapper.selectByVideoId(videoId);
    }

    @Override
    public List<FsVideoBarrage> getSegmentBarrage(Long videoId, int start, int end) {
        return barrageMapper.selectBySegment(videoId, start, end);
    }

    @Override
    public int updateStatus(FsVideoBarrage barrage) {
        return barrageMapper.updateStatus(barrage.getId(), barrage.getStatus());
    }

    @Override
    public int batchUpdateStatus(ArrayList ids, String status) {
        return barrageMapper.batchUpdateStatus(ids,status);
    }

    @Override
    public R importBarrageData(List<FsVideoBarrageExcelVo> list, boolean updateSupport, LoginUser loginUser) {
        if (com.fs.common.utils.StringUtils.isNull(list) || list.size() == 0)
        {
            throw new ServiceException("导入弹幕数据不能为空！");
        }
            for (FsVideoBarrageExcelVo barrageExcelVo : list) {
                try {
                FsVideoBarrage fsVideoBarrage = new FsVideoBarrage();
                BeanCopyUtils.copy(barrageExcelVo,fsVideoBarrage);
                fsVideoBarrage.setUserId(loginUser.getUserId());
                fsVideoBarrage.setUsername(loginUser.getUsername());
                fsVideoBarrage.setMode("scroll");
                barrageMapper.insertBarrage(fsVideoBarrage);
                log.info("复制到实体类:{}",fsVideoBarrage);
                }catch (Exception e){
                    throw new ServiceException("导入失败");
                }
            }
        return R.ok("导入成功");
    }

}
