package com.malk.test;

import com.malk.server.common.McException;
import com.malk.server.common.McR;
import com.malk.service.dingtalk.DDClient;
import com.malk.service.dingtalk.DDClient_Contacts;
import com.malk.test.dto.Async2Sync;
import com.malk.utils.UtilServlet;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.ss.formula.functions.T;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Profile;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletRequest;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

/**
 * 指定运行环境
 *
 * @Profile("prod")：一般添加于方法和类，标注该方法为指定环境运行 —>  若未找到指定环境会报错，多个环境与 @ActiveProfiles 一致
 */
@Slf4j
@Profile({"dev", "test"})
@RestController
@RequestMapping("/test/mc")
public class McTestController {

    @Autowired
    private Async2Sync sync;

    /**
     * 异步和并发 [配置参考AsyncConfig]
     */
    @GetMapping("async")
    McR<T> sync2Async() {
        log.info("1x");
        sync.addHello();
        log.info("2x");
        sync.addHello();
        log.info("3x");
        return McR.success();
    }

    ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    /**
     * 验证formData请求 [使用详见CatchException]
     */
    @PostMapping("formData")
    McR requestFormData(HttpServletRequest request) {
        Map param = UtilServlet.getParamMap(request);
        log.info("验证formData请求, {}, {}", param, param.get("a"));

        McException.assertAccessException(true, "xxxx");
        return McR.success();
    }

    ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    /**
     * 断点调试
     * -
     * - 右击断点, 可设置条件, conditionn
     * - 若是只是打印而不是挂起, 取消挂起 suspend, 在 evaluate and log 书写打印
     */
    @GetMapping("debug")
    McR debug(@RequestParam(required = false) int status) {

        List<String> arr = new ArrayList<>();
        arr.add("1");
        arr.add("2");

        arr.forEach(item -> log.info("Lambda -> {}", item));

        return McR.success();
    }

    ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    /**
     * @ModelAttribute 注解方法
     * -
     * - 每次请求进来都会执行页面所有被注解的方法, 方法的入参若是必须, @RequestMapping也一定要有值, 进行匹配
     * - 可解析 url 上的参数, @RequestParam 可直接解析, required 要指定为 false; @PathVariable 可获取到值, 但该页面所有方法都要有
     * - 该方法参数上可指定传递的全局对象, 实例会被直接创建, 若修改后数据会被保存; 若是方法指定了返回值, 可在 @RequestMapping 通过 @ModelAttribute 读取
     * -
     */
    @Data
    public class TModel {
        private String a;
        private String b;
        private String p;
    }

    /**
     * 无返回值: 该方法参数上可指定传递的全局对象, 实例会被直接创建, 若修改后数据会被保存
     */
    @ModelAttribute
    public void myModel(@RequestParam(required = false) String name, TModel model) {
        log.info("ModelAttribute 1");
        model.setA("ModelAttribute 1");
        model.setP(name);
    }

    /**
     * 有返回值: 若是方法指定了返回值, 可在 @RequestMapping 通过 @ModelAttribute 读取
     */
    @ModelAttribute
    public String myModel2(@RequestParam(required = false) String name, TModel model) {
        log.info("ModelAttribute 2");
        model.setB("ModelAttribute 2");
        model.setP(name);
        return model.getB();
    }

    /**
     * 若是方法指定了返回值, 可在 @RequestMapping 通过 @ModelAttribute 读取  [使用swagger3会报这个警告 ExpandedParameterBuilderPlugin]
     */
//    @GetMapping("attr")
//    public String method(@ModelAttribute String p) {
//        return p;
//    }

    /**
     * 该方法参数上可指定传递的全局对象, 实例会被直接创建, 若修改后数据会被保存
     */
    @GetMapping("obj")
    public TModel obj(TModel model) {
        return model;
    }

    ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////


    @Autowired
    private DDClient_Contacts ddClient_contacts;

    @Autowired
    private DDClient ddClient;

    /**
     * test
     */
    @GetMapping("test")
    McR<T> test() {
        return McR.success();
    }
}



