package com.hmit.kernes.controller;

import com.hmit.kernes.entity.AppAnnounceEntity;
import com.hmit.kernes.entity.AppAnnounceMapEntity;
import com.hmit.kernes.entity.CloudBaseInfoEntity;
import com.hmit.kernes.entity.SysUserEntity;
import com.hmit.kernes.service.AppAnnounceMapService;
import com.hmit.kernes.service.AppAnnounceService;
import com.hmit.kernes.service.CloudBaseInfoService;
import com.hmit.kernes.service.SysUserService;
import com.hmit.kernes.utils.*;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
import org.apache.commons.lang.StringUtils;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.beans.IntrospectionException;
import java.io.*;
import java.lang.reflect.InvocationTargetException;
import java.net.URLEncoder;
import java.text.ParseException;
import java.util.*;


@RestController
@RequestMapping("/app/announce")
public class AppAnnounceController  extends  AbstractController {
    public static final String DEFAULT_PASSWORD = "8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92";//123456
    @Autowired
    AppAnnounceService appAnnounceService;
    @Autowired
    AppAnnounceMapService appAnnounceMapService;
    @Autowired
    CloudBaseInfoService cloudBaseInfoService;
    @Autowired
    SysUserService sysUserService;
   static List<CloudBaseInfoEntity> staticCloudBaseInfoEntityList = new LinkedList<CloudBaseInfoEntity>();

    @RequestMapping("/list")
    @CrossOrigin("*")
    public R list(@RequestParam Map<String, Object> params) {

        Query query = new Query(params);
        List<AppAnnounceEntity> list = appAnnounceService.queryList(query);
        int total = appAnnounceService.queryTotal(query);
        PageUtils pageUtil = new PageUtils(list, total, query.getLimit(), query.getPage());
        return R.ok().put("page", pageUtil);
    }

    @RequestMapping("/userlist")
    public R userlist(@RequestParam Map<String, Object> params) {
        String tel = (String) params.get("tel");
        if (StringUtils.isBlank(tel)) {
            return R.error().put("msg", "手机号不能为空");
        }

        Query query = new Query(params);
        List<AppAnnounceEntity> list = appAnnounceService.queryUserList(query);
        int total = appAnnounceService.queryTotal(query);
        PageUtils pageUtil = new PageUtils(list, total, query.getLimit(), query.getPage());
        return R.ok().put("page", pageUtil);
    }


    @RequestMapping("/appshow")
    public R appshow() {
        AppAnnounceEntity appAnnounceEntity = appAnnounceService.queryAppShow();

        return R.ok().put("announce", appAnnounceEntity);
    }

    @RequestMapping("/info/{id}")
    public R info(@PathVariable("") Long id) {
        AppAnnounceEntity appAnnounceEntity = appAnnounceService.queryObject(id);

        return R.ok().put("announce", appAnnounceEntity);

    }

    @RequestMapping("/userinfo")
    public R userinfo(@RequestParam Map<String, Object> params) {
        String id = (String) params.get("id");
        if (StringUtils.isBlank(id))
            throw new RRException("id不能为空");
        String tel = (String) params.get("tel");
        if (StringUtils.isBlank(tel))
            throw new RRException("tel不能为空");
        AppAnnounceEntity appAnnounceEntity = appAnnounceService.queryUserObject(params);


        return R.ok().put("announce", appAnnounceEntity);

    }

    @RequestMapping("/save")
    public R save(@RequestBody AppAnnounceEntity appAnnounceEntity) {
        //数据校验
        //verifyForm();
        verify(appAnnounceEntity);
        appAnnounceService.saveBackId(appAnnounceEntity);
        Long i = appAnnounceEntity.getId();
        String title = "您有一条新通知,请查收";
        String context = appAnnounceEntity.getActDetail();
        if (context.length() > 50)
            context = context.substring(0, 50) + "...";
        String action = "183.247.237.44:8288/cy/cyLogin";

        List<AppAnnounceMapEntity> list = appAnnounceEntity.getList();
        //System.out.println(list.get(0).getAnnId());
        //System.out.println(list.get(0).getReceiveName());
        List<String> telList = new ArrayList<>();
        if (list != null && list.size() > 0) {
            for (int j = 0; j < list.size(); j++) {
                list.get(j).setAnnId(i);
                list.get(j).setIsRead(0);
                String tel = list.get(j).getReceiveTel();
                telList.add(tel);
            }
            try {
                CaiyunUtil.pushMsgToUser(title, context, action, telList);//推送
            } catch (Exception e) {
                e.printStackTrace();
            }
            appAnnounceMapService.saveBatch(list);
        }


        return R.ok();
    }

    @RequestMapping("/delete")
    public R delete(@RequestBody Long[] ids) {

        appAnnounceService.deleteBatch(ids);
        return R.ok();
    }

    @RequestMapping("/update")
    public R update(@RequestBody AppAnnounceEntity appAnnounceEntity) {
        //数据校验
        verify(appAnnounceEntity);

        appAnnounceService.update(appAnnounceEntity);

        return R.ok();
    }

    public void visitJsonArray(JSONObject jsonObject){
        System.out.println(jsonObject);
        String deptId=jsonObject.getString("deptId");
        JSONArray j = CaiyunUtil.getAllDeptList(deptId);
        if(j.size()!=0){
            for(int i=0;i<j.size();i++){
                if(!j.getJSONObject(i).getString("deptId").equals(deptId))
                    visitJsonArray(j.getJSONObject(i));
            }
        }
        if(jsonObject != null && !deptId.equals("0")) {
            CloudBaseInfoEntity cloudBaseInfoEntity = new CloudBaseInfoEntity();
            cloudBaseInfoEntity.setId(Long.parseLong(deptId));
            cloudBaseInfoEntity.setLocalUnionName(jsonObject.getString("name"));
            staticCloudBaseInfoEntityList.add(cloudBaseInfoEntity);
        }
    }
    @RequestMapping("/d")
    public R d() {
        JSONArray j = CaiyunUtil.getAllDeptList("26");
        System.out.println(j);
        return R.ok();
    }


    @RequestMapping("/c")
    public R c() {
        List<CloudBaseInfoEntity> cloudBaseInfoEntityList = new LinkedList<CloudBaseInfoEntity>();
        JSONArray jsonArray = CaiyunUtil.getAllUserList();
        staticCloudBaseInfoEntityList=new LinkedList<>();
        JSONObject jsonObjectWithDept=new JSONObject();
        jsonObjectWithDept.put("deptId","0");
        visitJsonArray(jsonObjectWithDept);

        List<Long> longList = new LinkedList<Long>();
        for (CloudBaseInfoEntity cloudBaseInfoEntity:staticCloudBaseInfoEntityList) {


            cloudBaseInfoEntityList.add(cloudBaseInfoEntity);
            if (cloudBaseInfoService.queryObject(cloudBaseInfoEntity.getId()) == null) {
                cloudBaseInfoService.saveWithId(cloudBaseInfoEntity);
            } else {
                cloudBaseInfoService.update(cloudBaseInfoEntity);
            }


        }


        //  cloudBaseInfoService.deleteBatch(longList.toArray());
        // cloudBaseInfoService.saveListByFancy(cloudBaseInfoEntityList);


        for (int i = 0; i < jsonArray.size(); i++) {
            JSONObject jsonObject = jsonArray.getJSONObject(i);
            String tel = jsonObject.getString("mobile");
            SysUserEntity sysUserEntity = sysUserService.queryByTel(tel);
            System.out.println(jsonObject);
            if (sysUserEntity == null) {
                sysUserEntity=new SysUserEntity();
                sysUserEntity.setUnionId(Long.parseLong(jsonObject.getString("deptId")));
                sysUserEntity.setRealName(jsonObject.getString("name"));
                sysUserEntity.setUsername(jsonObject.getString("mobile"));
                sysUserEntity.setMobile(jsonObject.getString("mobile"));
                sysUserEntity.setStatus(1);
                sysUserEntity.setCreateUserId(1l);
                sysUserEntity.setCreateTime(new Date());
                sysUserEntity.setPassword(DEFAULT_PASSWORD);
                sysUserEntity.setRoleIdList(longList);
                sysUserService.save(sysUserEntity);

            } else {
                String name = jsonObject.getString("name");
                sysUserEntity.setRoleIdList(longList);
                sysUserEntity.setRealName(name);
                sysUserEntity.setUnionId(Long.parseLong(jsonObject.getString("deptId")));
                sysUserService.update(sysUserEntity);

            }


            // System.out.println(jsonObject);
        }
        return R.ok();
    }




    @ResponseBody
    @RequestMapping("/uploadfile")
    public R uploadfile(@RequestParam("file") MultipartFile file, HttpServletRequest request) throws Exception {

        String url = request.getSession().getServletContext().getRealPath("file/");

        if (file.isEmpty()) {
            throw new RRException("上传文件不能为空");
        }
        try{
            url = url.replaceAll("/", "\\\\");
            String fileName = file.getOriginalFilename();
            File file3 = new File(url);
            if ((!file3.exists()) && (!file3.isDirectory())) {
                file3.mkdir();
            }
            File file2 = new File(file3, fileName);
            InputStream in = file.getInputStream();
            FileOutputStream fos = new FileOutputStream(file2);
            BufferedOutputStream bos = new BufferedOutputStream(fos);
            int b = -1;
            byte[] buffer = new byte[10485760];
            while ((b = in.read(buffer)) != -1) {
                bos.write(buffer, 0, b);
            }
            bos.flush();
            bos.close();
            fos.close();
            in.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return R.ok();
    }
    @ResponseBody
    @RequestMapping("/delfile")
    public R delpho(@RequestBody String filename, HttpServletRequest request) throws Exception {

        String url = request.getSession().getServletContext().getRealPath("file/");

        if (StringUtils.isBlank(filename)) {
            return R.error().put("msg","删除目标文件名不能为空");

        }
        try{
            url = url.replaceAll("/", "\\\\");
            String fileName =filename;
            File file4 = new File(url+"\\" +fileName);
            // System.out.println(url+fileName);
            if ((file4.isFile()) && (file4.exists())) {
                file4.delete();
                return R.ok();
            }else {
                return R.error().put("msg","目标文件不存在");

            }

        } catch (Exception e) {
            e.printStackTrace();
        }
        return R.ok();
    }


    @RequestMapping("/output")
    public R  output(@RequestParam String id, HttpServletRequest request, HttpServletResponse response)throws ClassNotFoundException, IntrospectionException, IllegalAccessException, ParseException, InvocationTargetException {
        AppAnnounceEntity appAnnounceEntity=appAnnounceService.queryObject(id);
       // List<AppAnnounceMapEntity> mapEntityList=appAnnounceEntity.getList();
        response.reset();
        XSSFWorkbook xssfWorkbook=null;
        xssfWorkbook=exportExcelInfo(appAnnounceEntity);
        OutputStream output;
        StringBuilder sb=new StringBuilder();
        if(appAnnounceEntity.getType()==1){
            sb.append("会议通知:");
        }else if(appAnnounceEntity.getType()==2){
            sb.append("事务公告:");
        }else{
            sb.append("类型 未知:");
        }
        sb.append(appAnnounceEntity.getActName());
        sb.append("(");
        sb.append(DateUtils.format(appAnnounceEntity.getPostTime(),"yyyy-MM-dd"));
        sb.append(")");
        sb.append(".xlsx");
        String filename="";
        try {
            filename = URLEncoder.encode(sb.toString(), "UTF-8");
            }catch (UnsupportedEncodingException e){
                e.printStackTrace();
        }

       // System.out.println(sb.toString());
      //  System.out.println(filename);

        response.setHeader("Content-disposition", "attachment; filename="+filename);
        response.setContentType("application/msexcel");
        try {
            output = response.getOutputStream();
            BufferedOutputStream bufferedOutPut = new BufferedOutputStream(output);
            bufferedOutPut.flush();
            xssfWorkbook.write(bufferedOutPut);

            bufferedOutPut.close();
        } catch (IOException e) {
            e.printStackTrace();
        }



        return  R.ok();

    }

    public XSSFWorkbook exportExcelInfo(AppAnnounceEntity appAnnounceEntity) throws InvocationTargetException, ClassNotFoundException, IntrospectionException, ParseException, IllegalAccessException {
        List<AppAnnounceMapEntity> mapEntityList=appAnnounceEntity.getList();


        List<ExcelBean> excel=new ArrayList<>();
        Map<Integer,List<ExcelBean>> map=new LinkedHashMap<>();
        XSSFWorkbook xssfWorkbook=null;

        excel.add(new ExcelBean("姓名", "receiveName", 0));
        excel.add(new ExcelBean("手机", "receiveTel", 1));
        excel.add(new ExcelBean("是否已读(0:未读,1:已读)", "isRead", 2));
        excel.add(new ExcelBean("是否参加(1:参加,2:不参加,0:未操作)", "isJoin", 3));
        excel.add(new ExcelBean("理由", "reason", 4));

        map.put(0,excel);
        String sheetName="sheetByFancy";
        xssfWorkbook=ExcelUtil.createExcelFile(AppAnnounceMapEntity.class,mapEntityList,map,sheetName);
        return xssfWorkbook;
    }
    public AppAnnounceEntity verify(AppAnnounceEntity a){
        a.setUpdateTime(new Date());

        return a;
    }

}