/**
 * BladeX Commercial License Agreement
 * Copyright (c) 2018-2099, https://bladex.cn. All rights reserved.
 * <p>
 * Use of this software is governed by the Commercial License Agreement
 * obtained after purchasing a license from BladeX.
 * <p>
 * 1. This software is for development use only under a valid license
 * from BladeX.
 * <p>
 * 2. Redistribution of this software's source code to any third party
 * without a commercial license is strictly prohibited.
 * <p>
 * 3. Licensees may copyright their own code but cannot use segments
 * from this software for such purposes. Copyright of this software
 * remains with BladeX.
 * <p>
 * Using this software signifies agreement to this License, and the software
 * must not be used for illegal purposes.
 * <p>
 * THIS SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY. The author is
 * not liable for any claims arising from secondary or illegal development.
 * <p>
 * Author: Chill Zhuang (bladejava@qq.com)
 */
package org.springblade.modules.nh.controller;

import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import io.swagger.v3.oas.annotations.tags.Tag;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
import lombok.AllArgsConstructor;
import jakarta.validation.Valid;

import org.springblade.core.secure.BladeUser;
import org.springblade.core.secure.annotation.PreAuth;
import org.springblade.core.mp.support.Condition;
import org.springblade.core.mp.support.Query;
import org.springblade.core.secure.utils.AuthUtil;
import org.springblade.core.tool.api.R;
import org.springblade.core.tool.utils.Func;
import org.springblade.core.tool.utils.StringUtil;
import org.springblade.modules.nh.excel.StationStaticsExcel;
import org.springblade.modules.nh.pojo.entity.MonitorEntryStatEntity;
import org.springblade.modules.nh.pojo.entity.PowerStationEntity;
import org.springblade.modules.nh.pojo.vo.PowerStationVO;
import org.springblade.modules.nh.pojo.vo.StationStaticsVO;
import org.springblade.modules.nh.service.IAlarmInfoService;
import org.springblade.modules.nh.service.IPowerStationService;
import org.springblade.modules.nh.wrapper.PowerStationWrapper;
import org.springblade.modules.operation.mapper.OperationSiteEmployeeMapper;
import org.springblade.modules.operation.pojo.entity.OperationSiteEntity;
import org.springblade.modules.operation.pojo.vo.EmpAuthVo;
import org.springblade.modules.operation.service.IOperationSiteService;
import org.springblade.modules.operation.service.impl.OperationSiteServiceImpl;
import org.springblade.modules.operation.service.impl.PlatformEmployeeServiceImpl;
import org.springframework.web.bind.annotation.*;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import org.springblade.modules.nh.pojo.entity.PowerStationInefficientEntity;
import org.springblade.modules.nh.pojo.vo.PowerStationInefficientVO;
import org.springblade.modules.nh.excel.PowerStationInefficientExcel;
import org.springblade.modules.nh.wrapper.PowerStationInefficientWrapper;
import org.springblade.modules.nh.service.IPowerStationInefficientService;
import org.springblade.core.boot.ctrl.BladeController;
import org.springblade.core.tool.utils.DateUtil;
import org.springblade.core.excel.util.ExcelUtil;
import org.springblade.core.tool.constant.BladeConstant;
import org.springblade.core.tool.constant.RoleConstant;

import java.time.LocalDate;
import java.util.Map;
import java.util.List;
import jakarta.servlet.http.HttpServletResponse;

/**
 * 低效电站 控制器
 *
 * @author AlexWang
 * @since 2024-06-14
 */
@RestController
@AllArgsConstructor
@RequestMapping("nh/powerStationInefficient")
@Tag(name = "低效电站", description = "低效电站接口")
public class PowerStationInefficientController extends BladeController {

	private final IPowerStationInefficientService powerStationInefficientService;
	private final IPowerStationService powerStationService;
	private final IAlarmInfoService alarmInfoService;

	private final OperationSiteServiceImpl siteService;
	private final OperationSiteEmployeeMapper employeeMapper;
	private final PlatformEmployeeServiceImpl platformEmployeeService;

	/**
	 * 电站 分页
	 */
	@GetMapping("/stationStatics")
	@ApiOperationSupport(order = 2)
	@Operation(summary = "分页", description  = "传入powerStation")
	public R<IPage<StationStaticsVO>> stationStatics(@Parameter(hidden = true) @RequestParam Map<String, Object> powerStation, Query query) {
		Integer year = LocalDate.now().getYear();
		if(powerStation.containsKey("year")){
			year = Integer.valueOf(powerStation.get("year").toString());
			powerStation.remove("year");
		}

		QueryWrapper<PowerStationEntity> queryWrapper =Condition.getQueryWrapper(powerStation, PowerStationEntity.class);
		queryWrapper.lambda()
			//.inSql(PowerStationEntity::getOutStationId,"select out_station_id from nh_monitor_entry_stat where  eta > 0 ");
			.eq(PowerStationEntity::getApplyStatus,1);

		BladeUser user = AuthUtil.getUser();
		if ("3".equals(user.getDeptId())) {  //服务商
			OperationSiteEntity site = siteService.findSiteByUserId(user.getUserId());
			queryWrapper.lambda().eq(PowerStationEntity::getOmProviderId,site.getId());
		} else if ("5".equals(user.getDeptId())) {  //服务商人员
			EmpAuthVo authVo=employeeMapper.findEmpAuthByUserId(user.getUserId());
			queryWrapper.lambda().eq(PowerStationEntity::getOmProviderId,authVo.getSiteId());
		}else if("4".equals(user.getDeptId())){ //平台员工
			EmpAuthVo authVoP=platformEmployeeService.findPlatEmpAuthByUserId(user.getUserId());
			if(authVoP!= null){
				queryWrapper.lambda().eq(PowerStationEntity::getOmProviderId,authVoP.getSiteId());
			}
		}

		IPage<PowerStationEntity> pages = powerStationService.page(Condition.getPage(query), queryWrapper);
		IPage<StationStaticsVO> staticsPage = PowerStationWrapper.build().pageStaticsVO(pages);
		for(StationStaticsVO vo : staticsPage.getRecords()){
			vo.setYear(year);
			powerStationInefficientService.fillStaticsVO(vo);
		}
		return R.data(staticsPage);
	}

	/**
	 * 导出数据
	 */
	@GetMapping("/export-stationStatics")
	@ApiOperationSupport(order = 9)
	@Operation(summary = "导出数据", description  = "传入powerStationInefficient")
	public void exportStationStatics(@Parameter(hidden = true) @RequestParam Map<String, Object> powerStation, BladeUser bladeUser, HttpServletResponse response) {
		List<StationStaticsExcel> list = powerStationInefficientService.exportStationStatics(powerStation);
		ExcelUtil.export(response, "发电统计导出" + DateUtil.time(), "发电统计数据表", list, StationStaticsExcel.class);
	}

	/**
	 * 低效电站 详情
	 */
	@GetMapping("/detail")
	@ApiOperationSupport(order = 1)
	@Operation(summary = "详情", description  = "传入powerStationInefficient")
	public R<PowerStationInefficientVO> detail(PowerStationInefficientEntity powerStationInefficient) {
		PowerStationInefficientEntity detail = powerStationInefficientService.getOne(Condition.getQueryWrapper(powerStationInefficient));
		return R.data(PowerStationInefficientWrapper.build().entityVO(detail));
	}
	/**
	 * 低效电站 分页
	 */
	@GetMapping("/list")
	@ApiOperationSupport(order = 2)
	@Operation(summary = "分页", description  = "传入powerStationInefficient")
	public R<IPage<PowerStationInefficientVO>> list(@Parameter(hidden = true) @RequestParam Map<String, Object> powerStationInefficient, Query query) {
		query.setDescs("id");
		IPage<PowerStationInefficientEntity> pages = powerStationInefficientService.selectAllPage(powerStationInefficient,query);
		pages.getRecords().forEach(item->{

				item.setOrderNumber(alarmInfoService.getOrderNumber(item.getStationId()));
		});
		return R.data(PowerStationInefficientWrapper.build().pageVO(pages));
	}

	/**
	 * 低效电站 自定义分页
	 */
	@GetMapping("/page")
	@ApiOperationSupport(order = 3)
	@Operation(summary = "分页", description  = "传入powerStationInefficient")
	public R<IPage<PowerStationInefficientVO>> page(PowerStationInefficientVO powerStationInefficient, Query query) {
		query.setDescs("id");
		IPage<PowerStationInefficientVO> pages = powerStationInefficientService.selectPowerStationInefficientPage(Condition.getPage(query), powerStationInefficient);
		return R.data(pages);
	}

	/**
	 * 低效电站 新增
	 */
	@PostMapping("/save")
	@ApiOperationSupport(order = 4)
	@Operation(summary = "新增", description  = "传入powerStationInefficient")
	public R save(@Valid @RequestBody PowerStationInefficientEntity powerStationInefficient) {
		return R.status(powerStationInefficientService.save(powerStationInefficient));
	}

	/**
	 * 低效电站 修改
	 */
	@PostMapping("/update")
	@ApiOperationSupport(order = 5)
	@Operation(summary = "修改", description  = "传入powerStationInefficient")
	public R update(@Valid @RequestBody PowerStationInefficientEntity powerStationInefficient) {
		return R.status(powerStationInefficientService.updateById(powerStationInefficient));
	}

	/**
	 * 低效电站 新增或修改
	 */
	@PostMapping("/submit")
	@ApiOperationSupport(order = 6)
	@Operation(summary = "新增或修改", description  = "传入powerStationInefficient")
	public R submit(@Valid @RequestBody PowerStationInefficientEntity powerStationInefficient) {
		return R.status(powerStationInefficientService.saveOrUpdate(powerStationInefficient));
	}

	/**
	 * 低效电站 删除
	 */
	@PostMapping("/remove")
	@ApiOperationSupport(order = 7)
	@Operation(summary = "删除", description  = "传入ids")
	public R remove(@Parameter(name = "主键集合", required = true) @RequestParam String ids) {
		return R.status(powerStationInefficientService.removeByIds(Func.toLongList(ids)));
	}

	/**
	 * 确认低效
	 */
	@PostMapping("/confirmInefficient")
	@ApiOperationSupport(order = 7)
	@Operation(summary = "确认低效", description  = "传入ids")
	public R confirmInefficient(@Parameter(name = "主键集合", required = true) @RequestParam String ids,String isConfirm,String remarks) {
		LambdaUpdateWrapper<PowerStationInefficientEntity> updateWrapper = new LambdaUpdateWrapper<>();
		updateWrapper.in(PowerStationInefficientEntity::getId,Func.toLongList(ids))
			.set(PowerStationInefficientEntity::getRemarks,remarks)
			.set(PowerStationInefficientEntity::getIsConfirm,isConfirm);
		return R.status(powerStationInefficientService.update(updateWrapper));
	}


	/**
	 * 导出数据
	 */
	@GetMapping("/export-powerStationInefficient")
	@ApiOperationSupport(order = 9)
	@Operation(summary = "导出数据", description  = "传入powerStationInefficient")
	public void exportPowerStationInefficient(@Parameter(hidden = true) @RequestParam Map<String, Object> powerStationInefficient, BladeUser bladeUser, HttpServletResponse response) {

		List<PowerStationInefficientExcel> list = powerStationInefficientService.exportPowerStationInefficient(powerStationInefficient);
		list.forEach(item->{
				item.setOrderNumber(alarmInfoService.getOrderNumber(item.getStationId()));
		});
		ExcelUtil.export(response, "低效电站数据" + DateUtil.time(), "低效电站数据表", list, PowerStationInefficientExcel.class);
	}
	@PostMapping("/turnMainOrder")
	@ApiOperationSupport(order = 15)
	@Operation(summary = "电站转运维", description  = "传入id")
	public R turnMainOrder(@Parameter(name = "id",description = "id",required = true) @RequestParam String id) {

		return R.status(powerStationInefficientService.turnMainOrder(id));
	}
}
