package com.tinymooc.handler.homePage.controller;

/**
 * Created by 哓哓 on 2015/12/1 0001.
 */

import java.util.ArrayList;
import java.util.List;

import javax.servlet.http.HttpServletRequest;

import com.tinymooc.common.domain.*;
import org.hibernate.criterion.DetachedCriteria;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Restrictions;
import com.tinymooc.handler.attention.service.AttentionService;
import com.tinymooc.handler.label.service.LabelService;
import com.tinymooc.handler.user.service.UserService;
import com.tinymooc.common.tag.pageTag.PageHelper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

/**
 * 主页控制器
 * Campanulaceae 2015-12-01 18:25:16
 */
@Controller
public class HomePageController {

    private static final Logger log = LoggerFactory.getLogger(HomePageController.class);

    @Autowired
    private LabelService labelService;

    @Autowired
    private UserService userService;

    @Autowired
    private AttentionService attention;

    private String labels;
    private String previousLabels;

    /**
     * 转向首页
     *
     * @param request
     * @return ModelAndView
     */
    @RequestMapping("turnToHomePage.htm")
    public ModelAndView turnToHomePage(HttpServletRequest request) {
        User user = (User) request.getSession().getAttribute("user");
        //热门课程
        DetachedCriteria dCriteria = DetachedCriteria.forClass(Course.class);
        dCriteria.addOrder(Order.desc("scanNum"));
        dCriteria.add(Restrictions.eq("courseState", "批准"));
        // TODO 是否取消课程的自关联
        dCriteria.add(Restrictions.isNull("course"));
        List<Course> hotCourseListTemp = userService.queryMaxNumOfCondition(Course.class, dCriteria, 8);
        List<UserCourse> hotCourseList = new ArrayList<>();
        for (int i = 0; i < hotCourseListTemp.size(); i++) {
            Course course = hotCourseListTemp.get(i);
            DetachedCriteria detachedCriteria = DetachedCriteria.forClass(UserCourse.class);
            detachedCriteria.add(Restrictions.eq("course", course));

            List<UserCourse> userCourseList = userService.queryAllOfCondition(UserCourse.class, detachedCriteria);
            for (int j = 0; j < userCourseList.size(); j++) {
                if (userCourseList.get(j).getUserPosition().equals("创建者")) {
                    hotCourseList.add(userCourseList.get(j));
                }
            }
        }
        //最新课程
        DetachedCriteria dCriteria1 = DetachedCriteria.forClass(Course.class);
        dCriteria1.addOrder(Order.desc("applyDate"));
        dCriteria1.add(Restrictions.eq("courseState", "批准"));
        dCriteria1.add(Restrictions.isNull("course"));
        List<Course> newCourseListTemp = userService.queryMaxNumOfCondition(Course.class, dCriteria1, 8);
        List<UserCourse> newCourseList = new ArrayList<>();
        for (int i = 0; i < newCourseListTemp.size(); i++) {
            Course course = newCourseListTemp.get(i);
            DetachedCriteria detachedCriteria = DetachedCriteria.forClass(UserCourse.class);
            detachedCriteria.add(Restrictions.eq("course", course));

            List<UserCourse> userCourseList = userService.queryAllOfCondition(UserCourse.class, detachedCriteria);
            for (int j = 0; j < userCourseList.size(); j++) {
                if (userCourseList.get(j).getUserPosition().equals("创建者")) {
                    newCourseList.add(userCourseList.get(j));
                }
            }
        }
        //推荐小组
        DetachedCriteria dCriteria2 = DetachedCriteria.forClass(Team.class);
        dCriteria2.addOrder(Order.desc("construction"));
        dCriteria2.add(Restrictions.eq("teamState", "批准"));
        List<Team> teamList = userService.queryMaxNumOfCondition(Team.class, dCriteria2, 4);

        //热门话题
        DetachedCriteria dCriteria3 = DetachedCriteria.forClass(Discuss.class);
        dCriteria3.addOrder(Order.desc("scanNum"));
        List<Discuss> discussList = userService.queryMaxNumOfCondition(Discuss.class, dCriteria3, 3);

        //热门标签
        DetachedCriteria dCriteria4 = DetachedCriteria.forClass(Label.class);
        dCriteria4.addOrder(Order.desc("frequency"));
        List<Label> labelList = userService.queryMaxNumOfCondition(Label.class, dCriteria4, 20);

        //最新笔记
        DetachedCriteria dCriteria5 = DetachedCriteria.forClass(Note.class);
        dCriteria5.addOrder(Order.desc("addDate"));
        dCriteria5.add(Restrictions.eq("public_", "是"));
        List<Note> noteList = userService.queryMaxNumOfCondition(Note.class, dCriteria5, 5);


        request.setAttribute("hotCourseList", hotCourseList); // 热门课程
        request.setAttribute("newCourseList", newCourseList); // 最新课程
        request.setAttribute("teamList", teamList); // 小组
        request.setAttribute("discussList", discussList); // 话题
        request.setAttribute("labelList", labelList); // 标签
        request.setAttribute("noteList", noteList); // 笔记

        if (user == null) {
            /**
             * 用户没有登录
             */
            return new ModelAndView("/homePage/homePage");
        } else {
            /**
             * 用户已经登录
             */
            int credit = user.getCredit();
            Level level = userService.getUserLevel(credit);
            return new ModelAndView("/homePage/userHomePage", "level", level);
        }

    }

    /**
     * 我的萌课
     *
     * @param request
     * @return ModelAndView
     * @Date 2015年12月2日15:16:07
     */
    @RequestMapping("myTinyMooc.htm")
    public ModelAndView myTinyMooc(HttpServletRequest request) {
        User user = (User) request.getSession().getAttribute("user");

        String message = "";
        if (user == null) {
            message = "请先登录啊( ̄▽ ̄)";
            return new ModelAndView("/login/login", "message", message);
        } else {
            int credit = user.getCredit();
            Level level = userService.getUserLevel(credit);
            String sessionId = (String) request.getSession().getAttribute("userId");
            //热门标签
            DetachedCriteria dCriteriaLabel = DetachedCriteria.forClass(Label.class);
            dCriteriaLabel.addOrder(Order.desc("frequency"));
            List<Label> labelList = userService.queryMaxNumOfCondition(Label.class, dCriteriaLabel, 8);
            //课程推荐
            DetachedCriteria dCriteriaCourse = DetachedCriteria.forClass(Course.class);
            dCriteriaCourse.addOrder(Order.desc("scanNum"));
            dCriteriaCourse.add(Restrictions.eq("courseState", "批准"));
            // TODO 是否取消课程的自关联
            dCriteriaCourse.add(Restrictions.isNull("course"));
            List<Course> courseList1 = userService.queryMaxNumOfCondition(Course.class, dCriteriaCourse, 6);

            List<UserCourse> hotCourseList = new ArrayList<>();
            for (int i = 0; i < courseList1.size(); i++) {
                Course course = courseList1.get(i);
                DetachedCriteria dCriteriaUserCourse = DetachedCriteria.forClass(UserCourse.class);
                dCriteriaUserCourse.add(Restrictions.eq("course", course));
                List<UserCourse> userCourseList = userService.queryAllOfCondition(UserCourse.class, dCriteriaUserCourse);
                // UserCourse中以创建者作为标识
                for (int j = 0; j < userCourseList.size(); j++) {
                    if (userCourseList.get(j).getUserPosition().equals("创建者")) {
                        hotCourseList.add(userCourseList.get(j));
                        break;
                    }
                }
            }
            //达人推荐
            DetachedCriteria dCriteria2 = DetachedCriteria.forClass(User.class)
                    .addOrder(Order.desc("credit"))
                    .add(Restrictions.ne("userId", user.getUserId()));
            List<User> expertList = userService.queryMaxNumOfCondition(User.class, dCriteria2, 4);
            // 封装数据
            request.setAttribute("hotCourseList", hotCourseList);
            request.setAttribute("labelList", labelList);
            request.setAttribute("expertList", expertList);
            return new ModelAndView("/homePage/myTinyMooc", "level", level);
        }
    }


    @RequestMapping("recommendTeam.htm")
    public ModelAndView recommendTeam(HttpServletRequest request) {
        User user = (User) request.getSession().getAttribute("user");
        int credit = user.getCredit();
        Level level = userService.getUserLevel(credit);
        //热门标签
        DetachedCriteria detachedCriteria1 = DetachedCriteria.forClass(Label.class);
        detachedCriteria1.addOrder(Order.desc("frequency"));
        List<Label> labelList = userService.queryMaxNumOfCondition(Label.class, detachedCriteria1, 9);
        //达人推荐
        DetachedCriteria detachedCriteria2 = DetachedCriteria.forClass(User.class)
                .addOrder(Order.desc("credit"))
                .add(Restrictions.ne("userId", user.getUserId()));
        List<User> expertList = userService.queryMaxNumOfCondition(User.class, detachedCriteria2, 4);
        //小组推荐
        DetachedCriteria detachedCriteria3 = DetachedCriteria.forClass(LabelObject.class)
                .add(Restrictions.eq("objectId", user.getUserId()));
        List<LabelObject> labelObjectList = userService.queryAllOfCondition(LabelObject.class, detachedCriteria3);
        List<UserTeam> teamList = new ArrayList<UserTeam>();

        for (int i = 0; i < labelObjectList.size(); i++) {
            Label label = labelObjectList.get(i).getLabel();
            DetachedCriteria detachedCriteria4 = DetachedCriteria.forClass(LabelObject.class)
                    .add(Restrictions.eq("label", label))
                    .add(Restrictions.eq("objectType", "team"));
            List<LabelObject> labelObjectTempList = userService.queryAllOfCondition(LabelObject.class, detachedCriteria4);
            for (int j = 0; j < labelObjectTempList.size(); j++) {
                String objectId = labelObjectTempList.get(j).getObjectId();
                User userTest = userService.findById(User.class, objectId);
                if (userTest == null) {
                    break;
                }
                DetachedCriteria dCriteriaTest = DetachedCriteria.forClass(UserTeam.class)
                        .add(Restrictions.eq("user", userTest))
                        .add(Restrictions.eq("userPosition", "组长"))
                        .add(Restrictions.eq("userState", "批准"));
                List<UserTeam> list = userService.queryAllOfCondition(UserTeam.class, dCriteriaTest);
                UserTeam userTeamTemp = null;
                if (list.size() == 0) {
                    continue;
                } else {
                    userTeamTemp = list.get(0);
                }
                teamList.add(userTeamTemp);
            }
        }
        request.getSession().setAttribute("labelList", labelList);
        request.getSession().setAttribute("expertList", expertList);
        request.getSession().setAttribute("teamList", teamList);
        request.getSession().setAttribute("level", level);
        return new ModelAndView("/homePage/recommendTeam");
    }

    @RequestMapping("turnToHelpPage.htm")
    public ModelAndView turnToHelpPage() {
        return new ModelAndView("/help/helpLevel");
    }

    @RequestMapping("howToCreate.htm")
    public ModelAndView howtocreate() {
        return new ModelAndView("/course/howToCreate");
    }

    @RequestMapping("turnToPersonPage.htm")
    public ModelAndView turnToPersonPage() {
        return new ModelAndView("/homePage/userHomePage");
    }

    @RequestMapping("editLabel.htm")
    public ModelAndView editLabel(HttpServletRequest request) {
        User user = (User) request.getSession().getAttribute("user");
        if (user == null)
            return new ModelAndView("redirect:login.htm");
        String labels = request.getParameter("keyWordsHidden");
        String objectId = null;
        String type = request.getParameter("type");
        String courseId = request.getParameter("courseId");
        String teamId = request.getParameter("teamId");
        if (type.equals("user")) {
            objectId = user.getUserId();
        } else if (type.equals("course")) {
            objectId = courseId;
        } else if (type.equals("team")) {
            objectId = teamId;
        } else {
            objectId = user.getUserId();
        }
        labelService.saveObjectLabels(labels, objectId, type);
        return new ModelAndView("forward:queryLabel.htm");
    }

    @RequestMapping("queryLabel.htm")
    public ModelAndView queryLabel(HttpServletRequest request) {
        User user = (User) request.getSession().getAttribute("user");
        if (user == null)
            return new ModelAndView("redirect:login.htm");

        String type = request.getParameter("type");
        String courseId = request.getParameter("courseId");
        String teamId = request.getParameter("teamId");
        labels = labelService.getTenHotLabels();
        if (type.equals("user")) {
            previousLabels = labelService.getObjectLabels(user.getUserId(), type);
        } else if (type.equals("course")) {
            previousLabels = labelService.getObjectLabels(courseId, type);
        } else if (type.equals("team")) {
            previousLabels = labelService.getObjectLabels(teamId, type);
        } else {
            previousLabels = labelService.getObjectLabels(user.getUserId(), type);
        }

        ModelMap map = new ModelMap();
        map.put("labels", labels);
        map.put("previousLabels", previousLabels);

        request.setAttribute("courseId", courseId);
        request.setAttribute("teamId", teamId);
        request.setAttribute("type", type);

        return new ModelAndView("/userPage/accountLabel", map);
    }

    @RequestMapping("goPersonal.htm")
    public ModelAndView goPersonal(HttpServletRequest request) throws Exception {

        if ((request.getSession().getAttribute("user")) == null) {
            return new ModelAndView("redirect:goLoginPage.htm");
        } else {
            User user = (User) request.getSession().getAttribute("user");
            if ((request.getParameter("userId")).equals("")) {
                return new ModelAndView("redirect:goLoginPage.htm");
            }
            String userId = request.getParameter("userId");
            User user1 = userService.findById(User.class, userId);
            // 获取关注列表
            DetachedCriteria dCriteria1 = DetachedCriteria.forClass(Attention.class);
            dCriteria1.add(Restrictions.eq("userByUserId", user1));
            List<Attention> attentionList = userService.queryAllOfCondition(Attention.class, dCriteria1);
            // 获取好友列表
            DetachedCriteria dCriteria2 = DetachedCriteria.forClass(Attention.class);
            dCriteria2.add(Restrictions.eq("userByAttentionedUserId", user1));
            List<Attention> fansList = userService.queryAllOfCondition(Attention.class, dCriteria2);
            // 获取当前学习课程
            DetachedCriteria dCriteria3 = DetachedCriteria.forClass(UserCourse.class)
                    .add(Restrictions.eq("user", user1))
                    .add(Restrictions.eq("learnState", "学习中"))
                    .createCriteria("course").add(Restrictions.isNull("course"));
            List<UserCourse> currentCourseList = userService.queryAllOfCondition(UserCourse.class, dCriteria3);
            // 获取当前学完课程
            DetachedCriteria dCriteria4 = DetachedCriteria.forClass(UserCourse.class);
            dCriteria4.add(Restrictions.eq("learnState", "已学"));
            dCriteria4.add(Restrictions.eq("user", user1))
                    .createCriteria("course").add(Restrictions.isNull("course"));
            List<UserCourse> endCourseList = userService.queryAllOfCondition(UserCourse.class, dCriteria4);
            // 获取当前用户的标签
            DetachedCriteria dCriteria5 = DetachedCriteria.forClass(LabelObject.class);
            dCriteria5.add(Restrictions.eq("objectId", user1.getUserId()));
            List<LabelObject> labelList = userService.queryAllOfCondition(LabelObject.class, dCriteria5);
            String isOk = "";
            boolean flag = attention.isAlreadyAttention(user.getUserId(), user1.getUserId());
            if (flag) {
                isOk = "ok";
            } else {
                isOk = "no";
            }
            int credit = user1.getCredit();
            Level level = userService.getUserLevel(credit);
            request.setAttribute("isOk", isOk);
            request.setAttribute("user1", user1);
            request.setAttribute("user", user);
            request.setAttribute("level", level);
            request.setAttribute("labelList", labelList);
            request.setAttribute("labelList", labelList);
            request.setAttribute("fansList", fansList);
            request.setAttribute("currentCourseList", currentCourseList);
            request.setAttribute("endCourseList", endCourseList);

            return new ModelAndView("/userPage/user");
        }
    }

    @RequestMapping("goPersonalTeam.htm")
    public ModelAndView goPersonalTeam(HttpServletRequest request) {
        String userId = request.getParameter("userId");
        User user1 = userService.findById(User.class, userId);
        DetachedCriteria dCriteria = DetachedCriteria.forClass(UserTeam.class);
        dCriteria.add(Restrictions.eq("user", user1));

        List<UserTeam> userTeam = userService.queryAllOfCondition(UserTeam.class, dCriteria);
        DetachedCriteria dCriteria2 = DetachedCriteria.forClass(Discuss.class);
        dCriteria2.add(Restrictions.eq("user", user1));
        List<Discuss> discussList = userService.queryAllOfCondition(Discuss.class, dCriteria2);

        request.setAttribute("user1", user1);
        request.setAttribute("userTeam", userTeam);
        request.setAttribute("discussList", discussList);
        return new ModelAndView("/userPage/userGroup");
    }

    @RequestMapping("goPersonalNote.htm")
    public ModelAndView goPersonalNote(HttpServletRequest request) {
        String userId = request.getParameter("userId");
        User user1 = userService.findById(User.class, userId);
        User user = (User) request.getSession().getAttribute("user");

        DetachedCriteria dCriteria = DetachedCriteria.forClass(UserCourse.class);
        dCriteria.add(Restrictions.eq("user", user1));

        List<UserCourse> notelist = userService.queryAllOfCondition(UserCourse.class, dCriteria);

        request.setAttribute("user1", user1);
        request.setAttribute("user", user);
        return new ModelAndView("/userPage/userNote", "notelist", notelist);
    }

    @RequestMapping("goPersonalFans.htm")
    public ModelAndView goPersonalFans(HttpServletRequest request) {
        String userId = request.getParameter("userId");
        User user1 = userService.findById(User.class, userId);
        List<Attention> list = attention.queryFans(userId);
        request.setAttribute("user1", user1);
        request.setAttribute("sum", list.size());
        return new ModelAndView("/userPage/userFans", "list", list);

    }

    @RequestMapping("goPersonalAttention.htm")
    public ModelAndView goPersonalAtt(HttpServletRequest request) {
        String userId = request.getParameter("userId");
        User user1 = userService.findById(User.class, userId);
        List<Attention> list = attention.queryAttention(userId);
        request.setAttribute("sum", list.size());
        request.setAttribute("user1", user1);
        return new ModelAndView("/userPage/userFollow", "list", list);

    }

    /*---------------------------导航栏课程首页------------------------*/
    @SuppressWarnings("unchecked")
    @RequestMapping("goCourseHome.htm")
    public ModelAndView goCourseHome(HttpServletRequest request) {
        String filterType = request.getParameter("filterType");
        DetachedCriteria dc = DetachedCriteria.forClass(UserCourse.class)
                .add(Restrictions.eq("userPosition", "创建者")).createCriteria("course")
                .add(Restrictions.eq("courseState", "批准"))
                .add(Restrictions.isNull("course"));
        if (filterType == null) {
            // 默认
            dc.addOrder(Order.desc("applyDate"));
        } else if (filterType.equals("grade"))
            dc.addOrder(Order.desc("totalMark"));
        else if (filterType.equals("time"))
            dc.addOrder(Order.desc("approveDate"));
        else if (filterType.equals("hot"))
            dc.addOrder(Order.desc("scanNum"));

        int pageSize = 12;
        int totalPage = userService.countTotalPage(dc, pageSize);
        PageHelper.forPage(totalPage, pageSize);
        List<UserCourse> list1 = (List<UserCourse>) userService.getByPage(dc, pageSize);
        request.setAttribute("list1", list1);
        return new ModelAndView("/homePage/allcourse");
    }

		/*---------------------------导航栏专业首页------------------------*/

    @RequestMapping("goMajorHome.htm")
    public ModelAndView goMajorHome(HttpServletRequest request) throws Exception {
        String type = request.getParameter("type");
        // 专业科目 显示1门
        DetachedCriteria detachedCriteria1 = DetachedCriteria.forClass(UserCourse.class)
                .add(Restrictions.eq("userPosition", "创建者")).createCriteria("course")
                .add(Restrictions.eq("courseState", "批准"))
                .add(Restrictions.eq("type", type))
                .add(Restrictions.isNull("course"));
        List<UserCourse> majorCourseList = userService.queryMaxNumOfCondition(UserCourse.class, detachedCriteria1, 1);
        //最新课程 显示4门
        DetachedCriteria detachedCriteria2 = DetachedCriteria.forClass(Course.class);
        detachedCriteria2.add(Restrictions.eq("courseState", "批准"));
        detachedCriteria2.add(Restrictions.eq("type", type));
        detachedCriteria2.add(Restrictions.isNull("course"));
        detachedCriteria2.addOrder(Order.desc("applyDate"));
        List<Course> newCourseListTemp = userService.queryMaxNumOfCondition(Course.class, detachedCriteria2, 4);
        List<UserCourse> newCourseList = new ArrayList<UserCourse>();
        for (int i = 0; i < newCourseListTemp.size(); i++) {
            Course course = newCourseListTemp.get(i);
            DetachedCriteria dCr1 = DetachedCriteria.forClass(UserCourse.class).add(Restrictions.eq("course", course));
            List<UserCourse> uL1 = userService.queryAllOfCondition(UserCourse.class, dCr1);

            for (int j = 0; j < uL1.size(); j++) {
                if (uL1.get(j).getUserPosition().equals("创建者")) {
                    newCourseList.add(uL1.get(j));
                }
            }
        }
        //热门课程 显示4门
        DetachedCriteria detachedCriteria3 = DetachedCriteria.forClass(Course.class);
        detachedCriteria3.addOrder(Order.desc("scanNum"));
        detachedCriteria3.add(Restrictions.eq("courseState", "批准"));
        detachedCriteria3.add(Restrictions.eq("type", type));
        detachedCriteria3.add(Restrictions.isNull("course"));
        List<Course> hotCourseListTemp = userService.queryMaxNumOfCondition(Course.class, detachedCriteria3, 4);
        List<UserCourse> hotCourseList = new ArrayList<UserCourse>();
        for (int i = 0; i < hotCourseListTemp.size(); i++) {
            Course course = hotCourseListTemp.get(i);
            DetachedCriteria dCr1 = DetachedCriteria.forClass(UserCourse.class).add(Restrictions.eq("course", course));
            List<UserCourse> uL1 = userService.queryAllOfCondition(UserCourse.class, dCr1);

            for (int j = 0; j < uL1.size(); j++) {
                if (uL1.get(j).getUserPosition().equals("创建者")) {
                    hotCourseList.add(uL1.get(j));
                }
            }
        }
        //小组话题
        DetachedCriteria detachedCriteria4 = DetachedCriteria.forClass(Discuss.class);
        detachedCriteria4.addOrder(Order.desc("scanNum")).createCriteria("team").add(Restrictions.eq("type", type)).add(Restrictions.eq("teamState", "批准"));
        List<Discuss> discussList = userService.queryMaxNumOfCondition(Discuss.class, detachedCriteria4, 4);

        //相关小组
        DetachedCriteria detachedCriteria5 = DetachedCriteria.forClass(Team.class);
        detachedCriteria5.addOrder(Order.desc("construction"));
        detachedCriteria5.add(Restrictions.eq("teamState", "批准"));
        detachedCriteria5.add(Restrictions.eq("type", type));
        List<Team> teamList = userService.queryMaxNumOfCondition(Team.class, detachedCriteria5, 6);
        //热门标签
        DetachedCriteria detachedCriteria6 = DetachedCriteria.forClass(Label.class);
        detachedCriteria6.addOrder(Order.desc("frequency"));
        List<Label> labelList = userService.queryMaxNumOfCondition(Label.class, detachedCriteria6, 8);

        request.setAttribute("majorCourseList", majorCourseList);
        request.setAttribute("hotCourseList", hotCourseList);
        request.setAttribute("newCourseList", newCourseList);
        request.setAttribute("teamList", teamList);
        request.setAttribute("labelList", labelList);
        request.setAttribute("type", type);
        request.setAttribute("discussList", discussList);
        return new ModelAndView("/homePage/majorHome");
    }
}