package com.ruoyi.report.controller;

import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletResponse;

import org.apache.poi.util.IOUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.report.domain.RzlIpcStatisticsInfo;
import com.ruoyi.report.service.IRzlIpcStatisticsInfoExcel;
import com.ruoyi.report.service.IRzlIpcStatisticsInfoService;
import com.ruoyi.report.vo.IpcStatisticsInfo;
import com.ruoyi.report.vo.IpcStatisticsInfoVo;

/**
 * 专利有效-主IPC统计Controller
 *
 * @author ruoyi
 * @date 2023-03-26
 */
@RestController
@RequestMapping("/report/rzlIpcStatisticsInfo")
public class RzlIpcStatisticsInfoController extends BaseController {
	private final IRzlIpcStatisticsInfoService rzlIpcStatisticsInfoService;
	
	@Autowired
	private IRzlIpcStatisticsInfoExcel rzlIpcStatisticsInfoExcel;

	public RzlIpcStatisticsInfoController(IRzlIpcStatisticsInfoService rzlIpcStatisticsInfoService) {
		this.rzlIpcStatisticsInfoService = rzlIpcStatisticsInfoService;
	}

	/**
	 * 查询专利有效-主IPC统计列表
	 *
	 * @param rzlIpcStatisticsInfo 专利有效-主IPC统计
	 * @return 专利有效-主IPC统计集合
	 * @date 2023-03-26
	 */
	@PreAuthorize("@ss.hasPermi('report:rzlIpcStatisticsInfo:list')")
	@GetMapping("/list")
	public TableDataInfo list(RzlIpcStatisticsInfo rzlIpcStatisticsInfo) {
//        startPage();
//        List<RzlIpcStatisticsInfo> list = rzlIpcStatisticsInfoService.queryList(rzlIpcStatisticsInfo);
		List<IpcStatisticsInfoVo> list = rzlIpcStatisticsInfoService.listByReport(rzlIpcStatisticsInfo);

		if (null != list && list.size() > 0) {
			IpcStatisticsInfoVo sum = new IpcStatisticsInfoVo();
			sum.setType("-");
			if ("ipc".equals(rzlIpcStatisticsInfo.getQueryIpc()) && "ipc".equals(rzlIpcStatisticsInfo.getQueryData())) {
				sum.setTypeName("A-H总计");
			} else {
				sum.setTypeName("总计");
			}
			sum.setDatas(new HashMap<String, IpcStatisticsInfo>());
			
			for (IpcStatisticsInfoVo vo : list) {
				if (vo.getDatas() == null || vo.getDatas().isEmpty()) {
					continue;
				}

				for (Map.Entry<String, IpcStatisticsInfo> ent : vo.getDatas().entrySet()) {
					IpcStatisticsInfo data=ent.getValue();
					String type = ent.getKey();
					if (sum.getDatas().containsKey(type)) {
						IpcStatisticsInfo sumData = sum.getDatas().get(type);
						sumData.setNumber(sumData.getNumber() + data.getNumber());
						sumData.setProportion( "100%");
						sumData.setHigherSchool(sumData.getHigherSchool()+data.getHigherSchool());
						sumData.setResearchInstitute(sumData.getResearchInstitute()+data.getResearchInstitute());
						sumData.setEnterprise(sumData.getEnterprise()+data.getEnterprise());
						sumData.setInstitutions(sumData.getInstitutions()+data.getInstitutions());
						sumData.setIndividual(sumData.getIndividual()+data.getIndividual());
						
					} else {
						IpcStatisticsInfo sumData = new IpcStatisticsInfo();
						sum.getDatas().put(type, sumData);
						sumData.setNumber(data.getNumber());
						sumData.setProportion( "100%");
						sumData.setHigherSchool(data.getHigherSchool());
						sumData.setResearchInstitute(data.getResearchInstitute());
						sumData.setEnterprise(data.getEnterprise());
						sumData.setInstitutions(data.getInstitutions());
						sumData.setIndividual(data.getIndividual());
						
					}
					
					
				}
			}
			
			for (IpcStatisticsInfoVo vo : list) {
				if (vo.getDatas() == null || vo.getDatas().isEmpty()) {
					continue;
				}
				for (Map.Entry<String, IpcStatisticsInfo> ent : vo.getDatas().entrySet()) {
					String type = ent.getKey();
					long total=sum.getDatas().get(type).getNumber();
					if(total>0) {
						 double prop = (ent.getValue().getNumber() * 100 + 0.0) / total;
			             ent.getValue().setProportion(String.format("%.2f", prop) + "%");
					}else {
						ent.getValue().setProportion("--");
					}
					
					
				}
				
			}

			list.add(sum);

		}
		
		
		 
//        try {
////			OutputStream out=new FileOutputStream(new File("D:\\temp\\exp"+System.currentTimeMillis()+".xlsx"));
//			OutputStream out=new FileOutputStream(new File("D:\\temp\\exp.xlsx"));
//			rzlIpcStatisticsInfoExcel.doExport(out,rzlIpcStatisticsInfo,list);
//			
//			IOUtils.closeQuietly(out);
//		} catch (Exception e) {
//			// TODO Auto-generated catch block
//			e.printStackTrace();
//		}

		return getDataTable(list);
	}

	/**
	 * 导出专利有效-主IPC统计列表
	 *
	 * @param rzlIpcStatisticsInfo 专利有效-主IPC统计
	 * @date 2023-03-26
	 */
	@PreAuthorize("@ss.hasPermi('report:rzlIpcStatisticsInfo:export')")
	@Log(title = "专利有效-主IPC统计", businessType = BusinessType.EXPORT)
	@PostMapping("/export")
	public void export(HttpServletResponse response, RzlIpcStatisticsInfo rzlIpcStatisticsInfo) {

//      startPage();
//      List<RzlIpcStatisticsInfo> list = rzlIpcStatisticsInfoService.queryList(rzlIpcStatisticsInfo);
		List<IpcStatisticsInfoVo> list = rzlIpcStatisticsInfoService.listByReport(rzlIpcStatisticsInfo);

		if (null != list && list.size() > 0) {
			IpcStatisticsInfoVo sum = new IpcStatisticsInfoVo();
			sum.setType("-");
			if ("ipc".equals(rzlIpcStatisticsInfo.getQueryIpc()) && "ipc".equals(rzlIpcStatisticsInfo.getQueryData())) {
				sum.setTypeName("A-H总计");
			} else {
				sum.setTypeName("总计");
			}
			sum.setDatas(new HashMap<String, IpcStatisticsInfo>());
			
			for (IpcStatisticsInfoVo vo : list) {
				if (vo.getDatas() == null || vo.getDatas().isEmpty()) {
					continue;
				}

				for (Map.Entry<String, IpcStatisticsInfo> ent : vo.getDatas().entrySet()) {
					IpcStatisticsInfo data=ent.getValue();
					String type = ent.getKey();
					if (sum.getDatas().containsKey(type)) {
						IpcStatisticsInfo sumData = sum.getDatas().get(type);
						sumData.setNumber(sumData.getNumber() + data.getNumber());
						sumData.setProportion( "100%");
						sumData.setHigherSchool(sumData.getHigherSchool()+data.getHigherSchool());
						sumData.setResearchInstitute(sumData.getResearchInstitute()+data.getResearchInstitute());
						sumData.setEnterprise(sumData.getEnterprise()+data.getEnterprise());
						sumData.setInstitutions(sumData.getInstitutions()+data.getInstitutions());
						sumData.setIndividual(sumData.getIndividual()+data.getIndividual());
						
					} else {
						IpcStatisticsInfo sumData = new IpcStatisticsInfo();
						sum.getDatas().put(type, sumData);
						sumData.setNumber(data.getNumber());
						sumData.setProportion( "100%");
						sumData.setHigherSchool(data.getHigherSchool());
						sumData.setResearchInstitute(data.getResearchInstitute());
						sumData.setEnterprise(data.getEnterprise());
						sumData.setInstitutions(data.getInstitutions());
						sumData.setIndividual(data.getIndividual());
						
					}
					
					
				}
			}
			
			for (IpcStatisticsInfoVo vo : list) {
				if (vo.getDatas() == null || vo.getDatas().isEmpty()) {
					continue;
				}
				for (Map.Entry<String, IpcStatisticsInfo> ent : vo.getDatas().entrySet()) {
					String type = ent.getKey();
					long total=sum.getDatas().get(type).getNumber();
					if(total>0) {
						 double prop = (ent.getValue().getNumber() * 100 + 0.0) / total;
			             ent.getValue().setProportion(String.format("%.2f", prop) + "%");
					}else {
						ent.getValue().setProportion("--");
					}
					
					
				}
				
			}

			list.add(sum);

		}
		
		
		 
      try {
//			OutputStream out=new FileOutputStream(new File("D:\\temp\\exp.xlsx"));
    	  response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
  		response.setCharacterEncoding("utf-8");
			rzlIpcStatisticsInfoExcel.doExport(response.getOutputStream(),rzlIpcStatisticsInfo,list);
			
			
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			logger.error("导出失败,"+e.getMessage(),e);
			throw new RuntimeException("导出失败，请联系管理员",e);
		}

	
	}

	/**
	 * 获取专利有效-主IPC统计详细信息
	 *
	 * @param id 主键id
	 * @return 结果
	 * @date 2023-03-26
	 */
	@PreAuthorize("@ss.hasPermi('report:rzlIpcStatisticsInfo:query')")
	@GetMapping(value = "/{id}")
	public AjaxResult getInfo(@PathVariable("id") Long id) {
		return AjaxResult.success(rzlIpcStatisticsInfoService.getById(id));
	}

	/**
	 * 新增专利有效-主IPC统计信息
	 *
	 * @param rzlIpcStatisticsInfo 专利有效-主IPC统计
	 * @return 结果
	 * @date 2023-03-26
	 */
	@PreAuthorize("@ss.hasPermi('report:rzlIpcStatisticsInfo:add')")
	@Log(title = "专利有效-主IPC统计", businessType = BusinessType.INSERT)
	@PostMapping
	public AjaxResult add(@RequestBody RzlIpcStatisticsInfo rzlIpcStatisticsInfo) {
		return toAjax(rzlIpcStatisticsInfoService.save(rzlIpcStatisticsInfo));
	}

	/**
	 * 修改专利有效-主IPC统计信息
	 *
	 * @param rzlIpcStatisticsInfo 专利有效-主IPC统计
	 * @return 结果
	 * @date 2023-03-26
	 */
	@PreAuthorize("@ss.hasPermi('report:rzlIpcStatisticsInfo:edit')")
	@Log(title = "专利有效-主IPC统计", businessType = BusinessType.UPDATE)
	@PutMapping
	public AjaxResult edit(@RequestBody RzlIpcStatisticsInfo rzlIpcStatisticsInfo) {
		return toAjax(rzlIpcStatisticsInfoService.updateById(rzlIpcStatisticsInfo));
	}

	/**
	 * 删除专利有效-主IPC统计信息
	 *
	 * @param ids 主键ids
	 * @return 结果
	 * @date 2023-03-26
	 */
	@PreAuthorize("@ss.hasPermi('report:rzlIpcStatisticsInfo:remove')")
	@Log(title = "专利有效-主IPC统计", businessType = BusinessType.DELETE)
	@DeleteMapping("/{ids}")
	public AjaxResult remove(@PathVariable Long[] ids) {
		return toAjax(rzlIpcStatisticsInfoService.removeByIds(Arrays.asList(ids)));
	}

}
