package org.springblade.modules.controller;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
import jakarta.servlet.http.HttpServletResponse;
import lombok.AllArgsConstructor;
import org.springblade.core.excel.util.ExcelUtil;
import org.springblade.core.mp.support.Condition;
import org.springblade.core.secure.BladeUser;
import org.springblade.core.secure.utils.AuthUtil;
import org.springblade.core.tool.api.R;
import org.springblade.core.tool.constant.BladeConstant;
import org.springblade.core.tool.utils.BeanUtil;
import org.springblade.core.tool.utils.DateUtil;
import org.springblade.modules.entity.*;
import org.springblade.modules.excel.SyfwExcel;
import org.springblade.modules.feign.RhzfFwLsFeign;
import org.springblade.modules.feign.RhzfFzLsFeign;
import org.springblade.modules.feign.RhzfRyLsFeign;
import org.springblade.modules.service.SyfwService;
import org.springblade.modules.vo.FzLsVO;
import org.springframework.web.bind.annotation.*;
import org.springblade.core.mp.support.Query;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

@RestController
@AllArgsConstructor
@RequestMapping("api")
public class SyfwController {

	private SyfwService syfwService;

	private RhzfFwLsFeign rhzfFwLsFeign;

	private RhzfFzLsFeign rhzfFzLsFeign;

	private RhzfRyLsFeign rhzfRyLsFeign;

	@GetMapping("page")
	public R page(@RequestParam Map<String, Object> params, Query query) {
		params.put("deptId", AuthUtil.getDeptId());
		List<SyfwEntity> list = syfwService.getMphxlhByLdphxlh(params);
		if (list.size() > 0) {
			IPage<SyfwEntity> page = new Page<>();
			List<SyfwEntity> fwList = new ArrayList<>();
			for (SyfwEntity fwInfoVO:list) {
				SyfwEntity fw = syfwService.selectFwInfo(params, fwInfoVO.getDzbm());
				if (fw != null) {
					fwList.add(fw);
				}
			}
			List<SyfwEntity> subList = fwList.stream().skip((query.getCurrent() - 1) * query.getSize()).limit(query.getSize()).collect(Collectors.toList());
			page.setRecords(subList).setTotal(fwList.size()).setSize(query.getSize()).setCurrent(query.getCurrent());
			return R.data(page);
		}
		IPage<SyfwEntity> page = syfwService.selectSyfwPage(Condition.getPage(query), params);
		return R.data(page);
	}

	/**
	 * 实有房屋详情
	 */
	@GetMapping("Detail")
	public R syfwDetail(@RequestParam Map<String, Object> params) {
		SyfwEntity syfw = syfwService.bzdzDetail(params);
		if (syfw != null) {
			List<FzLsVO> list = syfwService.selectFzLs(syfw.getFzid());
			syfw.setFzls(list);
		}
		return R.data(syfw);
	}

	/**
	 * 房主修改
	 */
	@PostMapping("fzUpdate")
	public R fzUpdate(@RequestBody SyfwEntity syfwEntity) {
		SyfwEntity fz = syfwService.selectByFzId(syfwEntity.getFzid());
		if (fz != null) {
			fz.setCreateUser(AuthUtil.getUserId());
			fz.setCreateDept(Long.valueOf(AuthUtil.getDeptId()));
			syfwService.fzlsSave(fz);
		}
		syfwEntity.setUpdateUser(AuthUtil.getUserId());
		return R.data(syfwService.fzUpdate(syfwEntity));
	}

	/**
	 * 导出数据
	 */
	@GetMapping("/export-syfwInfo")
	public void exportSyfwInfo(@RequestParam Map<String, Object> syfwInfo, HttpServletResponse response) {
		List<SyfwExcel> list = syfwService.exportSyfwInfo(syfwInfo);
		ExcelUtil.export(response, "实有房屋" + DateUtil.time(), "实有房屋", list, SyfwExcel.class);
	}

	/**
	 * 房屋注销
	 */
	@PostMapping("fwzx")
	public R fwzx(@RequestBody SyfwEntity syfwEntity) {
		syfwService.updateFwzxById(syfwEntity.getId(), AuthUtil.getUserId(), syfwEntity.getZxyy());
		// 保存房屋历史
		FwLsEntity fw = syfwService.selectFw(syfwEntity.getId());
		rhzfFwLsFeign.fwlsSave(fw);
		// 注销房主
		syfwService.updateFzxz(syfwEntity.getId(), AuthUtil.getUserId(), syfwEntity.getZxyy());
		// 保存房主历史
		FzLsEntity fz = syfwService.selectFz(syfwEntity.getId());
		rhzfFzLsFeign.fzlsSave(fz);
		// 注销常住人口
		RhzfRyLsEntity ryLs = new RhzfRyLsEntity();
		syfwService.updateCzrkzx(syfwEntity.getId(), AuthUtil.getUserId(), syfwEntity.getZxyy());
		List<RyCzrkEntity> czrk = syfwService.selectCzrk(syfwEntity.getId());
		if (czrk.size() > 0) {
			for (RyCzrkEntity ryCzrk:czrk) {
				BeanUtil.copyProperties(ryCzrk, ryLs);
				rhzfRyLsFeign.rylsSave(ryLs);
			}
		}
		syfwService.updateJwrkzx(syfwEntity.getId(), AuthUtil.getUserId(), syfwEntity.getZxyy());
		List<RyJwrkEntity> jwrk = syfwService.selectJwrk(syfwEntity.getId());
		if (jwrk.size() > 0) {
			for (RyJwrkEntity ryJwrk:jwrk) {
				BeanUtil.copyProperties(ryJwrk, ryLs);
				rhzfRyLsFeign.rylsSave(ryLs);
			}
		}
		syfwService.updateJzrkzx(syfwEntity.getId(), AuthUtil.getUserId(), syfwEntity.getZxyy());
		List<RyJzrkEntity> jzrk = syfwService.selectJzrk(syfwEntity.getId());
		if (jzrk.size() > 0) {
			for (RyJzrkEntity ryJzrk:jzrk) {
				BeanUtil.copyProperties(ryJzrk, ryLs);
				rhzfRyLsFeign.rylsSave(ryLs);
			}
		}
		syfwService.updateWlrkzx(syfwEntity.getId(), AuthUtil.getUserId(), syfwEntity.getZxyy());
		List<RyWlrkEntity> wlrk = syfwService.selectWlrk(syfwEntity.getId());
		if (wlrk.size() > 0) {
			for (RyWlrkEntity ryWlrk:wlrk) {
				BeanUtil.copyProperties(ryWlrk, ryLs);
				rhzfRyLsFeign.rylsSave(ryLs);
			}
		}
		syfwService.updateZzrkzx(syfwEntity.getId(), AuthUtil.getUserId(), syfwEntity.getZxyy());
		List<RyZzrkEntity> zzrk = syfwService.selectZzrk(syfwEntity.getId());
		if (zzrk.size() > 0) {
			for (RyZzrkEntity ryZzrk:zzrk) {
				BeanUtil.copyProperties(ryZzrk, ryLs);
				rhzfRyLsFeign.rylsSave(ryLs);
			}
		}
		syfwService.updateFwRyzx(syfwEntity.getId(), AuthUtil.getUserId());
		return R.data("操作成功");
	}
}
