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

import cn.hutool.core.lang.Assert;
import com.boco.nbd.cams.core.constant.MessageConstant;
import com.boco.nbd.wios.manage.contants.WiosConstant;
import com.boco.nbd.wios.manage.entity.settlement.po.Settlement;
import com.boco.nbd.wios.manage.entity.settlement.po.SettlementDetail;
import com.boco.nbd.wios.manage.entity.settlement.po.SettlementDetailSupplier;
import com.boco.nbd.wios.manage.entity.settlement.vo.SettlementVo;
import com.boco.nbd.wios.manage.service.impl.SettlementService;
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 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.math.BigDecimal;
import java.text.ParseException;
import java.util.List;

/**
 * 结算相关接口
 * 
 * @author xgl
 * @version [版本号, 2020年9月28日]
 */
@RestController
@RequestMapping("api")
@Api(tags = "结算相关接口")
@ApiIgnore
public class SettlementController {
    @Autowired
    private SettlementService settlementService;
    
    /**
     * 确认信息
     *
     * @param id
     * @param totalTax
     * @param totalPriceActual
     * @param remark
     * @return
     */
    @PostMapping(value = "settlement/confirm")
    @ApiOperation(value = "确认信息")
    @ApiImplicitParams({@ApiImplicitParam(name = "id", value = "主键id", dataType = "int", paramType = "query", required = true),
        @ApiImplicitParam(name = "totalTaxActual", value = "实际结算总税金(元)", dataType = "double", paramType = "query", required = true),
        @ApiImplicitParam(name = "totalPriceActual", value = "实际结算总金额(元)不含税", dataType = "double", paramType = "query", required = true),
        @ApiImplicitParam(name = "remark", value = "备注", dataType = "String", paramType = "query", required = false),})
    public BaseResponse<Object> confirm(Integer id, BigDecimal totalTaxActual, BigDecimal totalPriceActual, String remark) {
        Assert.notNull(id, WiosConstant.EMPTY_ID);
        Assert.notNull(totalTaxActual, "totalTaxActual不能为空");
        Assert.notNull(totalPriceActual, "totalPriceActual不能为空");
        Settlement settlement = new Settlement();
        settlement.setTotalTaxActual(totalTaxActual);
        settlement.setTotalPriceActual(totalPriceActual);
        settlement.setRemark(remark);
        settlement.setStatus(2);
        settlementService.update(id, settlement);
        return new BaseResponse<Object>();
    }
    
    /**
     * 查询结算单列表
     *
     * @param settlement
     * @return
     */
    @GetMapping(value = "settlement/all")
    @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 = "settlementId", value = "结算单号", dataType = "String", paramType = "query", required = false),
        @ApiImplicitParam(name = "totalPrice", value = "总金额", dataType = "int", paramType = "query", required = false),
        @ApiImplicitParam(name = "totalPriceWithTax", value = "结算总金额(含税)", dataType = "int", paramType = "query", required = false),
        @ApiImplicitParam(name = "totalTax", value = "总税金", dataType = "int", paramType = "query", required = false),
        @ApiImplicitParam(name = "totalPriceActual", value = "实际结算金额", dataType = "int", paramType = "query", required = false),
        @ApiImplicitParam(name = "targetName", value = "名称", dataType = "String", paramType = "query", required = false),
    
    })
    public BaseResponse<List<SettlementVo>> getList(Settlement settlement) {
        return new BaseResponse<List<SettlementVo>>(settlementService.getList(settlement));
    }
    
    /**
     * 查询主机厂结算单详情列表
     *
     * @param settlement
     * @return
     */
    @GetMapping(value = "settlement/oem/detailList")
    @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 = "settlementId", value = "结算单号", dataType = "String", paramType = "query", required = true),})
    public BaseResponse<List<SettlementDetail>> getOemDetailList(String settlementId) {
        if (StringUtils.isEmpty(settlementId)) {
            throw new ServiceException(MessageConstant.MISSING_PARAM);
        }
        return new BaseResponse<>(settlementService.getDetailList(settlementId));
    }
    
    /**
     * 查询服务商结算单详情列表
     *
     * @param settlementId
     * @return
     */
    @GetMapping(value = "settlement/supplier/detailList")
    @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 = "settlementId", value = "结算单号", dataType = "String", paramType = "query", required = true),})
    public BaseResponse<List<SettlementDetailSupplier>> getSupplierDetailList(String settlementId) {
        if (StringUtils.isEmpty(settlementId)) {
            throw new ServiceException(MessageConstant.MISSING_PARAM);
        }
        return new BaseResponse<>(settlementService.getDetailListForSupplier(settlementId));
    }
    
    /**
     * 查询主机厂结算单总价
     *
     * @param settlementId
     * @return
     */
    @GetMapping(value = "settlement/qryTotalPrice")
    @ApiOperation(value = "查询主机厂结算单总价")
    @ApiImplicitParams({
        @ApiImplicitParam(name = "settlementId", value = "结算单号", dataType = "String", paramType = "query", required = true),})
    public BaseResponse<BigDecimal> qryTotalPrice(String settlementId) {
        if (StringUtils.isEmpty(settlementId)) {
            throw new ServiceException(MessageConstant.MISSING_PARAM);
        }
        return new BaseResponse<>(settlementService.getOemTotalPrice(settlementId));
    }
    
    /**
     * 查询服务商结算单总价
     *
     * @param settlementId
     * @return
     */
    @GetMapping(value = "settlement/qrySupplierTotalPrice")
    @ApiOperation(value = "查询服务商结算单总价")
    @ApiImplicitParams({
        @ApiImplicitParam(name = "settlementId", value = "结算单号", dataType = "String", paramType = "query", required = true),})
    public BaseResponse<BigDecimal> qrySupplierTotalPrice(String settlementId) {
        if (StringUtils.isEmpty(settlementId)) {
            throw new ServiceException(MessageConstant.MISSING_PARAM);
        }
        return new BaseResponse<>(settlementService.getSupplierTotalPrice(settlementId));
    }

    /**
     * @Description 手动生成主机厂结算单
     * @Param [startDate, endDate, oemIds]
     * @author liwenxiang
     * @date 2021/7/29 13:42
     * @return com.ihidea.component.api.v2.BaseResponse<java.lang.Object>
     */
    @PostMapping(value = "settlement/generateOemSettlement")
    @ApiOperation(value = "手动生成主机厂结算单")
    @ApiImplicitParams({@ApiImplicitParam(name = "startDate", value = "开始日期,格式(YYYY-MM-DD)", dataType = "String", paramType = "query", required = true),
            @ApiImplicitParam(name = "endDate", value = "结束日期,格式(YYYY-MM-DD)", dataType = "String", paramType = "query", required = true),
            @ApiImplicitParam(name = "oemIds", value = "主机厂id(多个用逗号隔开)", dataType = "String", paramType = "query", required = true)})
    public BaseResponse<Object> generateOemSettlement(String startDate,String endDate,String oemIds) throws ParseException {
        //校验开始日期和结束日期格式(YYYY-MM-DD)、主机厂id
        Assert.notBlank(startDate,"开始日期不能为空");
        Assert.notBlank(endDate,"结束日期不能为空");
        Assert.notBlank(oemIds,"主机厂id不能为空");
        settlementService.generateOemSettlementById(startDate,endDate,oemIds);
        return new BaseResponse<Object>();
    }
}