package com.qxgmat.service.inline;

import com.github.pagehelper.Page;
import com.nuliji.tools.AbstractService;
import com.nuliji.tools.exception.ParameterException;
import com.nuliji.tools.exception.SystemException;
import com.nuliji.tools.mybatis.Example;
import com.qxgmat.data.constants.enums.status.DirectionStatus;
import com.qxgmat.data.constants.enums.user.DataType;
import com.qxgmat.data.dao.CourseDataMapper;
import com.qxgmat.data.dao.CourseExperienceMapper;
import com.qxgmat.data.dao.entity.CourseData;
import com.qxgmat.data.dao.entity.CourseExperience;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.Collection;
import java.util.List;

@Service
public class CourseExperienceService extends AbstractService {
    private static final Logger logger = LoggerFactory.getLogger(CourseExperienceService.class);

    @Resource
    private CourseExperienceMapper courseExperienceMapper;

    public Page<CourseExperience> listAdmin(int page, int size, Integer userId, String keyword, String order, DirectionStatus direction){
        Example example = new Example(CourseExperience.class);
        if(userId != null){
            example.and(
                    example.createCriteria()
                    .andEqualTo("userId", userId)
            );
        }
        if(keyword != null){
            example.and(
                    example.createCriteria()
                    .orLike("title", "%"+keyword+"%")
                    .orLike("content", "%"+keyword+"%")
            );
        }
        if(order == null || order.isEmpty()) order = "id";
        switch(direction){
            case ASC:
                example.orderBy(order).asc();
                break;
            case DESC:
            default:
                example.orderBy(order).desc();
        }
        return select(courseExperienceMapper, example, page, size);
    }

    public Page<CourseExperience> list(int page, int size, String prepareStatus, String prepareExaminationTime, String experienceScore, String experiencePercent, String order, DirectionStatus direction){
        Example example = new Example(CourseExperience.class);
        if(prepareStatus != null){
            example.and(
                    example.createCriteria()
                            .andEqualTo("prepareStatus", prepareStatus)
            );
        }
        if(prepareExaminationTime != null){
            example.and(
                    example.createCriteria()
                            .andEqualTo("prepareExaminationTime", prepareExaminationTime)
            );
        }
        if(experienceScore != null){
            example.and(
                    example.createCriteria()
                            .andEqualTo("experienceScore", experienceScore)
            );
        }
        if(experiencePercent != null){
            example.and(
                    example.createCriteria()
                            .andEqualTo("experiencePercent", experiencePercent)
            );
        }
        if(order == null || order.isEmpty()) order = "id";
        switch(direction){
            case ASC:
                example.orderBy(order).asc();
                break;
            case DESC:
            default:
                example.orderBy(order).desc();
        }
        return select(courseExperienceMapper, example, page, size);
    }

    public CourseExperience add(CourseExperience courseData){
        int result = insert(courseExperienceMapper, courseData);
        courseData = one(courseExperienceMapper, courseData.getId());
        if(courseData == null){
            throw new SystemException("心经添加失败");
        }
        return courseData;
    }

    public CourseExperience edit(CourseExperience courseData){
        CourseExperience in = one(courseExperienceMapper, courseData.getId());
        if(in == null){
            throw new ParameterException("心经不存在");
        }
        int result = update(courseExperienceMapper, courseData);
        return courseData;
    }

    public boolean delete(Number id){
        CourseExperience in = one(courseExperienceMapper, id);
        if(in == null){
            throw new ParameterException("心经不存在");
        }
        int result = delete(courseExperienceMapper, id);
        return result > 0;
    }

    public CourseExperience get(Number id){
        CourseExperience in = one(courseExperienceMapper, id);

        if(in == null){
            throw new ParameterException("心经不存在");
        }
        return in;
    }

    public Page<CourseExperience> select(int page, int pageSize){
        return select(courseExperienceMapper, page, pageSize);
    }

    public Page<CourseExperience> select(Integer[] ids){
        return page(()->select(courseExperienceMapper, ids), 1, ids.length);
    }

    public List<CourseExperience> select(Collection ids){
        return select(courseExperienceMapper, ids);
    }

}