package com.dora.service.impl;

import com.dora.entity.Course;
import com.dora.entity.CourseChapter;
import com.dora.entity.CourseVideo;
import com.dora.entity.User;
import com.dora.entity.Video;
import com.dora.mapper.CourseMapper;
import com.dora.mapper.CourseChapterMapper;
import com.dora.mapper.CourseVideoMapper;
import com.dora.mapper.UserMapper;
import com.dora.mapper.VideoMapper;
import com.dora.service.VideoPermissionService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

/**
 * 视频权限检查服务实现类
 */
@Service
@RequiredArgsConstructor
@Slf4j
public class VideoPermissionServiceImpl implements VideoPermissionService {

    private final UserMapper userMapper;
    private final VideoMapper videoMapper;
    private final CourseMapper courseMapper;
    private final CourseChapterMapper courseChapterMapper;
    private final CourseVideoMapper courseVideoMapper;

    @Override
    public boolean hasVideoAccessPermission(Long userId, String videoId, Long courseId, Long chapterId) {
        // 如果是课程视频，检查课程权限
        if (courseId != null && chapterId != null) {
            return hasCourseVideoPermission(userId, courseId, chapterId);
        }
        
        // 如果是普通视频，检查普通视频权限
        return hasGeneralVideoPermission(userId, videoId);
    }

    @Override
    public boolean hasCourseVideoPermission(Long userId, Long courseId, Long chapterId) {
        try {
            // 获取用户信息
            User user = userMapper.selectById(userId);
            if (user == null) {
                log.warn("用户不存在: {}", userId);
                return false;
            }

            // 获取课程信息
            Course course = courseMapper.selectById(courseId);
            if (course == null) {
                log.warn("课程不存在: {}", courseId);
                return false;
            }

            // 检查课程审核状态
            if (course.getAuditStatus() != 1) {
                log.warn("课程未通过审核: {}", courseId);
                return false;
            }

            // 检查章节是否存在（这里简化处理，实际应该查询章节表）
            // TODO: 添加章节查询逻辑
            log.info("章节权限检查: chapterId={}, courseId={}", chapterId, courseId);

            // 管理员可以访问所有课程
            if (user.getRole() >= 3) { // 管理员角色
                log.info("管理员用户访问课程视频: userId={}, courseId={}", userId, courseId);
                return true;
            }

            // 检查用户角色是否满足课程要求
            if (user.getRole() < course.getLevel()) {
                log.warn("用户角色不满足课程要求: userId={}, userRole={}, courseLevel={}", 
                    userId, user.getRole(), course.getLevel());
                return false;
            }

            // 如果是付费课程，检查用户是否已购买（这里可以扩展购买逻辑）
            if (course.getIsFree() == 0 && course.getPrice().compareTo(java.math.BigDecimal.ZERO) > 0) {
                // TODO: 检查用户是否已购买该课程
                // 这里可以添加订单检查逻辑
                log.info("付费课程权限检查: userId={}, courseId={}", userId, courseId);
            }

            log.info("用户通过课程视频权限检查: userId={}, courseId={}, chapterId={}", userId, courseId, chapterId);
            return true;

        } catch (Exception e) {
            log.error("检查课程视频权限时发生错误: userId={}, courseId={}, chapterId={}", userId, courseId, chapterId, e);
            return false;
        }
    }

    @Override
    public boolean hasGeneralVideoPermission(Long userId, String videoId) {
        try {
            // 获取用户信息
            User user = userMapper.selectById(userId);
            if (user == null) {
                log.warn("用户不存在: {}", userId);
                return false;
            }

            // 获取视频信息
            Video video = videoMapper.selectByVodVideoId(videoId);
            if (video == null) {
                log.warn("视频不存在: {}", videoId);
                return false;
            }

            // 检查视频审核状态
            if (video.getAuditStatus() != 1) {
                log.warn("视频未通过审核: {}", videoId);
                return false;
            }

            // 管理员可以访问所有视频
            if (user.getRole() >= 3) { // 管理员角色
                log.info("管理员用户访问视频: userId={}, videoId={}", userId, videoId);
                return true;
            }

            // 检查视频是否公开
            if (video.getIsPublic() == 0) {
                // 如果不是公开视频，只有创建者可以访问
                if (!video.getOwnerId().equals(userId)) {
                    log.warn("用户无权访问私有视频: userId={}, videoId={}, ownerId={}", 
                        userId, videoId, video.getOwnerId());
                    return false;
                }
            }

            log.info("用户通过普通视频权限检查: userId={}, videoId={}", userId, videoId);
            return true;

        } catch (Exception e) {
            log.error("检查普通视频权限时发生错误: userId={}, videoId={}", userId, videoId, e);
            return false;
        }
    }
}
