package com.ltgk.port.controller;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
import com.ltgk.common.annotation.Log;
import com.ltgk.common.annotation.RepeatSubmit;
import com.ltgk.common.core.controller.BaseController;
import com.ltgk.common.core.domain.AjaxResult;
import com.ltgk.common.core.page.TableDataInfo;
import com.ltgk.common.enums.AreaType;
import com.ltgk.common.enums.BusinessType;
import com.ltgk.common.enums.DsMainAreaMarkTypeEnums;
import com.ltgk.common.enums.FunctionArea;
import com.ltgk.common.utils.SecurityUtils;
import com.ltgk.common.utils.bean.BeanUtils;
import com.ltgk.common.utils.enums.EnumUtil;
import com.ltgk.common.utils.poi.ExcelUtil;
import com.ltgk.common.validation.groups.Add;
import com.ltgk.common.validation.groups.Detail;
import com.ltgk.common.validation.groups.Update;
import com.ltgk.port.domain.dto.DsMainAreaDTO;
import com.ltgk.port.domain.entity.DsMainArea;
import com.ltgk.port.domain.vo.DsMainAreaVo;
import com.ltgk.port.service.IDsMainAreaService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 * 重点区域信息/功能区划 前端控制器
 *
 * @author Qi ChengBin
 * @date 2024-12-10
 */
@Api(tags = "重点区域信息/功能区划")
@RestController
@RequestMapping("/fishingPort/dsMainArea")
public class DsMainAreaController extends BaseController {

    @Resource
    private IDsMainAreaService dsMainAreaService;

    /**
     * 获取重点区域 标注类型 枚举数据
     *
     * @return com.ltgk.common.core.domain.AjaxResult
     * @author Qi ChengBin
     * @date 2025/2/24
     */
    @PostMapping("/findDsMainAreaMarkTypeEnumLost")
    @ApiOperation(value = "获取重点区域信息/功能区划标注类型枚举数据")
    public AjaxResult findDsMainAreaMarkTypeEnumLost() {
        return success(EnumUtil.getEnumsVOList(DsMainAreaMarkTypeEnums.class));
    }


    /**
     * 分页查询重点区域信息/功能区划列表
     *
     * @param dsMainAreaDTO: 重点区域信息数据传输参数对象
     * @return com.ltgk.common.core.page.TableDataInfo
     * @author Qi ChengBin
     * @date 2024-12-10
     */
    @PostMapping("/page")
    @ApiOperation(value = "分页查询重点区域信息/功能区划列表")
    public TableDataInfo page(@RequestBody DsMainAreaDTO dsMainAreaDTO) {
        LambdaQueryWrapper<DsMainArea> wrapper = getDsMainAreaLambdaQueryWrapper(dsMainAreaDTO);
        startPage(dsMainAreaDTO.getPageNum(), dsMainAreaDTO.getPageSize());
        List<DsMainArea> dsMainAreaList = dsMainAreaService.list(wrapper);
        return getDataTable(dsMainAreaList);
    }

    /**
     * 移动端获取停泊区域数据
     *
     * @return com.ltgk.common.core.domain.AjaxResult
     * @author Qi ChengBin
     * @date 2025/5/21
     */
    @PostMapping("/findParkedAreaListForApp")
    @ApiOperation(value = "移动端获取停泊区域数据")
    public AjaxResult findParkedAreaListForApp() {
        return success(dsMainAreaService.findParkedAreaListForApp());
    }


    /**
     * 不分页查询重点区域信息/功能区划列表
     *
     * @param dsMainAreaDTO: 重点区域信息数据传输参数对象
     * @return com.ltgk.common.core.domain.AjaxResult
     * @author Qi ChengBin
     * @date 2024/12/10 13:54
     */
    @PostMapping("/list")
    @ApiOperation(value = "不分页查询重点区域信息/功能区划列表")
    public AjaxResult list(@RequestBody DsMainAreaDTO dsMainAreaDTO) {
        LambdaQueryWrapper<DsMainArea> wrapper = getDsMainAreaLambdaQueryWrapper(dsMainAreaDTO);
        return AjaxResult.success(dsMainAreaService.list(wrapper));
    }

    /**
     * 导出重点区域信息/功能区划列表
     *
     * @param dsMainAreaDTO: 重点区域信息数据传输参数对象
     * @author Qi ChengBin
     * @date 2024-12-10
     */
    @Log(title = "重点区域信息/功能区划", businessType = BusinessType.EXPORT)
    @GetMapping("/export")
    @ApiOperation(value = "导出重点区域信息/功能区划数据")
    public void export(HttpServletResponse response, @ModelAttribute DsMainAreaDTO dsMainAreaDTO) {
        LambdaQueryWrapper<DsMainArea> wrapper = getDsMainAreaLambdaQueryWrapper(dsMainAreaDTO);
        List<DsMainArea> dsMainAreaList = dsMainAreaService.list(wrapper);
        List<DsMainAreaVo> list = new ArrayList<>();
        dsMainAreaList.forEach(dsMainArea -> {
            DsMainAreaVo dsMainAreaVo = new DsMainAreaVo();
            BeanUtils.copyBeanProp(dsMainAreaVo, dsMainArea);
            if (ObjectUtils.isNotEmpty(dsMainArea.getMarkType())) {
                dsMainAreaVo.setMarkType(DsMainAreaMarkTypeEnums.getAreaMarkType(dsMainArea.getMarkType()).getDesc());
            }
            if (ObjectUtils.isNotEmpty(dsMainArea.getType())) {
                dsMainAreaVo.setType(AreaType.getAreaType(dsMainArea.getType()).getName());
            }
            if (ObjectUtils.isNotEmpty(dsMainArea.getFunctionArea())) {
                dsMainAreaVo.setFunctionArea(FunctionArea.getFunctionArea(dsMainArea.getFunctionArea()).getName());
            }
            list.add(dsMainAreaVo);
        });
        ExcelUtil<DsMainAreaVo> util = new ExcelUtil<>(DsMainAreaVo.class);
        util.exportExcel(response, list, "重点区域信息");
    }

    /**
     * 获取重点区域信息/功能区划详细信息
     *
     * @param dsMainAreaDTO: 重点区域信息数据传输参数对象
     * @return com.ltgk.common.core.domain.AjaxResult
     * @author Qi ChengBin
     * @date 2024-12-10
     */
    @PostMapping(value = "/detail")
    @ApiOperation(value = "获取重点区域信息/功能区划详细数据")
    public AjaxResult detail(@Validated(Detail.class) @RequestBody DsMainAreaDTO dsMainAreaDTO) {
        return success(dsMainAreaService.getById(dsMainAreaDTO.getId()));
    }

    /**
     * 新增重点区域信息/功能区划信息
     *
     * @param dsMainArea: 重点区域信息实体对象
     * @return com.ltgk.common.core.domain.AjaxResult
     * @author Qi ChengBin
     * @date 2024-12-10
     */
    @RepeatSubmit(message = "请勿重复提交")
    @Log(title = "新增重点区域信息/功能区划", businessType = BusinessType.INSERT)
    @PostMapping("/add")
    @ApiOperation(value = "新增重点区域信息/功能区划数据")
    public AjaxResult add(@Validated(Add.class) @RequestBody DsMainArea dsMainArea) {
        String userName = SecurityUtils.getLoginUser().getUser().getNickName();
        dsMainArea.setCreateBy(userName)
                .setCreateAt(new Date())
                .setUpdateBy(userName)
                .setUpdateAt(new Date());
        return toAjax(dsMainAreaService.save(dsMainArea));
    }

    /**
     * 修改重点区域信息/功能区划信息
     *
     * @param dsMainArea: 重点区域信息实体对象
     * @return com.ltgk.common.core.domain.AjaxResult
     * @author Qi ChengBin
     * @date 2024-12-10
     */
    @Log(title = "修改重点区域信息/功能区划", businessType = BusinessType.UPDATE)
    @PostMapping("/edit")
    @ApiOperation(value = "修改重点区域信息/功能区划数据")
    public AjaxResult edit(@Validated(Update.class) @RequestBody DsMainArea dsMainArea) {
        String userName = SecurityUtils.getLoginUser().getUser().getNickName();
        dsMainArea.setUpdateBy(userName)
                .setUpdateAt(new Date());
        return toAjax(dsMainAreaService.updateById(dsMainArea));
    }

    /**
     * 删除重点区域信息/功能区划信息
     *
     * @param dsMainAreaDTO:
     * @return com.ltgk.common.core.domain.AjaxResult
     * @author Qi ChengBin
     * @date 2024-12-10
     */
    @Log(title = "删除重点区域信息/功能区划", businessType = BusinessType.DELETE)
    @PostMapping("/delete")
    @ApiOperation(value = "批量删除重点区域信息/功能区划数据")
    public AjaxResult delete(@Validated(Detail.class) @RequestBody DsMainAreaDTO dsMainAreaDTO) {
        return toAjax(dsMainAreaService.removeById(dsMainAreaDTO.getId()));
    }

    /**
     * 组装 重点区域查询 wrapper
     *
     * @param dsMainAreaDTO:
     * @return com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper<com.ltgk.port.domain.entity.DsMainArea>
     * @author Qi ChengBin
     * @date 2024/12/17 16:03
     */
    private static LambdaQueryWrapper<DsMainArea> getDsMainAreaLambdaQueryWrapper(DsMainAreaDTO dsMainAreaDTO) {
        DsMainArea dsMainArea = getDsMainArea(dsMainAreaDTO);
        LambdaQueryWrapper<DsMainArea> wrapper = new LambdaQueryWrapper<>(dsMainArea);
        wrapper.orderByDesc(DsMainArea::getUpdateAt);
        return wrapper;
    }

    /**
     * 根据重点区域信息数据传输参数对象转换成重点区域信息对应实体
     *
     * @param dsMainAreaDTO: 重点区域数据传输参数对象
     * @return com.ltgk.port.domain.entity.DsMainArea
     * @author Qi ChengBin
     * @date 2024/12/26 09:15
     */
    private static DsMainArea getDsMainArea(DsMainAreaDTO dsMainAreaDTO) {
        dsMainAreaDTO.queryCheck();
        DsMainArea dsMainArea = new DsMainArea();
        BeanUtils.copyProperties(dsMainAreaDTO, dsMainArea);
        return dsMainArea;
    }
}
