package com.ibeetl.jlw.service;


import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.jlw.aliPay.utils.StringUtils;
import com.ibeetl.admin.core.service.CoreBaseService;
import com.ibeetl.jlw.dao.CourseInfoDao;
import com.ibeetl.jlw.dao.ResourcesInfoDao;
import com.ibeetl.jlw.entity.CourseInfo;
import com.ibeetl.jlw.entity.ResourcesInfo;
import com.ibeetl.jlw.web.query.ResourcesInfoQuery;
import org.beetl.sql.core.SqlId;
import org.beetl.sql.core.engine.PageQuery;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

import static cn.jlw.util.ConvertM3U8.booleanMap;

/**
 * ResourcesInfo Service
 */

@Service
@Transactional
public class ResourcesInfoService extends CoreBaseService<ResourcesInfo>{

    @Autowired private ResourcesInfoDao resourcesInfoDao;

    @Autowired private CourseInfoService courseInfoService;

    @Autowired private CourseInfoDao courseInfoDao;

    public PageQuery<ResourcesInfo>queryByCondition(PageQuery query){
        PageQuery ret =  resourcesInfoDao.queryByCondition(query);
        queryListAfter(ret.getList());

        List<ResourcesInfo> resourcesInfoList = ret.getList();
        for(int i=0;i<resourcesInfoList.size();i++){
            List<CourseInfo> courseInfoList = new ArrayList<>();

            Long courseInfoId = resourcesInfoList.get(i).getCourseInfoId();
            CourseInfo c = courseInfoService.queryById(courseInfoId);
            if(null != c){
                if(!((Integer)1).equals(c.getCourseInfoType())){
                    courseInfoId = c.getCourseInfoParentId();
                    for(int j=0;j<25;j++){
                        CourseInfo courseInfoParent = courseInfoService.queryById(courseInfoId);
                        courseInfoList.add(courseInfoParent);
                        if(((Integer)1).equals(courseInfoParent.getCourseInfoType())){
                            break;
                        }else {
                            courseInfoId = courseInfoParent.getCourseInfoParentId();
                        }
                    }
                }
            }

            if(courseInfoList.size() >= 2){
                resourcesInfoList.get(i).set("courseInfoParentId",courseInfoList.get(courseInfoList.size()-2).getCourseInfoId());
                resourcesInfoList.get(i).set("courseInfoParentName",courseInfoList.get(courseInfoList.size()-2).getCourseInfoName());
                resourcesInfoList.get(i).set("courseInfoParentParentId",courseInfoList.get(courseInfoList.size()-1).getCourseInfoId());
                resourcesInfoList.get(i).set("courseInfoParentParentName",courseInfoList.get(courseInfoList.size()-1).getCourseInfoName());
            }else {
                resourcesInfoList.get(i).set("courseInfoParentId",null);
                resourcesInfoList.get(i).set("courseInfoParentName",null);
                resourcesInfoList.get(i).set("courseInfoParentParentId",null);
                resourcesInfoList.get(i).set("courseInfoParentParentName",null);
            }
        }

        return ret;
    }

    public ResourcesInfo getById(Long resourcesInfoId){
        ResourcesInfo resourcesInfo = queryById(resourcesInfoId);
        if(null != resourcesInfo){
            try {
                String path = resourcesInfo.getResourcesInfoContent().replace("\\","/");
                String fileName = path.substring(path.lastIndexOf("/") + 1);
                String formatSpot = fileName.substring(fileName.lastIndexOf("."));

                System.out.println(path);
                path = path
                        .replace("/filesystem/temp/", "/filesystem/temp/" + fileName.replace(formatSpot, "") + "/")
                        .replace("server/", "")
                        .replace(formatSpot, ".m3u8");
                System.out.println(path);

                Boolean flag = booleanMap.get(fileName.replace(formatSpot, ""));
                if (null == flag) {
                    flag = false;
                }
                if(flag){
                    resourcesInfo.setResourcesInfoContent(path);
                }
            }catch (Exception e){
                e.printStackTrace();
            }
        }
        return resourcesInfo;
    }

    public void deleteResourcesInfo(String ids){
        for(int i=0;i<ids.split(",").length;i++){
            ResourcesInfo oldResourcesInfo = queryById(Long.parseLong(ids.split(",")[i]));
            CourseInfo oldCourseInfo = courseInfoDao.single(oldResourcesInfo.getCourseInfoId());
            if(null != oldCourseInfo){
                //资源类型(1视频 2课件 3附件)
                if(((Integer)1).equals(oldResourcesInfo.getResourcesInfoType())){
                    CourseInfo c = new CourseInfo();
                    c.setCourseInfoId(oldCourseInfo.getCourseInfoId());
                    c.setCourseVideoId(null != oldCourseInfo.getCourseVideoId() && oldCourseInfo.getCourseVideoId().equals(oldResourcesInfo.getResourcesInfoId())?null:oldCourseInfo.getCourseVideoId());
                    courseInfoDao.updateVideoIdById(c);
                }else if(((Integer)2).equals(oldResourcesInfo.getResourcesInfoType())){
                    CourseInfo c = new CourseInfo();
                    c.setCourseInfoId(oldCourseInfo.getCourseInfoId());
                    c.setCourseCoursewareId(null != oldCourseInfo.getCourseCoursewareId() && oldCourseInfo.getCourseCoursewareId().equals(oldResourcesInfo.getResourcesInfoId())?null:oldCourseInfo.getCourseCoursewareId());
                    courseInfoDao.updateCoursewareIdById(c);
                }else if(((Integer)3).equals(oldResourcesInfo.getResourcesInfoType())){
                    CourseInfo c = new CourseInfo();
                    c.setCourseInfoId(oldCourseInfo.getCourseInfoId());
                    c.setCourseEnclosureIds(StringUtils.isNotBlank(oldCourseInfo.getCourseEnclosureIds())?(oldCourseInfo.getCourseEnclosureIds().replace(oldResourcesInfo.getResourcesInfoId().toString(),"").replace(",,",",")):oldCourseInfo.getCourseEnclosureIds());
                    courseInfoDao.updateEnclosureIdsById(c);
                }
            }
        }

        resourcesInfoDao.deleteResourcesInfoByIds(ids);
    }



    public boolean addAll (List<ResourcesInfo> resourcesInfoList){

        insertBatch(resourcesInfoList);

        List<CourseInfo> courseInfoList = new ArrayList<>();

        for(int i=0;i<resourcesInfoList.size();i++){

            CourseInfo courseInfo = courseInfoDao.single(resourcesInfoList.get(i).getCourseInfoId());
            if(null != courseInfo){
                //资源类型(1视频 2课件 3附件)
                if(((Integer)1).equals(resourcesInfoList.get(i).getResourcesInfoType())){
                    CourseInfo c = new CourseInfo();
                    c.setCourseInfoId(courseInfo.getCourseInfoId());
                    c.setCourseVideoId(null != courseInfo.getCourseVideoId()?courseInfo.getCourseVideoId():resourcesInfoList.get(i).getResourcesInfoId());
                    courseInfoList.add(c);
                }else if(((Integer)2).equals(resourcesInfoList.get(i).getResourcesInfoType())){
                    CourseInfo c = new CourseInfo();
                    c.setCourseInfoId(courseInfo.getCourseInfoId());
                    c.setCourseCoursewareId(null != courseInfo.getCourseCoursewareId()?courseInfo.getCourseCoursewareId():resourcesInfoList.get(i).getResourcesInfoId());
                    courseInfoList.add(c);
                }else if(((Integer)3).equals(resourcesInfoList.get(i).getResourcesInfoType())){
                    CourseInfo c = new CourseInfo();
                    c.setCourseInfoId(courseInfo.getCourseInfoId());
                    c.setCourseEnclosureIds(StringUtils.isNotBlank(courseInfo.getCourseEnclosureIds())?(courseInfo.getCourseEnclosureIds()+","+resourcesInfoList.get(i).getResourcesInfoId()):resourcesInfoList.get(i).getResourcesInfoId().toString());
                    courseInfoList.add(c);
                }
            }
        }

        if(courseInfoList.size()>0){
            courseInfoService.updateBatchTemplate(courseInfoList);
        }

        return true;
    }

    public boolean add (ResourcesInfo resourcesInfo){

        insert(resourcesInfo);

        List<CourseInfo> courseInfoList = new ArrayList<>();

        CourseInfo courseInfo = courseInfoDao.single(resourcesInfo.getCourseInfoId());
        if(null != courseInfo){
            //资源类型(1视频 2课件 3附件)
            if(((Integer)1).equals(resourcesInfo.getResourcesInfoType())){
                CourseInfo c = new CourseInfo();
                c.setCourseInfoId(courseInfo.getCourseInfoId());
                c.setCourseVideoId(null != courseInfo.getCourseVideoId()?courseInfo.getCourseVideoId():resourcesInfo.getResourcesInfoId());
                courseInfoList.add(c);
            }else if(((Integer)2).equals(resourcesInfo.getResourcesInfoType())){
                CourseInfo c = new CourseInfo();
                c.setCourseInfoId(courseInfo.getCourseInfoId());
                c.setCourseCoursewareId(null != courseInfo.getCourseCoursewareId()?courseInfo.getCourseCoursewareId():resourcesInfo.getResourcesInfoId());
                courseInfoList.add(c);
            }else if(((Integer)3).equals(resourcesInfo.getResourcesInfoType())){
                CourseInfo c = new CourseInfo();
                c.setCourseInfoId(courseInfo.getCourseInfoId());
                c.setCourseEnclosureIds(StringUtils.isNotBlank(courseInfo.getCourseEnclosureIds())?(courseInfo.getCourseEnclosureIds()+","+resourcesInfo.getResourcesInfoId()):resourcesInfo.getResourcesInfoId().toString());
                courseInfoList.add(c);
            }
        }

        if(courseInfoList.size()>0){
            courseInfoService.updateBatchTemplate(courseInfoList);
        }

        return true;
    }

    public boolean edit (ResourcesInfo resourcesInfo){

        ResourcesInfo oldResourcesInfo = queryById(resourcesInfo.getResourcesInfoId());
        CourseInfo oldCourseInfo = courseInfoDao.single(oldResourcesInfo.getCourseInfoId());
        if(null != oldCourseInfo){
            //资源类型(1视频 2课件 3附件)
            if(((Integer)1).equals(oldResourcesInfo.getResourcesInfoType())){
                CourseInfo c = new CourseInfo();
                c.setCourseInfoId(oldCourseInfo.getCourseInfoId());
                c.setCourseVideoId(null != oldCourseInfo.getCourseVideoId() && oldCourseInfo.getCourseVideoId().equals(resourcesInfo.getResourcesInfoId())?null:oldCourseInfo.getCourseVideoId());
                courseInfoDao.updateVideoIdById(c);
            }else if(((Integer)2).equals(oldResourcesInfo.getResourcesInfoType())){
                CourseInfo c = new CourseInfo();
                c.setCourseInfoId(oldCourseInfo.getCourseInfoId());
                c.setCourseCoursewareId(null != oldCourseInfo.getCourseCoursewareId() && oldCourseInfo.getCourseCoursewareId().equals(resourcesInfo.getResourcesInfoId())?null:oldCourseInfo.getCourseCoursewareId());
                courseInfoDao.updateCoursewareIdById(c);
            }else if(((Integer)3).equals(oldResourcesInfo.getResourcesInfoType())){
                CourseInfo c = new CourseInfo();
                c.setCourseInfoId(oldCourseInfo.getCourseInfoId());
                c.setCourseEnclosureIds(StringUtils.isNotBlank(oldCourseInfo.getCourseEnclosureIds())?(oldCourseInfo.getCourseEnclosureIds().replace(resourcesInfo.getResourcesInfoId().toString(),"").replace(",,",",")):oldCourseInfo.getCourseEnclosureIds());
                courseInfoDao.updateEnclosureIdsById(c);
            }
        }

        updateTemplate(resourcesInfo);

        List<CourseInfo> courseInfoList = new ArrayList<>();

        CourseInfo courseInfo = courseInfoDao.single(resourcesInfo.getCourseInfoId());
        if(null != courseInfo){
            //资源类型(1视频 2课件 3附件)
            if(((Integer)1).equals(resourcesInfo.getResourcesInfoType())){
                CourseInfo c = new CourseInfo();
                c.setCourseInfoId(courseInfo.getCourseInfoId());
                c.setCourseVideoId(null != courseInfo.getCourseVideoId()?courseInfo.getCourseVideoId():resourcesInfo.getResourcesInfoId());
                courseInfoList.add(c);
            }else if(((Integer)2).equals(resourcesInfo.getResourcesInfoType())){
                CourseInfo c = new CourseInfo();
                c.setCourseInfoId(courseInfo.getCourseInfoId());
                c.setCourseCoursewareId(null != courseInfo.getCourseCoursewareId()?courseInfo.getCourseCoursewareId():resourcesInfo.getResourcesInfoId());
                courseInfoList.add(c);
            }else if(((Integer)3).equals(resourcesInfo.getResourcesInfoType())){
                CourseInfo c = new CourseInfo();
                c.setCourseInfoId(courseInfo.getCourseInfoId());
                c.setCourseEnclosureIds(StringUtils.isNotBlank(courseInfo.getCourseEnclosureIds())?(courseInfo.getCourseEnclosureIds()+","+resourcesInfo.getResourcesInfoId()):resourcesInfo.getResourcesInfoId().toString());
                courseInfoList.add(c);
            }
        }

        if(courseInfoList.size()>0){
            courseInfoService.updateBatchTemplate(courseInfoList);
        }

        return true;
    }

    public List<ResourcesInfo> getValuesByQuery (ResourcesInfoQuery resourcesInfoQuery){
        return resourcesInfoDao.getValuesByQuery(resourcesInfoQuery);
    }

    public List<ResourcesInfo> getValues (Object paras){
        return sqlManager.select(SqlId.of("jlw.resourcesInfo.getResourcesInfoValues"),ResourcesInfo.class,paras);
    }

    /**
     * 从系统资源中拷贝
     * @param resourcesInfoIds
     * @param courseId
     */
    public void copy(String resourcesInfoIds, Long courseId) {
        ResourcesInfoQuery resourcesInfoQuery = new ResourcesInfoQuery();
        resourcesInfoQuery.setResourcesInfoIds(resourcesInfoIds);
        List<ResourcesInfo> list = getValuesByQuery(resourcesInfoQuery);

        List<ResourcesInfo> insertList = CollectionUtil.emptyIfNull(list).stream().map(item -> {
            item.setCourseInfoId(courseId);
            item.setResourcesInfoId(null);
            return item;
        }).collect(Collectors.toList());

        if (ObjectUtil.isEmpty(insertList)) {
            insertBatch(insertList);
        }
    }
}