/**
#                                                    __----~~~~~~~~~~~------___
#                                   .  .   ~~//====......          __--~ ~~
#                   -.            \_|//     |||\\  ~~~~~~::::... /~
#                ___-==_       _-~o~  \/    |||  \\            _/~~-
#        __---~~~.==~||\=_    -_--~/_-~|-   |\\   \\        _/~
#    _-~~     .=~    |  \\-_    '-~7  /-   /  ||    \      /
#  .~       .~       |   \\ -_    /  /-   /   ||      \   /
# /  ____  /         |     \\ ~-_/  /|- _/   .||       \ /
# |~~    ~~|--~~~~--_ \     ~==-/   | \~--===~~        .\
#          '         ~-|      /|    |-~\~~       __--~~
#                      |-~~-_/ |    |   ~\_   _-~            /\
#                           /  \     \__   \/~                \__
#                       _--~ _/ | .-~~____--~-/                  ~~==.
#                      ((->/~   '.|||' -_|    ~~-/ ,              . _||
#                                 -_     ~\      ~~---l__i__i__i--~~_/
#                                 _-~-__   ~)  \--______________--~~
#                               //.-~~~-~_--~- |-------~~~~~~~~
#                                      //.-~~~--\
#                  神兽保佑
#                  永无BUG!
*/
package com.nanjing.water.host.controller;

import com.nanjing.water.common.ConstantFactory;
import com.nanjing.water.common.ExecutedResult;
import com.nanjing.water.common.PagerResult;
import com.nanjing.water.common.util.IPUtils;
import com.nanjing.water.common.util.ParameterUtil;
import com.nanjing.water.common.validator.ParameterValidateResult;
import com.nanjing.water.common.validator.ParameterValidator;
import com.nanjing.water.entity.request.waterfacility.ReqCreateWaterFacility;
import com.nanjing.water.entity.request.waterfacility.ReqModifyWaterFacility;

import com.nanjing.water.entity.response.point.ResMonitoryPointDataFacility;
import com.nanjing.water.entity.search.SearchWaterFacility;
import com.nanjing.water.host.BasicController;
import com.nanjing.water.repository.vo.WaterFacilityVO;
import com.nanjing.water.service.WaterFacilityService;
import org.eclipse.paho.client.mqttv3.MqttException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

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

/**
 * 150.设备信息
 * @author lin.liu
 * @order 150
 */
@RestController
@RequestMapping(value = "waterFacility")
public class WaterFacilityController extends BasicController {
    @Autowired
    private WaterFacilityService service;

    /**
     * 创建[设备表]
     * @author lin.liu
     * @description 创建[设备表]
     */
    @PostMapping(value = "create")
    public ExecutedResult<Long> create(@RequestBody ReqCreateWaterFacility request) {
        //#region 参数验证
        ParameterValidator validator = new ParameterValidator()
                // 非空
                .addNotNullOrEmpty(ParameterUtil.named("设备编号"), request.getFacilityCode())
                // 限制最大长度
                .addLengthMax(ParameterUtil.named("设备编号"), request.getFacilityCode(), ConstantFactory.LENGTH_MAX50)
                // 非空
                .addNotNullOrEmpty(ParameterUtil.named("设备名称"), request.getFacilityName())
                // 限制最大长度
                .addLengthMax(ParameterUtil.named("设备名称"), request.getFacilityName(), ConstantFactory.LENGTH_MAX200)
                // 大于0
                .addGreater(ParameterUtil.named("设备类型"), request.getFacilityType(), 0L)

                // 限制最大长度
                .addLengthMax(ParameterUtil.named("备注"), request.getRemark(), ConstantFactory.LENGTH_MAX1000)
                // 限制最大长度
                .addLengthMax(ParameterUtil.named("设备图片"), request.getFacilityUrl(), ConstantFactory.LENGTH_MAX200)
                ;
        ParameterValidateResult result = validator.validate();
        if (result.getIsFiled()) {
            return failed(result.getErrorMsg());
        }
        //#endregion
        return this.service.create(request);
    }

    /**
     * 编辑[设备表]
     * @author lin.liu
     * @description 编辑[设备表]
     */
    @PostMapping(value = "modify")
    public ExecutedResult<String> modify(@RequestBody ReqModifyWaterFacility request) {
        //#region 参数验证
        ParameterValidator validator = new ParameterValidator()
                // 必须大于0
                .addGreater(ParameterUtil.named("设备id"), request.getId(), 0L)
                // 非空
                .addNotNullOrEmpty(ParameterUtil.named("设备编号"), request.getFacilityCode())
                // 限制最大长度
                .addLengthMax(ParameterUtil.named("设备编号"), request.getFacilityCode(), ConstantFactory.LENGTH_MAX50)
                // 非空
                .addNotNullOrEmpty(ParameterUtil.named("设备名称"), request.getFacilityName())
                // 限制最大长度
                .addLengthMax(ParameterUtil.named("设备名称"), request.getFacilityName(), ConstantFactory.LENGTH_MAX200)
                // 大于0
                .addGreater(ParameterUtil.named("设备类型"), request.getFacilityType(), 0L)
                // 限制最大长度
                .addLengthMax(ParameterUtil.named("备注"), request.getRemark(), ConstantFactory.LENGTH_MAX1000)
                // 限制最大长度
                .addLengthMax(ParameterUtil.named("设备图片"), request.getFacilityUrl(), ConstantFactory.LENGTH_MAX200)
                ;
        ParameterValidateResult result = validator.validate();
        if (result.getIsFiled()) {
            return failed(result.getErrorMsg());
        }
        //#endregion
        return this.service.modify(request);
    }

    /**
     * 获取[设备表]
     * @author lin.liu
     * @description 获取[设备表]
     */
    @GetMapping(value = "get")
    public ExecutedResult<WaterFacilityVO> get(@RequestParam Long id) {
        return this.service.get(id);
    }

    /**
     * 查询[设备表]
     * @author lin.liu
     * @description 查询[设备表]
     */
    @PostMapping(value = "search")
    public ExecutedResult<PagerResult<WaterFacilityVO>> search(@RequestBody SearchWaterFacility request) {
        return this.service.search(request);
    }

//    /**
//     * 设备开关阀
//     * @author lin.liu
//     * @description 设备开阀
//     */
//    @PostMapping(value = "openOrClose")
//    public ExecutedResult<String> open(@RequestBody ReqOpenAdnClose po, HttpServletRequest request) throws MqttException {
//        return this.service.openOrClose(po,this.getTokenUser(), IPUtils.getIpAddress(request));
//    }

    /**
     * 获取指定监控点最新数据
     * @author lin.liu
     */
    @GetMapping(value = "listData/{pointId}")
    public ExecutedResult<List<ResMonitoryPointDataFacility>> listData(@PathVariable Long pointId) {
        return this.service.listData(pointId);
    }
}