package com.xmomen.module.pick.controller;

// 引入用于验证请求体数据有效性的注解

import com.xmomen.framework.mybatis.dao.MybatisDao;
import com.xmomen.framework.web.exceptions.ArgumentValidException;
import com.xmomen.module.base.model.CreateMember;
import com.xmomen.module.logger.Log;
import com.xmomen.module.pick.model.PickVo;
import com.xmomen.module.pick.service.PickService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

import javax.validation.Valid;

/**
 * PickController 类是一个控制器类，用于处理与采摘相关的业务请求。
 * 它使用了 Spring 的注解 @RestController，表明这是一个 RESTful 风格的控制器，
 * 用于处理 HTTP 请求并返回 JSON 格式的响应（虽然在当前代码中部分方法没有返回值，但通常是这样的用途）。
 */
@RestController
public class PickController {

    // 自动注入 PickService 实例，用于调用与采摘相关的业务逻辑方法
    @Autowired
    PickService pickService;

    // 自动注入 MybatisDao 实例，用于进行数据库操作（如查询、插入、更新等）
    @Autowired
    MybatisDao mybatisDao;

    /**
     * 采摘结算的处理方法，处理 PUT 请求到 "/pick/settleAccounts" 路径的请求。
     * 该方法用于执行采摘结算的业务逻辑。
     *
     * @param pickVo 包含采摘结算相关信息的对象，通过 @RequestBody 注解从请求体中获取，
     *               并使用 @Valid 注解进行数据验证。
     * @param bindingResult 用于存储数据验证的结果，如果数据验证失败，可以通过它获取错误信息。
     * @return 该方法没有返回值，它主要是调用 PickService 的方法来处理业务逻辑。
     * @throws ArgumentValidException 如果数据验证失败（即 bindingResult 中有错误），则抛出该异常。
     */
    @RequestMapping(value = "/pick/settleAccounts", method = RequestMethod.PUT)
    // 使用自定义日志注解记录操作名称
    @Log(actionName = "采摘结算")
    public void settleAccounts(@RequestBody @Valid PickVo pickVo, BindingResult bindingResult) throws ArgumentValidException {
        // 检查数据验证结果，如果有错误
        if (bindingResult != null && bindingResult.hasErrors()) {
            // 抛出参数验证异常，将错误信息传递给上层处理
            throw new ArgumentValidException(bindingResult);
        }
        // 调用 PickService 的 pick 方法，执行采摘结算的业务逻辑
        pickService.pick(pickVo);
    }

    /**
     * 办理新卡的处理方法，处理 PUT 请求到 "/pick/pickCard" 路径的请求。
     * 该方法用于执行办理新卡的业务逻辑。
     *
     * @param createMember 包含办理新卡相关信息的对象，通过 @RequestBody 注解从请求体中获取，
     *                     并使用 @Valid 注解进行数据验证。
     * @param bindingResult 用于存储数据验证的结果，如果数据验证失败，可以通过它获取错误信息。
     * @return 该方法没有返回值，它主要是调用 PickService 的方法来处理业务逻辑。
     * @throws ArgumentValidException 如果数据验证失败（即 bindingResult 中有错误），则抛出该异常。
     */
    @RequestMapping(value = "/pick/pickCard", method = RequestMethod.PUT)
    // 使用自定义日志注解记录操作名称
    @Log(actionName = "办新卡")
    public <CreateMember> void pickCard(@RequestBody @Valid CreateMember createMember, BindingResult bindingResult) throws ArgumentValidException {
        // 检查数据验证结果，如果有错误
        if (bindingResult != null && bindingResult.hasErrors()) {
            // 抛出参数验证异常，将错误信息传递给上层处理
            throw new ArgumentValidException(bindingResult);
        }
        // 调用 PickService 的 pickCard 方法，执行办理新卡的业务逻辑
        CreateMember CreateMember = null;
        pickService.pickCard(null);
    }
}