package com.sincere.student.controller;

import com.sincere.student.access.MemberAccess;
import com.sincere.student.dto.*;
import com.sincere.student.enums.AdvertEnums;
import com.sincere.student.enums.ColumnEnums;
import com.sincere.student.enums.ParameterUtils;
import com.sincere.student.model.*;
import com.sincere.student.service.*;
import com.sincere.student.utils.ExcelUtils;
import com.sincere.student.utils.Page;
import com.sincere.student.utils.ResultException;
import com.sincere.student.utils.TokenUtils;
import io.swagger.annotations.ApiOperation;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.web.bind.annotation.*;

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

@RestController
@RequestMapping("admin")
public class AdminController {

    @Autowired
    ColumnService columnService ;

    @Autowired
    AdvertService advertService ;

    @Autowired
    ArticleService articleService ;

    @Autowired
    MajorService majorService ;

    @Autowired
    UniversityService universityService ;

    @Autowired
    ParameterService parameterService;

    @Autowired
    VideoService videoService ;

    @Autowired
    ConsultService consultService ;

    @Autowired
    UserService userService ;

    @Autowired
    MessageService messageService ;

    @Autowired
    SubmitService submitService;

    /**
     * 投档线
     */
    @MemberAccess
    @ApiOperation("投档线列表接口")
    @RequestMapping(value = "/submit/getList" , method = RequestMethod.POST)
    public BaseDto<Page<SubmitFile>> getFileList(@RequestBody MessageSearchDto messageSearchDto){
        BaseDto<Page<SubmitFile>> result = new BaseDto<>();
        result.setData(submitService.getAdminList(messageSearchDto));
        return result ;
    }

    @MemberAccess
    @ApiOperation("投档线删除接口")
    @RequestMapping(value = "/submit/delete" , method = RequestMethod.POST)
    public BaseDto deleteFile(@RequestBody IdDto idDto){
        BaseDto result = new BaseDto<>();
        submitService.delete(idDto.getId());
        return result ;
    }

    @MemberAccess
    @ApiOperation("投档线更新接口 ,如果文件没更新,fileUrl不用传")
    @RequestMapping(value = "/submit/update" , method = RequestMethod.POST)
    public BaseDto updateFile(@RequestBody SubmitFile submitFile){
        BaseDto result = new BaseDto<>();
        try{
            SubmitFile beforeFile = submitService.getById(submitFile.getId());
            if(beforeFile.getFileUrl().equals(submitFile.getFileUrl())){
                submitFile.setFileUrl(null);
            }else {
                List<Point> list = ExcelUtils.analysisExcel(submitFile.getFileUrl());
                List<Point> points = new ArrayList<>();
                for(Point point : list){
                    Integer universityId = universityService.selectByName(point.getUniversityName());
                    if(universityId == null){
                        throw new ResultException(902,point.getUniversityName()+"不存在");
                    }
                    point.setUniversityId(universityId);
                    Integer majorId = universityService.selectIdByMajor(point.getMajor(),universityId);
                    if(majorId == null){
                        throw new ResultException(902,point.getUniversityName()+"-"+point.getMajor()+"关系不存在");
                    }
                    point.setMajorId(majorId);
                    points.add(point);
                }
                submitFile.setList(points);
            }
            submitService.update(submitFile);
        }catch (ResultException e){
            result.setSuccess(false);
            result.setMessage(e.getMessage());
        }
        return result ;
    }

    @MemberAccess
    @ApiOperation("投档线创建接口")
    @RequestMapping(value = "/submit/createFile" , method = RequestMethod.POST)
    public BaseDto createFile(@RequestBody SubmitFile submitFile){
        BaseDto result = new BaseDto();
        try{
            List<Point> list = ExcelUtils.analysisExcel(submitFile.getFileUrl());
            List<Point> points = new ArrayList<>();
            for(Point point : list){
                Integer universityId = universityService.selectByName(point.getUniversityName());
                if(universityId == null){
                    throw new ResultException(902,point.getUniversityName()+"不存在");
                }
                point.setUniversityId(universityId);
                Integer majorId = universityService.selectIdByMajor(point.getMajor(),universityId);
                if(majorId == null){
                    throw new ResultException(902,point.getUniversityName()+"-"+point.getMajor()+"关系不存在");
                }
                point.setMajorId(majorId);
                points.add(point);
            }
            submitFile.setList(points);
            submitService.create(submitFile);
        }catch (ResultException e){
            e.printStackTrace();
            result.setSuccess(false);
            result.setMessage(e.getMessage());
        }
        return result ;
    }


    /**
     * 留言板
     */
    @MemberAccess
    @ApiOperation("留言板列表接口")
    @RequestMapping(value = "/message/getList" , method = RequestMethod.POST)
    public BaseDto<Page<Message>> getMessageList(@RequestBody MessageSearchDto messageSearchDto){
        BaseDto<Page<Message>> result = new BaseDto<>();
        result.setData(messageService.getList(messageSearchDto));
        return result ;
    }

    @MemberAccess
    @ApiOperation("留言板详情,管理回复 接口")
    @RequestMapping(value = "/message/getDetail" , method = RequestMethod.POST)
    public BaseDto<Message> getMessageDetail(@RequestBody IdDto idDto){
        BaseDto<Message> result = new BaseDto<>();
        result.setData(messageService.getDetail(idDto.getId()));
        return result ;
    }

    @MemberAccess
    @ApiOperation("回复接口")
    @RequestMapping(value = "/message/reply" , method = RequestMethod.POST)
    public BaseDto getMessageDetail(@RequestBody Reply reply){
        messageService.reply(reply);
        return new BaseDto() ;
    }

    @MemberAccess
    @ApiOperation("删除某个回复 接口")
    @RequestMapping(value = "/message/deleteReply" , method = RequestMethod.POST)
    public BaseDto<Message> deleteReply(@RequestBody IdDto idDto){
        messageService.deleteReply(idDto.getId());
        return new BaseDto<>() ;
    }

    @MemberAccess
    @ApiOperation("删除留言 接口")
    @RequestMapping(value = "/message/deleteMessage" , method = RequestMethod.POST)
    public BaseDto<Message> deleteMessage(@RequestBody IdDto idDto){
        messageService.deleteMessage(idDto.getId());
        return new BaseDto<>() ;
    }

    /**
     * 登录 修改密码
     */
    @ApiOperation("登录")
    @RequestMapping(value = "/login" , method = RequestMethod.POST)
    public BaseDto<String> login(@RequestBody SysUser sysUser){
        BaseDto<String> result = new BaseDto<>() ;
       SysUser user = userService.getByUser();
       if(user.getUserName().equals(sysUser.getUserName()) && user.getPassword().equals(sysUser.getPassword())){
           String token = TokenUtils.buildToken(user.getUserName());
           result.setData(token);
       }else {
           result.setSuccess(false);
           result.setMessage("账号密码错误");
       }
       return result ;
    }

    @MemberAccess
    @ApiOperation("修改密码")
    @RequestMapping(value = "/updatePassword" , method = RequestMethod.POST)
    public BaseDto updatePassword(@RequestBody SysUser sysUser){
        BaseDto result = new BaseDto() ;
        SysUser user = userService.getByUser();
        user.setPassword(sysUser.getPassword());
        userService.update(sysUser);
        return result ;
    }

    /**
     * 招生咨询会
     */
    @MemberAccess
    @ApiOperation("获取招生咨询会相关接口")
    @RequestMapping(value = "/consult/getList" , method = RequestMethod.POST)
    public BaseDto<Page<Consult>> getConsultList(@RequestBody ConsultSearchDto consultSearchDto){
        BaseDto<Page<Consult>> result = new BaseDto<>() ;
        consultSearchDto.setStatus(0);
        consultSearchDto.setColumnType(-1);
        Page<Consult> page = consultService.getList(consultSearchDto);
        result.setData(page);
        return result ;
    }

    @MemberAccess
    @ApiOperation("获取招生咨询会详情相关接口")
    @RequestMapping(value = "/consult/getDetail" , method = RequestMethod.POST)
    public BaseDto<Consult> getConsultDetail(@RequestBody IdDto idDto){
        BaseDto<Consult> result = new BaseDto<>() ;
        result.setData(consultService.getDetail(idDto.getId()));
        return result ;
    }

    @MemberAccess
    @ApiOperation("新建招生咨询会相关接口")
    @RequestMapping(value = "/consult/createConsult" , method = RequestMethod.POST)
    public BaseDto createConsult(@RequestBody UniversityConsult universityConsult){
        BaseDto result = new BaseDto() ;
        consultService.create(universityConsult);
        return result ;
    }

    @MemberAccess
    @ApiOperation("修改招生咨询会相关接口")
    @RequestMapping(value = "/consult/updateConsult" , method = RequestMethod.POST)
    public BaseDto updateConsult(@RequestBody UniversityConsult universityConsult){
        BaseDto result = new BaseDto() ;
        consultService.update(universityConsult);
        return result ;
    }

    @MemberAccess
    @ApiOperation("删除招生咨询会(传主键)")
    @RequestMapping(value = "/consult/delete" , method = RequestMethod.POST)
    public BaseDto deleteConsult(@RequestBody IdDto idDto){
        BaseDto result = new BaseDto() ;
        consultService.delete(idDto.getId());
        return result ;
    }

    /**
     * 视频
     */
    @MemberAccess
    @ApiOperation("获取视频相关接口")
    @RequestMapping(value = "/video/getList" , method = RequestMethod.POST)
    public BaseDto<Page<Video>> getVideoList(@RequestBody VideoSearchDto videoSearchDto){
        BaseDto<Page<Video>> result = new BaseDto<>() ;
        videoSearchDto.setStatus(0);
        Page<Video> page = videoService.getList(videoSearchDto);
        result.setData(page);
        return result ;
    }

    @MemberAccess
    @ApiOperation("新建视频相关接口")
    @RequestMapping(value = "/video/createVideo" , method = RequestMethod.POST)
    public BaseDto createVideo(@RequestBody Video video){
        BaseDto result = new BaseDto() ;
        videoService.create(video);
        return result ;
    }

    @MemberAccess
    @ApiOperation("修改视频相关接口")
    @RequestMapping(value = "/video/updateVideo" , method = RequestMethod.POST)
    public BaseDto updateVideo(@RequestBody Video video){
        BaseDto result = new BaseDto() ;
        videoService.update(video);
        return result ;
    }

    @MemberAccess
    @ApiOperation("删除视频(传主键)")
    @RequestMapping(value = "/video/delete" , method = RequestMethod.POST)
    public BaseDto deleteVideo(@RequestBody IdDto idDto){
        BaseDto result = new BaseDto() ;
        videoService.delete(idDto.getId());
        return result ;
    }

    /**
     * 联系我们
     */
    @MemberAccess
    @ApiOperation("联系我们")
    @RequestMapping(value = "/linkUs/getLinkUs" , method = RequestMethod.POST)
    public BaseDto<String> getLinkUs(){
        BaseDto<String> result = new BaseDto<>();
        Parameter parameter = parameterService.getByCode(ParameterUtils.link_us) ;
        if(parameter != null){
            result.setData(parameter.getMessage());
        }else {
            result.setSuccess(false);
            result.setMessage("还未设置联系我们的图片");
        }
        return result ;
    }

    @MemberAccess
    @ApiOperation("更新联系我们")
    @RequestMapping(value = "/linkUs/updateLinkUs" , method = RequestMethod.POST)
    public BaseDto updateLinkUs(@RequestBody LinkUsDto dto){
        BaseDto result = new BaseDto<>();
        Parameter parameter = parameterService.getByCode(ParameterUtils.link_us) ;
        if(parameter == null){
            parameter = new Parameter();
            parameter.setCode(ParameterUtils.link_us);
            parameter.setMessage(dto.getUrl());
            parameterService.create(parameter);
        }else {
            parameter.setMessage(dto.getUrl());
            parameterService.update(parameter);
        }
        return result ;
    }

    /**
     * 高校相关接口
     */
    @MemberAccess
    @ApiOperation("获取高校相关接口")
    @RequestMapping(value = "/university/getUniversityList" , method = RequestMethod.POST)
    public BaseDto<Page<University>> getUniversityList(@RequestBody UniversitySearchDto universitySearchDto){
        BaseDto<Page<University>> result = new BaseDto<>() ;
        Page<University> page = universityService.getList(universitySearchDto);
        result.setData(page);
        return result ;
    }

    @MemberAccess
    @ApiOperation("创建高校相关接口")
    @RequestMapping(value = "/university/createUniversity" , method = RequestMethod.POST)
    public BaseDto createUniversity(@RequestBody University university){
        universityService.create(university);
        return new BaseDto() ;
    }

    @MemberAccess
    @ApiOperation("更新高校相关接口")
    @RequestMapping(value = "/university/updateUniversity" , method = RequestMethod.POST)
    public BaseDto updateUniversity(@RequestBody University university){
        universityService.update(university);
        return new BaseDto() ;
    }

    @MemberAccess
    @ApiOperation("删除高校相关接口")
    @RequestMapping(value = "/university/delete" , method = RequestMethod.POST)
    public BaseDto deleteUniversity(@RequestBody IdDto idDto){
        BaseDto result = new BaseDto() ;
        universityService.delete(idDto.getId());
        return result ;
    }

    @MemberAccess
    @ApiOperation("高校添加专业相关接口")
    @RequestMapping(value = "/university/addMajor" , method = RequestMethod.POST)
    public BaseDto addMajor(@RequestBody List<UniversityMajor> list){
        universityService.addMajor(list);
        return new BaseDto();
    }

    /**
     * 专业相关接口
     */
    @MemberAccess
    @ApiOperation("获取专业相关接口")
    @RequestMapping(value = "/major/getMajorList" , method = RequestMethod.POST)
    public BaseDto<Page<Major>> getMajorList(@RequestBody MajorSearchDto majorSearchDto){
        BaseDto<Page<Major>> result = new BaseDto<>();
        Page<Major> page = majorService.getList(majorSearchDto);
        result.setData(page);
        return result ;
    }

    @MemberAccess
    @ApiOperation("获取专业列表  一级二级关系列表")
    @RequestMapping(value = "/major/getList" , method = RequestMethod.POST)
    public BaseDto<List<Major>> majorGetList(){
        BaseDto<List<Major>> result = new BaseDto<>();
        result.setData(majorService.selectMajor());
        return result ;
    }

    @MemberAccess
    @ApiOperation("新增专业相关接口")
    @RequestMapping(value = "/major/createMajor" , method = RequestMethod.POST)
    public BaseDto createMajor(@RequestBody Major major){
        majorService.create(major);
        return new BaseDto() ;
    }

    @MemberAccess
    @ApiOperation("修改专业相关接口")
    @RequestMapping(value = "/major/updateMajor" , method = RequestMethod.POST)
    public BaseDto updateMajor(@RequestBody Major major){
        majorService.update(major);
        return new BaseDto() ;
    }

    @MemberAccess
    @ApiOperation("删除专业相关接口")
    @RequestMapping(value = "/major/delete" , method = RequestMethod.POST)
    public BaseDto deleteMajor(@RequestBody IdDto idDto){
        BaseDto result = new BaseDto() ;
        MajorSearchDto majorSearchDto = new MajorSearchDto() ;
        majorSearchDto.setPid(idDto.getId());
        Page<Major> page = majorService.getList(majorSearchDto);
        if(page.getCount() == 0){
            majorService.delete(idDto.getId());
        }else {
            result.setSuccess(false);
            result.setMessage("还有下级专业,删除失败");
        }
        return result ;
    }



    /**
     *权威解读(文章广告)相关接口
     */
    @MemberAccess
    @ApiOperation("获取权威解读(文章广告)相关接口")
    @RequestMapping(value = "/article/getList" , method = RequestMethod.POST)
    public BaseDto<Page<Article>> getArticleList(@RequestBody ArticleSearchDto articleSearchDto){
        BaseDto<Page<Article>> result = new BaseDto<>() ;
        articleSearchDto.setStatus(0);
        Page<Article> page = articleService.getList(articleSearchDto);
        result.setData(page);
        return result ;
    }

    @MemberAccess
    @ApiOperation("新建权威解读(文章广告)相关接口")
    @RequestMapping(value = "/article/createArticle" , method = RequestMethod.POST)
    public BaseDto createArticle(@RequestBody Article article){
        BaseDto result = new BaseDto() ;
        if(StringUtils.isBlank(article.getImageUrl())){
            result.setSuccess(false);
            result.setMessage("请上传封面图片");
        }else {
            articleService.create(article);
        }
        return result ;
    }

    @MemberAccess
    @ApiOperation("修改权威解读(文章广告)相关接口")
    @RequestMapping(value = "/article/updateArticle" , method = RequestMethod.POST)
    public BaseDto updateArticle(@RequestBody Article article){
        BaseDto result = new BaseDto() ;
        articleService.update(article);
        return result ;
    }

    @MemberAccess
    @ApiOperation("删除权威解读(文章广告)(传主键)")
    @RequestMapping(value = "/article/delete" , method = RequestMethod.POST)
    public BaseDto deleteArticle(@RequestBody IdDto idDto){
        BaseDto result = new BaseDto() ;
        articleService.delete(idDto.getId());
        return result ;
    }


    /**
     * 广告相关接口
     */
    @MemberAccess
    @ApiOperation("获取开屏图片")
    @RequestMapping(value = "/advert/getScreen" , method = RequestMethod.POST)
    public BaseDto<Advert> getScreen(){
        BaseDto<Advert> result = new BaseDto<>() ;
        result.setData(advertService.getScreen());
        return result ;
    }

    @MemberAccess
    @ApiOperation("更新上传开屏图片")
    @RequestMapping(value = "/advert/updateScreen" , method = RequestMethod.POST)
    public BaseDto updateScreen(@RequestBody LinkUsDto dto){
        Advert advert = advertService.getScreen() ;
        if(advert == null){
            Advert temp =new Advert();
            temp.setSort(1);
            temp.setType(AdvertEnums.screen.getType());
            temp.setImgUrl(dto.getUrl());
            temp.setUrlLink(dto.getUrlLink());
            advertService.create(temp);
        }else {
            advert.setImgUrl(dto.getUrl());
            advert.setUrlLink(dto.getUrlLink());
            advertService.update(advert);
        }
        return new BaseDto() ;
    }

    @MemberAccess
    @ApiOperation("获取banner")
    @RequestMapping(value = "/advert/getBanner" , method = RequestMethod.POST)
    public BaseDto<List<Advert>> getBanner(){
        BaseDto<List<Advert>> result = new BaseDto<>() ;
        result.setData(advertService.getBanner());
        return result ;
    }

    @MemberAccess
    @ApiOperation("上传banner")
    @RequestMapping(value = "/advert/createBanner" , method = RequestMethod.POST)
    public BaseDto createBanner(@RequestBody Advert advert){
        BaseDto result = new BaseDto();
        if(StringUtils.isBlank(advert.getImgUrl())){
            result.setSuccess(false);
            result.setMessage("图片地址不能为空");
        }else {
            advert.setType(AdvertEnums.banner.getType());
            advertService.create(advert);
        }
        return result ;
    }

    @MemberAccess
    @ApiOperation("更新banner")
    @RequestMapping(value = "/advert/updateBanner" , method = RequestMethod.POST)
    public BaseDto updateBanner(@RequestBody Advert advert){
        BaseDto result = new BaseDto();
        advert.setType(AdvertEnums.banner.getType());
        advertService.update(advert);
        return result ;
    }

    @MemberAccess
    @ApiOperation("删除banner(传主键)")
    @RequestMapping(value = "/advert/delete" , method = RequestMethod.POST)
    public BaseDto deleteBanner(@RequestBody IdDto idDto){
        BaseDto result = new BaseDto() ;
        advertService.delete(idDto.getId());
        return result ;
    }


    /**
     * 栏目相关接口
     */
    @MemberAccess
    @ApiOperation("获取栏目列表(1 文章 2学校 3视频)")
    @RequestMapping(value = "/column/getList" , method = RequestMethod.POST)
    public BaseDto<List<ColumnType>> getColumnList(@RequestBody ColumnDto columnDto){
        BaseDto<List<ColumnType>> result = new BaseDto<>();
        ColumnEnums columnEnums = ColumnEnums.getByType(columnDto.getType());
        if(columnEnums != null){
            List<ColumnType> data = columnService.getList(columnDto);
            result.setData(data);
        }else {
            result.setSuccess(false);
            result.setMessage("类型不匹配");
        }
        return result ;
    }

    @MemberAccess
    @ApiOperation("创建栏目(type : 1 文章 2学校 3视频)")
    @RequestMapping(value = "/column/create" , method = RequestMethod.POST)
    public BaseDto createColumn(@RequestBody ColumnType columnType){
        BaseDto result = new BaseDto() ;
        columnService.create(columnType);
        return result ;
    }

    @MemberAccess
    @ApiOperation("获取详情 栏目")
    @RequestMapping(value = "/column/getDetail" , method = RequestMethod.POST)
    public BaseDto createColumn(@RequestBody IdDto idDto){
        BaseDto result = new BaseDto() ;
        ColumnType c = columnService.selectDetail(idDto.getId());
        return result ;
    }

    @MemberAccess
    @ApiOperation("更新栏目(type : 1 文章 2学校 3视频)")
    @RequestMapping(value = "/column/update" , method = RequestMethod.POST)
    public BaseDto updateColumn(@RequestBody ColumnType columnType){
        BaseDto result = new BaseDto() ;
        if(columnType.getId() > 0){
            columnService.update(columnType);
        }else {
            result.setSuccess(false);
            result.setMessage("id没传");
        }
        return result ;
    }

    @MemberAccess
    @ApiOperation("删除栏目(传主键)")
    @RequestMapping(value = "/column/delete" , method = RequestMethod.POST)
    public BaseDto deleteColumn(@RequestBody IdDto idDto){
        BaseDto result = new BaseDto() ;
        int id = idDto.getId() ;
        ColumnType columnType = columnService.selectDetail(id);
        if(columnType.getType() == ColumnEnums.article.getType()){
            ArticleSearchDto articleSearchDto = new ArticleSearchDto();
            articleSearchDto.setColumnType(columnType.getId());
            articleSearchDto.setPage(1);
            articleSearchDto.setPageSize(10);
            Page<Article> articlePage = articleService.getList(articleSearchDto);
            if(articlePage.getCount() > 0){
                result.setSuccess(false);
                result.setMessage("还有关联的权威解读,无法删除");
            }else {
                columnService.delete(id);
            }
        }else if(columnType.getType() == ColumnEnums.university.getType()){
            Page<Consult> consultPage =consultService.getColumnList(columnType.getId(),1,10);
            if(consultPage.getCount() > 0){
                result.setSuccess(false);
                result.setMessage("还有关联的招生咨询会信息,无法删除");
            }else {
                columnService.delete(id);
            }
        }else if(columnType.getType() == ColumnEnums.video.getType()){
            VideoSearchDto videoSearchDto = new VideoSearchDto();
            videoSearchDto.setColumnType(columnType.getId());
            videoSearchDto.setPage(1);
            videoSearchDto.setPageSize(10);
            Page<Video> videoPage = videoService.getList(videoSearchDto);
            if(videoPage.getCount() > 0){
                result.setSuccess(false);
                result.setMessage("还有关联的视频,无法删除");
            }else {
                columnService.delete(id);
            }
        }else {
            columnService.delete(id);
        }
        return result ;
    }
}