package com.tairanchina.csp.avm.controller;

import com.tairanchina.csp.avm.constants.ServiceResultConstants;
import com.tairanchina.csp.avm.dto.RnPackageRequestDTO;
import com.tairanchina.csp.avm.dto.ServiceResult;
import com.tairanchina.csp.avm.entity.OperationRecordLog;
import com.tairanchina.csp.avm.entity.RnPackage;
import com.tairanchina.csp.avm.wapper.ExtWrapper;
import com.tairanchina.csp.avm.annotation.OperationRecord;
import com.tairanchina.csp.avm.service.BasicService;
import com.tairanchina.csp.avm.service.RnPackageService;
import com.tairanchina.csp.avm.utils.StringUtilsExt;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;

/**
 * Created by hzlizx on 2018/6/20 0020
 */
@Api(value = "/package", tags = "RN包相关接口")
@RestController
@RequestMapping("/package")
public class RnPackageController {

    @Autowired
    private BasicService basicService;

    @Autowired
    private RnPackageService rnPackageService;

    @ApiOperation(
            value = "列出当前选择的APP内所有RN包(可分页,查询)",
            notes = "列出当前选择的APP内所有RN包信息(可分页,查询)"
    )
    @ApiImplicitParams({
            @ApiImplicitParam(name = "Authorization", value = "用户登录凭证", paramType = "header", dataType = "string", defaultValue = "Bearer ", required = true),
            @ApiImplicitParam(name = "page", value = "页数", defaultValue = "1"),
            @ApiImplicitParam(name = "pageSize", value = "每页显示数据条数", defaultValue = "10"),
            @ApiImplicitParam(name = "rnName", value = "模块名称(约定)"),
            @ApiImplicitParam(name = "rnNickName", value = "RN包模块通用昵称"),
            @ApiImplicitParam(name = "rnStatus", value = "RN包状态,0:关闭 1:线上开启 2:测试需要"),
    })
    @GetMapping
    public ServiceResult list(@RequestParam(required = false, defaultValue = "1") int page,
                              @RequestParam(required = false, defaultValue = "10") int pageSize,
                              @RequestParam(required = false, defaultValue = "") String rnName,
                              @RequestParam(required = false, defaultValue = "") String rnNickName,
                              @RequestParam(required = false, defaultValue = "") Integer rnStatus) {
        ExtWrapper<RnPackage> wrapper = new ExtWrapper<>();
        wrapper.and().eq("del_flag", 0);
        if (StringUtils.hasLength(rnName)) {
            wrapper.and().like("rn_name", "%" + rnName + "%");
        }
        if (StringUtils.hasLength(rnNickName)) {
            wrapper.and().like("rn_nick_name", "%" + rnNickName + "%");
        }
        if (rnStatus != null) {
            wrapper.and().eq("rn_status", rnStatus);
        }
        wrapper.setVersionSort("rn_version", false);
        return rnPackageService.listSort(page, pageSize, wrapper);
    }

    @ApiImplicitParams({
            @ApiImplicitParam(name = "Authorization", value = "用户登录凭证", paramType = "header", dataType = "string", defaultValue = "Bearer ", required = true),
    })
    @PostMapping
    @OperationRecord(type = OperationRecordLog.OperationType.CREATE, resource = OperationRecordLog.OperationResource.RN_PACKAGE, description = OperationRecordLog.OperationDescription.CREATE_RN_PACKAGE)
    public ServiceResult create(@RequestBody RnPackageRequestDTO rnPackageRequestDTO) {
        if (StringUtilsExt.hasEmpty(
                rnPackageRequestDTO.getRnName(),
                rnPackageRequestDTO.getRnNickName(),
                rnPackageRequestDTO.getResourceUrl(),
                rnPackageRequestDTO.getRnVersion(),
                rnPackageRequestDTO.getRnUpdateLog()
        )) {
            return ServiceResultConstants.NEED_PARAMS;
        }
        //校验版本区间
        if (StringUtilsExt.hasNotBlank(rnPackageRequestDTO.getVersionMin(), rnPackageRequestDTO.getVersionMax())) {
            if (basicService.compareVersion(rnPackageRequestDTO.getVersionMax(), rnPackageRequestDTO.getVersionMin()) <= 0) {
                return ServiceResultConstants.MIN_BIG_THAN_MAX;
            }
        }

        RnPackage rnPackage = new RnPackage();
        BeanUtils.copyProperties(rnPackageRequestDTO, rnPackage);
        return rnPackageService.create(rnPackage);
    }

    @ApiImplicitParams({
            @ApiImplicitParam(name = "Authorization", value = "用户登录凭证", paramType = "header", dataType = "string", defaultValue = "Bearer ", required = true),
    })
    @PutMapping("/{id}")
    @OperationRecord(type = OperationRecordLog.OperationType.UPDATE, resource = OperationRecordLog.OperationResource.RN_PACKAGE, description = OperationRecordLog.OperationDescription.UPDATE_RN_PACKAGE)
    public ServiceResult update(@PathVariable int id, @RequestBody RnPackageRequestDTO rnPackageRequestDTO) {
        if (id < 1) {
            return ServiceResultConstants.NEED_PARAMS;
        }
        //校验版本区间
        if (StringUtilsExt.hasNotBlank(rnPackageRequestDTO.getVersionMin(), rnPackageRequestDTO.getVersionMax()) && basicService.compareVersion(rnPackageRequestDTO.getVersionMax(), rnPackageRequestDTO.getVersionMin()) <= 0) {
            return ServiceResultConstants.MIN_BIG_THAN_MAX;
        }
        RnPackage rnPackage = new RnPackage();
        BeanUtils.copyProperties(rnPackageRequestDTO, rnPackage);
        rnPackage.setId(id);
        return rnPackageService.update(rnPackage);
    }


    @ApiImplicitParams({
            @ApiImplicitParam(name = "Authorization", value = "用户登录凭证", paramType = "header", dataType = "string", defaultValue = "Bearer ", required = true),
    })
    @DeleteMapping("/{id}")
    @OperationRecord(type = OperationRecordLog.OperationType.DELETE, resource = OperationRecordLog.OperationResource.RN_PACKAGE, description = OperationRecordLog.OperationDescription.DELETE_RN_PACKAGE)
    public ServiceResult delete(@PathVariable int id) {
        if (id < 1) {
            return ServiceResultConstants.NEED_PARAMS;
        }
        return rnPackageService.delete(id);
    }

    @ApiImplicitParams({
            @ApiImplicitParam(name = "Authorization", value = "用户登录凭证", paramType = "header", dataType = "string", defaultValue = "Bearer ", required = true),
    })
    @GetMapping("/{id}")
    public ServiceResult find(@PathVariable int id) {
        if (id < 1) {
            return ServiceResultConstants.NEED_PARAMS;
        }
        return rnPackageService.find(id);
    }
}