package com.gxwebsoft.tower.controller;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.gxwebsoft.common.core.annotation.OperationLog;
import com.gxwebsoft.common.core.web.ApiResult;
import com.gxwebsoft.common.core.web.BaseController;
import com.gxwebsoft.common.core.web.BatchParam;
import com.gxwebsoft.common.core.web.PageResult;
import com.gxwebsoft.common.system.entity.User;
import com.gxwebsoft.common.system.service.UserService;
import com.gxwebsoft.tower.entity.*;
import com.gxwebsoft.tower.param.TowerProjectParam;
import com.gxwebsoft.tower.service.*;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import java.util.*;

/**
 * 项目管理控制器
 *
 * @author 科技小王子
 * @since 2023-05-22 13:30:39
 */
@Api(tags = "项目管理管理")
@RestController
@RequestMapping("/api/tower/tower-project")
public class TowerProjectController extends BaseController {
    @Resource
    private TowerProjectService towerProjectService;
    @Resource
    private TowerProjectOrderService towerProjectOrderService;
    @Resource
    private TowerProjectUserService towerProjectUserService;
    @Resource
    private TowerProjectPlaceService towerProjectPlaceService;
    @Resource
    private TowerEquipmentService equipmentService;
    @Resource
    private UserService userService;

    @PreAuthorize("hasAuthority('tower:towerEquipment:list')")
    @OperationLog
    @ApiOperation("项目数据")
    @GetMapping("/data")
    public ApiResult<Map<String, Integer>> data() {
        Map<String, Integer> data = new HashMap<>();
        Integer totalNum = towerProjectService.count();
        Integer startedNum = towerProjectService.count(
                new LambdaQueryWrapper<TowerProject>()
                        .eq(TowerProject::getProjectStatus, "建设中")
        );
        Integer notStartNum = towerProjectService.count(
                new LambdaQueryWrapper<TowerProject>()
                        .eq(TowerProject::getProjectStatus, "未开工")
        );
        Integer okNum = towerProjectService.count(
          new LambdaQueryWrapper<TowerProject>()
            .eq(TowerProject::getProjectStatus, "已完成")
        );
        Integer notStartNum2 = towerProjectService.count(
          new LambdaQueryWrapper<TowerProject>()
            .eq(TowerProject::getProjectStatus, "停工中")
        );
        Integer notStartNum3 = towerProjectService.count(
          new LambdaQueryWrapper<TowerProject>()
            .eq(TowerProject::getProjectStatus, "停工已拆机")
        );
        Integer notStartNum4 = towerProjectService.count(
          new LambdaQueryWrapper<TowerProject>()
            .eq(TowerProject::getProjectStatus, "完工未拆机")
        );
        data.put("totalNum", totalNum);
        data.put("startedNum", startedNum);
        data.put("notStartNum", notStartNum);
        data.put("okNum", okNum);
        data.put("notStartNum2", notStartNum2);
        data.put("notStartNum3", notStartNum3);
        data.put("notStartNum4", notStartNum4);
        return success(data);
    }

    @PreAuthorize("hasAuthority('tower:towerProject:list')")
    @ApiOperation("分页查询项目管理")
    @GetMapping("/page")
    public ApiResult<PageResult<TowerProject>> page(TowerProjectParam param) {
        // 使用关联查询
        PageResult<TowerProject> list = towerProjectService.pageRel(param);
        for (TowerProject project : list.getList()) {
            project.setEquipmentNum(towerProjectOrderService.count(
                    new LambdaQueryWrapper<TowerProjectOrder>()
                            .eq(TowerProjectOrder::getProjectId, project.getProjectId())
            ));
            project.setOrders(
                    new HashSet<>(towerProjectOrderService.list(
                            new LambdaQueryWrapper<TowerProjectOrder>().eq(TowerProjectOrder::getProjectId, project.getProjectId())
                    ))
            );
            if (!project.getDirector().equals("0")) project.setDirectorUser(userService.getById(project.getDirector()));
        }
        return success(list);
    }

    @PreAuthorize("hasAuthority('tower:towerProject:list')")
    @ApiOperation("查询全部项目管理")
    @GetMapping()
    public ApiResult<List<TowerProject>> list(TowerProjectParam param) {
        // 使用关联查询
        return success(towerProjectService.listRel(param));
    }

    @PreAuthorize("hasAuthority('tower:towerProject:list')")
    @ApiOperation("根据id查询项目管理")
    @GetMapping("/{id}")
    public ApiResult<TowerProject> get(@PathVariable("id") Integer id) {
        // 使用关联查询
        return success(towerProjectService.getByIdRel(id));
    }

    @ApiOperation("添加项目管理")
    @PostMapping("/new")
    public ApiResult<?> newProject(@RequestBody TowerProject towerProject) {
        // 记录当前登录用户id
        User loginUser = getLoginUser();
        if (loginUser != null) {
            towerProject.setUserId(loginUser.getUserId());
        }
        towerProjectService.save(towerProject);
        return success(towerProject);
    }

    @PreAuthorize("hasAuthority('tower:towerProject:save')")
    @Transactional(rollbackFor = {Exception.class})
    @ApiOperation("添加项目管理")
    @PostMapping()
    public ApiResult<?> save(@RequestBody TowerProject towerProject) {
        // 记录当前登录用户id
        User loginUser = getLoginUser();
        if (loginUser != null) {
            towerProject.setUserId(loginUser.getUserId());
        }
        System.out.println("towerProject = " + towerProject.getPlaces2());
        if (towerProjectService.save(towerProject)) {
            final Integer projectId = towerProject.getProjectId();
            // 批量添加项目成员
            if (!towerProject.getUsers().isEmpty()) {
                final Set<TowerProjectUser> users = towerProject.getUsers();
                users.forEach(d -> {
                    d.setProjectId(projectId);
                });
                towerProjectUserService.saveBatch(users);
            }
            // 批量添加项目订单
            if (!towerProject.getOrders().isEmpty()) {
                final Set<TowerProjectOrder> orders = towerProject.getOrders();
                orders.forEach(d -> {
                    d.setProjectId(projectId);
                });
                towerProjectOrderService.saveBatch(orders);
            }
            // 批量添加检查部位配置
            if (!towerProject.getPlaces1().isEmpty()) {
                final Set<TowerProjectPlace> places1 = towerProject.getPlaces1();
                places1.forEach(d -> {
                    d.setProjectId(projectId);
                });
                towerProjectPlaceService.saveBatch(places1);
            }
            // 批量添加保养部位配置
            if (!towerProject.getPlaces2().isEmpty()) {
                final Set<TowerProjectPlace> places2 = towerProject.getPlaces2();
                places2.forEach(d -> {
                    d.setProjectId(projectId);
                });
                towerProjectPlaceService.saveBatch(places2);
            }
            return success("添加成功");
        }
        return fail("添加失败");
    }

    @PreAuthorize("hasAuthority('tower:towerProject:update')")
    @Transactional(rollbackFor = {Exception.class})
    @ApiOperation("修改项目管理")
    @PutMapping()
    public ApiResult<?> update(@RequestBody TowerProject towerProject) {
        if (towerProjectService.updateById(towerProject)) {
            // 批量修改项目成员
            towerProjectUserService.saveOrUpdateBatch(towerProject.getUsers());
            // 批量修改项目订单
            Set<TowerProjectOrder> projectOrders = towerProject.getOrders();
            if (towerProject.getProjectStatus().equals("建设中")) {
                for (TowerProjectOrder order : projectOrders) {
                    equipmentService.update(
                            new LambdaUpdateWrapper<TowerEquipment>()
                                    .eq(TowerEquipment::getFilingNo, order.getFilingNo())
                                    .set(TowerEquipment::getStatus, 4)
                    );
                }
            } else if (towerProject.getProjectStatus().equals("完工")) {
                for (TowerProjectOrder order : projectOrders) {
                    equipmentService.update(
                            new LambdaUpdateWrapper<TowerEquipment>()
                                    .eq(TowerEquipment::getFilingNo, order.getFilingNo())
                                    .set(TowerEquipment::getStatus, 0)
                    );
                }
            }
            towerProjectOrderService.saveOrUpdateBatch(projectOrders);
            // 批量修改检查/保养部位配置
            towerProjectPlaceService.saveOrUpdateBatch(towerProject.getPlaces1());
            towerProjectPlaceService.saveOrUpdateBatch(towerProject.getPlaces2());
            return success("修改成功");
        }
        return fail("修改失败");
    }

    @PreAuthorize("hasAuthority('tower:towerProject:remove')")
    @ApiOperation("删除项目管理")
    @DeleteMapping("/{id}")
    public ApiResult<?> remove(@PathVariable("id") Integer id) {
        if (towerProjectService.removeById(id)) {
            return success("删除成功");
        }
        return fail("删除失败");
    }

    @PreAuthorize("hasAuthority('tower:towerProject:save')")
    @ApiOperation("批量添加项目管理")
    @PostMapping("/batch")
    public ApiResult<?> saveBatch(@RequestBody List<TowerProject> list) {
        if (towerProjectService.saveBatch(list)) {
            return success("添加成功");
        }
        return fail("添加失败");
    }

    @PreAuthorize("hasAuthority('tower:towerProject:update')")
    @ApiOperation("批量修改项目管理")
    @PutMapping("/batch")
    public ApiResult<?> removeBatch(@RequestBody BatchParam<TowerProject> batchParam) {
        if (batchParam.update(towerProjectService, "project_id")) {
            return success("修改成功");
        }
        return fail("修改失败");
    }

    @PreAuthorize("hasAuthority('tower:towerProject:remove')")
    @OperationLog
    @ApiOperation("批量删除项目管理")
    @DeleteMapping("/batch")
    public ApiResult<?> removeBatch(@RequestBody List<Integer> ids) {
        if (towerProjectService.removeByIds(ids)) {
            return success("删除成功");
        }
        return fail("删除失败");
    }

}
