package com.ruoyi.oa.controller;

import java.util.*;

import com.ruoyi.common.helper.LoginHelper;
import com.ruoyi.oa.domain.UserMonthlyData;
import lombok.RequiredArgsConstructor;
import javax.servlet.http.HttpServletResponse;
import javax.validation.constraints.*;

import org.springframework.web.bind.annotation.*;
import org.springframework.validation.annotation.Validated;
import com.ruoyi.common.annotation.RepeatSubmit;
import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.PageQuery;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.core.validate.AddGroup;
import com.ruoyi.common.core.validate.EditGroup;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.oa.domain.vo.SysOaTaskVo;
import com.ruoyi.oa.domain.bo.SysOaTaskBo;
import com.ruoyi.oa.service.ISysOaTaskService;
import com.ruoyi.common.core.page.TableDataInfo;

/**
 * 任务管理
 *
 * @author huangxing
 * @date 2024-01-11
 */
@Validated
@RequiredArgsConstructor
@RestController
@RequestMapping("/oa/task")
public class SysOaTaskController extends BaseController {

    private final ISysOaTaskService iSysOaTaskService;

    /**
     * 查询任务管理列表
     */
    @GetMapping("/list")
    public TableDataInfo<SysOaTaskVo> list(SysOaTaskBo bo, PageQuery pageQuery) {
        return iSysOaTaskService.queryPageList(bo, pageQuery);
    }
    /**
     * 查询任务管理列表
     */
    @GetMapping("/list-own-create")
    public TableDataInfo<SysOaTaskVo> listOwnCreate(SysOaTaskBo bo, PageQuery pageQuery) {
        bo.setCreateUserId(LoginHelper.getUserId());
        return iSysOaTaskService.queryPageListOwn(bo, pageQuery);
    }

  /**
     * 查询任务管理列表
     */
    @GetMapping("/list-own-work")
    public TableDataInfo<SysOaTaskVo> listOwnWork(SysOaTaskBo bo, PageQuery pageQuery) {
        bo.setWorkerId(LoginHelper.getUserId());
        return iSysOaTaskService.queryPageListOwn(bo, pageQuery);
    }

 /**
     * 查询任务管理列表
     */
    @GetMapping("/list-own-document")
    public TableDataInfo<SysOaTaskVo> listOwnDocument(SysOaTaskBo bo, PageQuery pageQuery) {

        return iSysOaTaskService.queryPageListDocument(bo, pageQuery);
    }

    /**
     * 查询此项目挂接的所有文件
     */
    @GetMapping("/list-document-project/{projectId}")
    public R<List<SysOaTaskVo>> listDocumentProject(@PathVariable Long projectId) {

        return R.ok(iSysOaTaskService.listDocumentProject(projectId));
    }

    /**
     * 导出任务管理列表
     */
    @Log(title = "任务管理", businessType = BusinessType.EXPORT)
    @PostMapping("/export")
    public void export(SysOaTaskBo bo, HttpServletResponse response) {
        List<SysOaTaskVo> list = iSysOaTaskService.queryList(bo);
        ExcelUtil.exportExcel(list, "任务管理", SysOaTaskVo.class, response);
    }

    /**
     * 获取任务管理详细信息
     *
     * @param taskId 主键
     */
    @GetMapping("/{taskId}")
    public R<SysOaTaskVo> getInfo(@NotNull(message = "主键不能为空") @PathVariable Long taskId) {
        return R.ok(iSysOaTaskService.queryById(taskId));
    }

    /**
     * 新增任务管理
     */
    @Log(title = "任务管理", businessType = BusinessType.INSERT)
    @RepeatSubmit()
    @PostMapping()
    public R<Void> add(@Validated(AddGroup.class) @RequestBody SysOaTaskBo bo) {
        return toAjax(iSysOaTaskService.insertByBo(bo));
    }

    /**
     * 修改任务管理
     */
    @Log(title = "任务管理", businessType = BusinessType.UPDATE)
    @RepeatSubmit()
    @PutMapping()
    public R<Void> edit(@Validated(EditGroup.class) @RequestBody SysOaTaskBo bo) {
        return toAjax(iSysOaTaskService.updateByBo(bo));
    }


    /**
     * 修改任务管理
     */
    @Log(title = "任务管理", businessType = BusinessType.UPDATE)
    @RepeatSubmit()
    @PutMapping("/postpone")
    public R<Void> postponeTask(@Validated(EditGroup.class) @RequestBody SysOaTaskBo bo) {
        return toAjax(iSysOaTaskService.postponeTask(bo));
    }

    /**
     * 修改任务管理
     */
    @Log(title = "任务管理", businessType = BusinessType.UPDATE)
    @RepeatSubmit()
    @PutMapping("/postponeSuccess")
    public R<Void> postponeSuccess(@Validated(EditGroup.class) @RequestBody SysOaTaskBo bo) {
        return toAjax(iSysOaTaskService.postponeSuccess(bo));
    }


    /**
     * 删除任务管理
     *
     * @param taskIds 主键串
     */
    @Log(title = "任务管理", businessType = BusinessType.DELETE)
    @DeleteMapping("/{taskIds}")
    public R<Void> remove(@NotEmpty(message = "主键不能为空")
                          @PathVariable Long[] taskIds) {
        return toAjax(iSysOaTaskService.deleteWithValidByIds(Arrays.asList(taskIds), true));
    }


    /**
     * 示例：获取指定月份的员工任务统计
     *
     * @return 符合条件的List<UserMonthlyData>
     */
    @GetMapping("/monthData/list/{date}")
    public TableDataInfo<UserMonthlyData> getMonthlyData(@PathVariable("date") String month) {

        // 假设这是一份模拟数据，你可以从数据库/服务中获取
        return iSysOaTaskService.getMonthlyData(month);
    }
}
