package com.yutou.bilibili.BiliBili.Controllers;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.yutou.bilibili.BiliBili.Live;
import com.yutou.bilibili.BiliBili.LiveController;
import com.yutou.bilibili.BiliBili.LiveUtils;
import com.yutou.bilibili.BiliBili.Services.IBiliBiliLiveService;
import com.yutou.bilibili.BiliBili.Tools.BiliTools;
import com.yutou.bilibili.Services.IUserService;
import com.yutou.bilibili.Tools.AppTools;
import com.yutou.bilibili.mybatis.Bili.mybatis.model.BilibiliUpInfo;
import com.yutou.bilibili.mybatis.model.UUser;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.util.List;

@Controller
public class UpInfoController {
    @Resource
    IBiliBiliLiveService service;
    @Resource
    IUserService userService;

    @RequestMapping("/upinfo/get/list.do")
    @ResponseBody
    public JSONObject upInfoList(HttpServletRequest request) {
        String token= AppTools.getLoginToken(request);
        UUser user= userService.getUserToToken(token);
        JSONObject json = new JSONObject();
        if(user==null){
            json.put("code",-1);
            json.put("msg","未登录");
            json.put("data","[]");
            return json;
        }
        List<BilibiliUpInfo> upDataList =service.getUpInfo(user.getId(),user.getPower());
        com.yutou.bilibili.Tools.Log.i("UP用户数:" + upDataList.size());
        json.put("code", 0);
        json.put("data", JSONArray.toJSON(upDataList));
        return json;
    }

    @ResponseBody
    @RequestMapping("/upinfo/set/add.do")
    public JSONObject addUpInfo(BilibiliUpInfo upData) {
        JSONObject json = new JSONObject();
        if (BiliTools.checkout(upData) != null) {
            upData.setEnable(0);
            upData = BiliTools.checkout(upData);
            com.yutou.bilibili.Tools.Log.i(upData);
            boolean flag = service.addUpInfo(upData);
            if (flag) {
                json.put("code", 0);
                json.put("msg", "添加成功");
            } else {
                json.put("code", -1);
                json.put("msg", "添加失败，该UP已经存在");
            }
        } else {
            json.put("code", -2);
            json.put("msg", "添加失败，可能参数有问题或该UP已经存在");
        }
        return json;
    }

    @ResponseBody
    @RequestMapping("/upinfo/set/update.do")
    public JSONObject update(BilibiliUpInfo upData) {
        JSONObject json = new JSONObject();
        com.yutou.bilibili.Tools.Log.i("old data ="+upData);
        BilibiliUpInfo old = service.queryUp(upData);
        if (!old.getUrl().equals(upData.getUrl())) {
            upData = BiliTools.checkout(upData);
            if (upData != null) {
                upData.setEnable(0);
                upData.setSavedanmu(0);
                upData.setOfflinelistening(0);
            }
        }
        com.yutou.bilibili.Tools.Log.i("save data = "+upData);
        boolean flag = service.updateUpInfo(upData);
        if (flag) {
            LiveController.getInstance().updateUpInfo(upData);
            json.put("code", 0);
            json.put("msg", "更新成功");
        } else {
            json.put("code", -1);
            json.put("msg", "更新失败，可能参数有问题");
        }
        return json;
    }

    @ResponseBody
    @RequestMapping("/upinfo/set/delete.do")
    public JSONObject delete(BilibiliUpInfo upData) {
        JSONObject json = new JSONObject();
        com.yutou.bilibili.Tools.Log.i(upData);
        boolean flag = service.deleteUp(upData);
        if (flag) {
            json.put("code", 0);
            json.put("msg", "删除成功");
        } else {
            json.put("code", -1);
            json.put("msg", "删除失败，可能参数有问题");
        }
        return json;
    }

    @ResponseBody
    @RequestMapping("/upinfo/get/query.do")
    public JSONObject query(BilibiliUpInfo upData) {
        upData = service.queryUp(upData);
        return (JSONObject) JSON.toJSON(upData);
    }

    @ResponseBody
    @RequestMapping("/upinfo/get/liveInfo.do")
    public JSONObject liveInfo() {
        List<BilibiliUpInfo> list = service.getUpInfo();
        JSONObject json = new JSONObject();
        JSONObject data = new JSONObject();
        JSONArray info = new JSONArray();
        JSONArray liveArray = new JSONArray();
        int online=0;
        for (BilibiliUpInfo up : list) {
            if (LiveUtils.isLivePlayer(up.getRoomid())) {
                online++;
                if(LiveUtils.liveContains(up)==null){
                    up.setLive(0);
                }else{
                    up.setLive(1);
                }
                info.add(JSON.toJSON(up));
            }
        }
        for (Live live : Live.lives.values()) {
            if(live.geData().getLive()==1){
                liveArray.add(JSON.toJSON(live.geData()));
            }
        }
        data.put("online", online);
        data.put("info", info);
        data.put("live", liveArray);
        json.put("code", 0);
        json.put("data", data);
        return json;
    }
}
