package com.boco.nbd.wios.manage.controller;


import cn.hutool.core.lang.Assert;
import com.boco.nbd.cams.core.constant.CamsConstant;
import com.boco.nbd.cams.core.constant.MessageConstant;
import com.boco.nbd.wios.manage.contants.WiosConstant;
import com.boco.nbd.wios.manage.entity.bo.Oem;
import com.boco.nbd.wios.manage.entity.bo.OemBo;
import com.boco.nbd.wios.manage.entity.common.bo.UploadFile;
import com.boco.nbd.wios.manage.service.impl.OemService;
import com.boco.nbd.wios.manage.util.CommonUtils;
import com.ihidea.component.api.v2.BaseResponse;
import com.ihidea.core.support.exception.ServiceException;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import springfox.documentation.annotations.ApiIgnore;

import java.util.ArrayList;
import java.util.List;

/**
 * 主机厂/4s店相关api
 *
 * @author
 */
@RestController
@RequestMapping("api")
@Api(tags = "主机厂和经销商管理接口")
@Slf4j
public class OemController {
    @Autowired
    private OemService oemService;

    private final static String LIKE_FLAG = "%";

    /**
     * 查询列表
     *
     * @param oemBo
     * @return
     */
    @GetMapping(value = "oem/list")
    @ApiOperation(value = "查询列表")
    @ApiImplicitParams({@ApiImplicitParam(name = "page", value = "一页显示数量", dataType = "int", paramType = "query", required = false),
            @ApiImplicitParam(name = "pagecount", value = "页码", dataType = "int", paramType = "query", required = false),
            @ApiImplicitParam(name = "code", value = "编码", dataType = "String", paramType = "query", required = false),
            @ApiImplicitParam(name = "contactName", value = "联系人姓名", dataType = "String", paramType = "query", required = false),
            @ApiImplicitParam(name = "manualDispatchOrder", value = "是否人工派单 0:否 1:是", dataType = "int", paramType = "query", required = false),
            @ApiImplicitParam(name = "name", value = "名称", dataType = "String", paramType = "query", required = false),
            @ApiImplicitParam(name = "type", value = "类型 1-主机厂 2-经销商", dataType = "int", paramType = "query", required = false),
            @ApiImplicitParam(name = "status", value = "状态 0禁用 1启用", dataType = "int", paramType = "query", required = false),
            @ApiImplicitParam(name = "regionId", value = "区域id", dataType = "int", paramType = "query", required = false),})
    public BaseResponse<Object> list(OemBo oemBo) {
        if (!StringUtils.isEmpty(oemBo.getCode()) && oemBo.getCode().contains(LIKE_FLAG)) {
            oemBo.setCode(oemBo.getCode().replaceAll(LIKE_FLAG, "\\\\%"));
        }
        if (!StringUtils.isEmpty(oemBo.getName()) && oemBo.getName().contains(LIKE_FLAG)) {
            oemBo.setName(oemBo.getName().replaceAll(LIKE_FLAG, "\\\\%"));
        }
        if (!StringUtils.isEmpty(oemBo.getOrganizationCode()) && oemBo.getOrganizationCode().contains(LIKE_FLAG)) {
            oemBo.setOrganizationCode(oemBo.getOrganizationCode().replaceAll(LIKE_FLAG, "\\\\%"));
        }
        return new BaseResponse<>(oemService.getList(oemBo));
    }

    /**
     * 查询自己及旗下经销商
     *
     * @param id
     * @return
     */
    @GetMapping(value = "oem/getSelfAndChildren")
    @ApiOperation(value = "查询自己及旗下经销商")
    @ApiImplicitParams({@ApiImplicitParam(name = "id", value = "主机厂id", dataType = "int", paramType = "query", required = true),})
    public BaseResponse<List<Oem>> getSelfAndChildren(Integer id) {
        return new BaseResponse<>(oemService.getSelfAndChildren(id));
    }

    /**
     * 新增
     *
     * @param oem
     */
    @PostMapping(value = "oem/add")
    @ApiOperation(value = "添加")
    @ApiImplicitParams({@ApiImplicitParam(name = "account", value = "账户", dataType = "String", paramType = "query", required = true),
            @ApiImplicitParam(name = "type", value = "类型 1-主机厂 2-经销商", dataType = "int", paramType = "query", required = true),
    })
    public BaseResponse<Object> add(OemBo oem) {
        if (oem.getType() == null) {
            throw new ServiceException(MessageConstant.MISSING_PARAM);
        }
        oemService.add(oem);
        return new BaseResponse<>();
    }

    /**
     * 更新
     *
     * @param oem
     */
    @PostMapping(value = "oem/update")
    @ApiOperation(value = "更新")
    @ApiImplicitParams({@ApiImplicitParam(name = "id", value = "主键id", dataType = "int", paramType = "query", required = true),
            @ApiImplicitParam(name = "code", value = "编码", dataType = "String", paramType = "query", required = false),
            @ApiImplicitParam(name = "contactName", value = "联系人姓名", dataType = "String", paramType = "query", required = false),
            @ApiImplicitParam(name = "manualDispatchOrder", value = "是否人工派单 0:否 1:是", dataType = "String", paramType = "query", required = false),
            @ApiImplicitParam(name = "name", value = "名称", dataType = "String", paramType = "query", required = false),
    })
    public BaseResponse<Object> update(OemBo oem) {
        oemService.update(oem);
        return new BaseResponse<>();
    }

    /**
     * 更新账号
     *
     * @param accountId
     * @param account
     * @return
     */
    @PostMapping(value = "oem/updateAccount")
    @ApiOperation(value = "更新账号")
    @ApiImplicitParams({@ApiImplicitParam(name = "accountId", value = "账号id", dataType = "int", paramType = "query", required = true),
            @ApiImplicitParam(name = "account", value = "登陆手机号", dataType = "String", paramType = "query", required = true),})
    public BaseResponse<Object> updateAccount(Integer accountId, String account) {
        if (StringUtils.isEmpty(account) || accountId == null) {
            throw new ServiceException(MessageConstant.MISSING_PARAM);
        }
        oemService.updateAccount(accountId, account);
        return new BaseResponse<>();
    }

    /**
     * 附件上传
     *
     * @param oemId
     * @param fileName
     * @param fileUrl
     */
    @PostMapping(value = "oem/fileUpload")
    @ApiOperation(value = "附件上传")
    @ApiImplicitParams({@ApiImplicitParam(name = "oemId", value = "主机厂id", dataType = "int", paramType = "query", required = true),
            @ApiImplicitParam(name = "fileName", value = "文件名", dataType = "String", paramType = "query", required = true),
            @ApiImplicitParam(name = "fileUrl", value = "文件地址", dataType = "String", paramType = "query", required = true),})
    public BaseResponse<Object> fileUpload(Integer oemId, String fileName, String fileUrl) {
        if (StringUtils.isEmpty(fileName) || oemId == null || StringUtils.isEmpty(fileUrl)) {
            throw new ServiceException(MessageConstant.MISSING_PARAM);
        }
        if (!StringUtils.isEmpty(fileUrl)) {
            String[] arr = fileUrl.split(CamsConstant.COMMA);
            List<String> list = new ArrayList<>();
            for (String s : arr) {
                list.add(CommonUtils.urlHandle(s));
            }
            fileUrl = StringUtils.collectionToCommaDelimitedString(list);
        }
        oemService.fileUpload(oemId, fileName, fileUrl);
        return new BaseResponse<>();
    }

    /**
     * 校验唯一性
     *
     * @param code
     * @param name
     * @return
     */
    @GetMapping(value = "oem/checkExist")
    @ApiOperation(value = "校验唯一性")
    @ApiImplicitParams({@ApiImplicitParam(name = "code", value = "编码", dataType = "String", paramType = "query", required = false),
            @ApiImplicitParam(name = "name", value = "名称", dataType = "String", paramType = "query", required = false),
            @ApiImplicitParam(name = "id", value = "主机厂id", dataType = "int", paramType = "query", required = false),})
    public BaseResponse<Boolean> checkExist(String code, String name, Integer id) {
        if (StringUtils.isEmpty(code) && StringUtils.isEmpty(name)) {
            return new BaseResponse<>(false);
        }
        if (!StringUtils.isEmpty(code)) {
            return new BaseResponse<>(false);
        }
        return new BaseResponse<>(oemService.checkExist(code, name, id));
    }

    /**
     * 查询订单附件列表
     *
     * @param id
     * @return
     */
    @GetMapping(value = "oem/getFiles")
    @ApiOperation(value = "查询附件列表")
    @ApiImplicitParams({@ApiImplicitParam(name = "id", value = "主机厂id", dataType = "String", paramType = "query", required = true)})
    public BaseResponse<List<UploadFile>> getFiles(Integer id) {
        Assert.notNull(id, WiosConstant.EMPTY_ID);
        return new BaseResponse<List<UploadFile>>(oemService.getFiles(id));
    }
}