package com.danbai.ys.service.impl;

import com.alibaba.fastjson.JSON;
import com.danbai.ys.entity.*;
import com.danbai.ys.mapper.TvbMapper;
import com.danbai.ys.mapper.VideoTimeMapper;
import com.danbai.ys.mapper.YsbMapper;
import com.danbai.ys.service.YsService;
import com.danbai.ys.utils.DateUtils;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import tk.mybatis.mapper.entity.Example;

import java.text.ParseException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.concurrent.atomic.AtomicBoolean;


/**
 * @author danbai
 * @date 2019/10/13
 */
@Service
public class YsServiceImpl implements YsService {
    static final String OKTAGIDS = "oktagids";
    @Autowired
    TvbMapper tvbMapper;
    @Autowired
    YsbMapper ysbMapper;
    @Autowired
    VideoTimeMapper videoTimeMapper;
    @Autowired
    RedisTemplate redisTemplate;
    @Autowired
    MongoTemplate mongoTemplate;
    @Autowired
    AdminServiceImpl adminService;
    static String NULL = "null";
    static String KONG = "";
    static int MIN_DM = 100;
    static int MAXTJ =8;
    @Override
    public List<Ysb> page(int page, int pagenum) {
        PageHelper.offsetPage(page, pagenum);
        // 设置分页查询条件
        Example example = new Example(Ysb.class);
        example.orderBy("id").desc();
        PageInfo<Ysb> pageInfo = new PageInfo<>(ysbMapper.selectByExample(example));
        List<Ysb> list1 = pageInfo.getList();
        return list1;
    }

    @Override
    public int contYs() {
        Example example = new Example(Ysb.class);
        return ysbMapper.selectCountByExample(example);
    }

    @Override
    public Ysb selectYsById(int id) {
        Example example = new Example(Ysb.class);
        example.createCriteria().andEqualTo("id", id);
        return ysbMapper.selectOneByExample(example);
    }

    @Override
    public List<Ysb> selectYsByPm(String pm) {
        Example example = new Example(Ysb.class);
        example.createCriteria().andLike("pm", "%" + pm + "%");
        return ysbMapper.selectByExample(example);
    }

    @Override
    public List<Ysb> selectYsByGjc(String gjc) {
        Example example = new Example(Ysb.class);
        example.createCriteria().andLike("pm", "%" + gjc + "%").orLike("zy","%" + gjc + "%").orLike("dy","%" + gjc + "%");
        return ysbMapper.selectByExample(example);
    }

    @Override
    public List<Ysb> selectYsByIdlist(int id) {
        Example example = new Example(Ysb.class);
        example.createCriteria().andEqualTo("id", id);
        return ysbMapper.selectByExample(example);
    }

    @Override
    public boolean addYs(Ysb ysb) {
        if (ysbMapper.insert(ysb) > 0) {
            return true;
        } else {
            return false;
        }
    }

    @Override
    public boolean update(Ysb ysb) {
        if (ysbMapper.updateByPrimaryKey(ysb) > 0) {
            return true;
        }
        return false;
    }

    @Override
    public boolean delYs(Ysb ysb) {

        if (ysbMapper.delete(ysb) > 0) {
            return true;
        }
        return false;
    }

    @Override
    public PageInfo getYs(String lx, int page, int size) {
        List<Ysb> relist = new ArrayList<>();
        Example example = new Example(Ysb.class);
        switch (lx) {
            case "电影":
                example.createCriteria().orLike("lx", "%动作片%").orLike("lx", "%喜剧片%").orLike("lx", "%爱情片%").orLike("lx"
                        , "%科幻片%");
                break;
            case "电视剧":
                example.createCriteria().orLike("lx", "%国产剧%").orLike("lx", "%韩国剧%").orLike("lx", "%欧美剧%").orLike("lx"
                        , "%海外剧%");
                break;
            case "综艺":
                example.createCriteria().andLike("lx", "%综艺%");
                break;
            case "动漫":
                example.createCriteria().andLike("lx", "%动漫%");
                break;
            case "全部":
                break;
            default:
        }
        example.orderBy("gxtime").desc();
        PageHelper.startPage(page, size).getPages();
        List<Ysb> ysbs = ysbMapper.selectByExample(example);
        PageInfo pages = new PageInfo(ysbs);
        relist.addAll(ysbs);
        return pages;
    }

    @Override
    public void addYsTime(VideoTime videoTime) {
        VideoTime videoTime1 = new VideoTime();
        videoTime1.setUsername(videoTime.getUsername());
        videoTime1.setYsid(videoTime.getYsid());
        videoTime1.setYsjiname(videoTime.getYsjiname());
        VideoTime videoTime2 = videoTimeMapper.selectOne(videoTime1);
        if (videoTime2 != null) {
            videoTime.setId(videoTime2.getId());
             videoTimeMapper.updateByPrimaryKey(videoTime);
        }else {
            videoTimeMapper.insert(videoTime);
        }
    }

    @Override
    public float getYsTime(VideoTime videoTime) {
        VideoTime videoTime1 = videoTimeMapper.selectOne(videoTime);
        if (videoTime1 != null) {
            return videoTime1.getTime();
        }
        return 0;
    }

    @Override
    public List<Gkls> getGkls(String username) {
        Example example = new Example(VideoTime.class);
        example.createCriteria().andEqualTo("username", username);
        example.orderBy("gktime").desc();
        List<VideoTime> select = videoTimeMapper.selectByExample(example);
        List<Gkls> list = new ArrayList<>();
        for (VideoTime v : select) {
            if((v.getTime()>30)){
                Gkls gkls = new Gkls();
                Ysb ysb = selectYsById(v.getYsid());
                if (ysb != null) {
                    gkls.setPm(ysb.getPm());
                    gkls.setYsimg(ysb.getTp());
                }
                gkls.setJi(v.getYsjiname());
                gkls.setTime(DateUtils.secondToTime(v.getTime().longValue()));
                gkls.setGktime(v.getGktime());
                gkls.setId(v.getYsid());
                list.add(gkls);
            }
        }
        return list;
    }

    @Override
    public List<Gkls> getGklsSole(String username) {
        Example example = new Example(VideoTime.class);
        example.createCriteria().andEqualTo("username", username);
        example.orderBy("gktime").desc();
        List<VideoTime> select = videoTimeMapper.selectByExample(example);
        List<Gkls> list = new ArrayList<>();
        for (VideoTime v : select) {
            if((v.getTime()>30)){
                AtomicBoolean in= new AtomicBoolean(false);
                list.forEach(gkls -> {
                    if(gkls.id==v.getYsid()){
                        in.set(true);
                        return;
                    }
                });
                if(in.get()){
                    continue;
                }
                Gkls gkls = new Gkls();
                Ysb ysb = selectYsById(v.getYsid());
                if (ysb != null) {
                    gkls.setPm(ysb.getPm());
                    gkls.setYsimg(ysb.getTp());
                }
                gkls.setJi(v.getYsjiname());
                gkls.setTime(DateUtils.secondToTime(v.getTime().longValue()));
                gkls.setGktime(v.getGktime());
                gkls.setId(v.getYsid());
                list.add(gkls);
            }
        }
        return list;
    }

    @Override
    public HashMap getYsLs(String username, int ysid) {
        HashMap<String, String> map = new HashMap<>(30);
        Ysb ysb = selectYsById(ysid);
        List<Gkls> gkls = getGkls(username);
        for (Gkls g : gkls) {
            if (g.getId() == ysid) {
                List<Ji> jis = JSON.parseArray(ysb.getGkdz(), Ji.class);
                for (Ji j : jis) {
                    if (g.getJi().equals(j.getName())) {
                        map.put("url", j.getUrl());
                        map.put("jiname", j.getName());
                        return map;
                    }
                }
            }
        }
        return null;
    }

    @Override
    public String getYsDanMu(String pm ,String ysid) {
        String rr = String.valueOf(redisTemplate.opsForValue().get(pm + ysid));
        if(rr==NULL){
            return null;
        }
        if (rr != null && !rr.equals(KONG)) {
            if(adminService.getConfig(Config.DMCACHE).equals(AdminServiceImpl.YES)) {
                if (redisTemplate.opsForSet().isMember(OKTAGIDS, rr)) {
                    Query query = new Query(Criteria.where("player").is(ysid));
                    if (mongoTemplate.count(query, Dan.class) < MIN_DM) {
                        return rr;
                    }
                    return null;
                }
                String json = "{tagid:" + rr + ",player:\"" + ysid + "\"}";
                redisTemplate.opsForSet().add("tagids", json);
                return rr;
            }
            return rr;
        }
        return null;
    }

    @Override
    public List<Ysb> getAll() {
        return ysbMapper.selectAll();
    }

    @Override
    public List<Ysb> qcsy(List<Ysb> list) {
        List<Ysb> tmp=new ArrayList<>();
        //清除掉不需要的数据
        for (Ysb y:list) {
            y.setGkdz("");
            y.setXzdz("");
            y.setJs("");
            tmp.add(y);
        }
        return tmp;
    }

    @Override
    public List<Ysb> tuijian() {
        Example example = new Example(Ysb.class);
        try {
            example.createCriteria().andGreaterThan("gxtime",DateUtils.dateAdd(null,-30,true)).andGreaterThan("pf",8);
            List<Ysb> ysbs = ysbMapper.selectByExample(example);
            ArrayList<Ysb> rys = new ArrayList<>();
            for(int i=0;i<MAXTJ;i++){
                int j=(int)(Math.random()*(ysbs.size()-1));
                rys.add(ysbs.get(j));
                ysbs.remove(j);
            }
            return rys;
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return null;
    }

    @Override
    public List<Tvb> getAllTv() {
        return tvbMapper.selectAll();
    }

    @Override
    public List<Ysb> getNewYsb(int num) {
        Example example = new Example(Ysb.class);
        example.setOrderByClause("gxtime DESC limit 0,"+num);
        return ysbMapper.selectByExample(example);
    }

    @Override
    public List<Ysb> getByType(String type1, String type2, String region, String year, String sort,int page) {
        PageHelper.startPage(page, 20).getPages();
        List<Ysb> ysbs = ysbMapper.getByType(type1,type2,region,year,sort);
        PageInfo pages = new PageInfo(ysbs);
        return pages.getList();
    }
}