package jnpf.attendance.controller;

import com.github.pagehelper.PageInfo;
import jnpf.attendance.service.WorkstationService;
import jnpf.base.ActionResult;
import jnpf.base.vo.PageListVO;
import jnpf.model.attendance.dto.WorkstationQueryDto;
import jnpf.model.attendance.dto.WorkstationSaveDto;
import jnpf.model.attendance.dto.WorkstationUserAddDto;
import jnpf.model.attendance.dto.WorkstationUserRemoveDto;
import jnpf.model.attendance.vo.WorkstationDetailVo;
import jnpf.model.attendance.vo.WorkstationVo;
import jnpf.model.attendance.vo.WorkstationWithUsersVo;
import jnpf.util.FtbUtil;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import javax.validation.Valid;
import java.util.Date;
import java.util.List;

/**
 * 考勤工作站控制器
 *
 * @author AI Generated
 * @create 2026-05-11
 */
@RestController
@RequestMapping("/attendance/workstation")
public class WorkstationController {

    @Resource
    private WorkstationService workstationService;

    /**
     * 查询工作站列表(分页)
     *
     * @param dto 查询条件(含分页参数 currentPage/pageSize)
     * @return 工作站分页列表
     */
    @GetMapping("/list")
    public ActionResult<PageListVO<WorkstationVo>> list(WorkstationQueryDto dto) {
        PageInfo<WorkstationVo> page = workstationService.listWorkstations(dto);
        return ActionResult.page(page.getList(), FtbUtil.getPagination(page));
    }

    /**
     * 新增工作站
     *
     * @param dto 工作站保存DTO
     * @return 操作结果
     */
    @PostMapping
    public ActionResult<Void> add(@RequestBody @Valid WorkstationSaveDto dto) {
        workstationService.saveWorkstation(dto);
        return ActionResult.success("新增成功");
    }

    /**
     * 编辑工作站
     *
     * @param id  工作站ID
     * @param dto 工作站保存DTO
     * @return 操作结果
     */
    @PutMapping("/{id}")
    public ActionResult<Void> update(@PathVariable String id, @RequestBody @Valid WorkstationSaveDto dto) {
        workstationService.updateWorkstation(id, dto);
        return ActionResult.success("编辑成功");
    }

    /**
     * 删除工作站
     *
     * @param id 工作站ID
     * @return 操作结果
     */
    @DeleteMapping("/{id}")
    public ActionResult<Void> delete(@PathVariable String id) {
        workstationService.deleteWorkstation(id);
        return ActionResult.success("删除成功");
    }

    /**
     * 添加人员
     *
     * @param dto 添加人员DTO
     * @return 操作结果
     */
    @PostMapping("/users/add")
    public ActionResult<Void> addUsers(@RequestBody @Valid WorkstationUserAddDto dto) {
        workstationService.addUsers(dto);
        return ActionResult.success("添加成功");
    }

    /**
     * 删除人员
     *
     * @param dto 删除人员DTO
     * @return 操作结果
     */
    @DeleteMapping("/users/remove")
    public ActionResult<Void> removeUser(@RequestBody @Valid WorkstationUserRemoveDto dto) {
        workstationService.removeUser(dto);
        return ActionResult.success("删除成功");
    }

    /**
     * 查询工作站详情
     *
     * @param id      工作站ID
     * @return 工作站详情
     */
    @GetMapping("/{id}/detail")
    public ActionResult<WorkstationDetailVo> detail(
            @PathVariable String id) {
        return ActionResult.success(workstationService.getDetail(id));
    }

    /**
     * 按考勤组查询工作站及其归属员工（含在组日、划线排班权限）
     *
     * @param groupId   考勤组ID
     * @param startTime 查询开始日期（含），yyyy-MM-dd
     * @param endTime   查询结束日期（含），yyyy-MM-dd；同时作为成员快照截止日
     */
    @GetMapping("/by-group/{groupId}")
    public ActionResult<List<WorkstationWithUsersVo>> listByGroupId(
            @PathVariable String groupId,
            @RequestParam @DateTimeFormat(pattern = "yyyy-MM-dd") Date startTime,
            @RequestParam @DateTimeFormat(pattern = "yyyy-MM-dd") Date endTime) {
        return ActionResult.success(workstationService.listWorkstationsByGroupId(groupId, startTime, endTime));
    }

    /**
     * 重置工作站人员：恢复为岗位默认归属人员，清除另加入的额外人员
     *
     * @param id 工作站ID
     */
    @PostMapping("/{id}/reset")
    public ActionResult<Void> reset(@PathVariable String id) {
        workstationService.resetWorkstationUsers(id);
        return ActionResult.success("重置成功");
    }
}
