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 io.swagger.models.auth.In;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

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<>();
        if (!submitFile.getFileUrl().contains("xls")) {
            result.setSuccess(false);
            result.setMessage("请上传excel");
            return result;
        }
        try {
            SubmitFile beforeFile = submitService.getById(submitFile.getId());
            if (beforeFile.getFileUrl().equals(submitFile.getFileUrl())) {
                submitFile.setFileUrl(null);
            } else {
                List<Point> list = ExcelUtils.analysisExcel(submitFile.getFileUrl());
                submitFile.setList(list);
            }
            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();
        if (!submitFile.getFileUrl().contains("xls")) {
            result.setSuccess(false);
            result.setMessage("请上传excel");
            return result;
        }
        try {
            List<Point> list = ExcelUtils.analysisExcel(submitFile.getFileUrl());
            submitFile.setList(list);
            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<ReturnDto> createConsult(@RequestBody UniversityConsult universityConsult) {
        BaseDto<ReturnDto> result = new BaseDto();
        ReturnDto dto = new ReturnDto();
        List<Consult> list = consultService.selectByUniversityIdAndColumnType(universityConsult.getUniversityId(), universityConsult.getColumnType());
        if (list != null && list.size() > 0) {
            result.setSuccess(false);
            result.setMessage("同一栏目下,已有该学校招生咨询");
        } else {
            int id = consultService.create(universityConsult);
            try {
                String name = universityService.getById(universityConsult.getUniversityId()).getName();
                dto.setName(name);
            } catch (Exception e) {

            }
            dto.setId(id);
            result.setData(dto);
        }
        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<>();
        Page<Video> page = videoService.getList(videoSearchDto);
        result.setData(page);
        System.out.println("result:" + result.toString() + "----------page:" + page.toString());
        return result;
    }

    @MemberAccess
    @ApiOperation("新建视频相关接口")
    @RequestMapping(value = "/video/createVideo", method = RequestMethod.POST)
    public BaseDto<ReturnDto> createVideo(@RequestBody Video video) {
        BaseDto<ReturnDto> result = new BaseDto();
        ReturnDto dto = new ReturnDto();
        int id = videoService.create(video);
        try {
            String name = universityService.getById(video.getUniversityId()).getName();
            dto.setName(name);
            dto.setId(video.getUniversityId());
        } catch (Exception e) {

        }
        result.setData(dto);
        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) {
        BaseDto result = new BaseDto();
        Major before = majorService.getById(major.getId());
        if (before.getPid() == -1 && major.getPid() != -1) {
            result.setSuccess(false);
            result.setMessage("一级专业不能被设置成二级");
        } else {
            majorService.update(major);
        }
        return result;
    }

    @MemberAccess
    @ApiOperation("删除专业相关接口")
    @RequestMapping(value = "/major/delete", method = RequestMethod.POST)
    public BaseDto deleteMajor(@RequestBody IdDto idDto) {
        BaseDto result = new BaseDto();
        majorService.delete(idDto.getId());
        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.getAdminList(articleSearchDto);
        result.setData(page);
        return result;
    }

    @MemberAccess
    @ApiOperation("新建权威解读(文章广告)相关接口")
    @RequestMapping(value = "/article/createArticle", method = RequestMethod.POST)
    public BaseDto<Integer> createArticle(@RequestBody Article article) {
        BaseDto<Integer> result = new BaseDto();
        if (StringUtils.isBlank(article.getImageUrl())) {
            result.setSuccess(false);
            result.setMessage("请上传封面图片");
        } else {
            int id = articleService.create(article);
            result.setData(id);
        }
        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 {
            if (StringUtils.isNotBlank(dto.getUrl())) {
                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;
    }
}