package com.bonus.canteen.core.android.vo;

import cn.hutool.core.util.NumberUtil;
import cn.hutool.core.util.ObjectUtil;
import com.bonus.canteen.core.common.utils.FileUrlUtil;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.ToString;

import java.io.Serializable;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.List;
import java.util.Optional;

/**
 * @author 19814
 */
@Data
@ToString
@ApiModel("下发菜谱")
public class CookRecipeMealCompressVO implements Serializable {
   @ApiModelProperty("菜品id")
   private Long dishesId;
   @ApiModelProperty("自定义id")
   private Integer customId;
   @ApiModelProperty("菜品名称")
   private String productName;
   @ApiModelProperty("原价")
   private Integer originalPrice;
   @ApiModelProperty("销售模式")
   private Integer salseMode;
   @ApiModelProperty("质量偏差(g)")
   private BigDecimal weightDeviation;
   @ApiModelProperty("每份重量")
   private BigDecimal weight;
   @ApiModelProperty("菜品类型id")
   private Long typeId;
   @ApiModelProperty("菜品类型名称")
   private String typeName;
   @ApiModelProperty("菜品名称首字母")
   private String pinyinInitials;
   @ApiModelProperty("菜品名称全拼")
   private String pinyinFull;
   @ApiModelProperty("总嘌呤含量(mg/100g)")
   private BigDecimal purine;
   @ApiModelProperty("碘(μg/100g)")
   private BigDecimal iodine;
   @ApiModelProperty("菜品初始推荐分值")
   private Integer initialScore;
   @ApiModelProperty("热量(千卡/100g)")
   private BigDecimal calories;
   @ApiModelProperty("蛋白质(g/100g)")
   private BigDecimal protein;
   @ApiModelProperty("脂肪(g/100g)")
   private BigDecimal fat;
   @ApiModelProperty("碳水化合物(g/100g)")
   private BigDecimal carbohydrate;
   @ApiModelProperty("膳食纤维(g/100g)")
   private BigDecimal dietaryFiber;
   @ApiModelProperty("胆固醇(mg/100g)")
   private BigDecimal cholesterol;
   @ApiModelProperty("钙(mg/100g)")
   private BigDecimal calcium;
   @ApiModelProperty("钠(mg/100g)")
   private BigDecimal sodium;
   @ApiModelProperty("热量NRV(千卡/100g)")
   private BigDecimal caloriesNrv;
   @ApiModelProperty("蛋白质NRV(g/100g)")
   private BigDecimal proteinNrv;
   @ApiModelProperty("脂肪NRV(g/100g)")
   private BigDecimal fatNrv;
   @ApiModelProperty("碳水化合物NRV(g/100g)")
   private BigDecimal carbohydrateNrv;
   @ApiModelProperty("膳食纤维NRV(g/100g)")
   private BigDecimal dietaryFiberNrv;
   @ApiModelProperty("胆固醇NRV(mg/100g)")
   private BigDecimal cholesterolNrv;
   @ApiModelProperty("钙NRV(mg/100g)")
   private BigDecimal calciumNrv;
   @ApiModelProperty("钠NRV(mg/100g)")
   private BigDecimal sodiumNrv;
   @ApiModelProperty("菜品图片")
   private String foodImage;
   @ApiModelProperty("菜品简介")
   private String intro;
   @ApiModelProperty("菜品标签")
   private List<String> labelList;
   @ApiModelProperty("菜品主料")
   private List<String> mainList;
   @ApiModelProperty("菜品辅料")
   private List<String> auxList;
   @ApiModelProperty("菜品配料")
   private List<String> dosList;
   @ApiModelProperty("月销量")
   private Integer monthlySales;
   @ApiModelProperty("好评率")
   private BigDecimal goodProbability;

   private String salesMode;


   public String getFoodImage() {
      return FileUrlUtil.getFileUrl(this.foodImage);
   }

   public BigDecimal getWeightDeviation() {
      return ObjectUtil.isNull(this.weightDeviation) ? BigDecimal.ZERO : this.weightDeviation.setScale(0, RoundingMode.HALF_UP);
   }

   public BigDecimal getWeight() {
      return ObjectUtil.isNull(this.weight) ? BigDecimal.ZERO : this.weight.setScale(0, RoundingMode.HALF_UP);
   }

   public BigDecimal getCaloriesNrv() {
      return !ObjectUtil.isNull(this.weight) && !NumberUtil.equals(this.weight, BigDecimal.ZERO) ? ((BigDecimal)Optional.ofNullable(this.calories).orElse(BigDecimal.ZERO)).divide(this.weight, 4, RoundingMode.HALF_UP).multiply(new BigDecimal("100")).setScale(2, RoundingMode.HALF_UP).multiply(new BigDecimal("4.185")).divide(new BigDecimal("8400"), 4, RoundingMode.HALF_UP).multiply(new BigDecimal("100")).setScale(2, RoundingMode.HALF_UP) : BigDecimal.ZERO;
   }

   public BigDecimal getProteinNrv() {
      return !ObjectUtil.isNull(this.weight) && !NumberUtil.equals(this.weight, BigDecimal.ZERO) ? ((BigDecimal)Optional.ofNullable(this.protein).orElse(BigDecimal.ZERO)).divide(this.weight, 4, RoundingMode.HALF_UP).multiply(new BigDecimal("100")).setScale(2, RoundingMode.HALF_UP).divide(new BigDecimal("60"), 4, RoundingMode.HALF_UP).multiply(new BigDecimal("100")).setScale(2, RoundingMode.HALF_UP) : BigDecimal.ZERO;
   }

   public BigDecimal getFatNrv() {
      return !ObjectUtil.isNull(this.weight) && !NumberUtil.equals(this.weight, BigDecimal.ZERO) ? ((BigDecimal)Optional.ofNullable(this.fat).orElse(BigDecimal.ZERO)).divide(this.weight, 4, RoundingMode.HALF_UP).multiply(new BigDecimal("100")).setScale(2, RoundingMode.HALF_UP).divide(new BigDecimal("60"), 4, RoundingMode.HALF_UP).multiply(new BigDecimal("100")).setScale(2, RoundingMode.HALF_UP) : BigDecimal.ZERO;
   }

   public BigDecimal getCarbohydrateNrv() {
      return !ObjectUtil.isNull(this.weight) && !NumberUtil.equals(this.weight, BigDecimal.ZERO) ? ((BigDecimal)Optional.ofNullable(this.carbohydrate).orElse(BigDecimal.ZERO)).divide(this.weight, 4, RoundingMode.HALF_UP).multiply(new BigDecimal("100")).setScale(2, RoundingMode.HALF_UP).divide(new BigDecimal("300"), 4, RoundingMode.HALF_UP).multiply(new BigDecimal("100")).setScale(2, RoundingMode.HALF_UP) : BigDecimal.ZERO;
   }

   public BigDecimal getDietaryFiberNrv() {
      return !ObjectUtil.isNull(this.weight) && !NumberUtil.equals(this.weight, BigDecimal.ZERO) ? ((BigDecimal)Optional.ofNullable(this.dietaryFiber).orElse(BigDecimal.ZERO)).divide(this.weight, 4, RoundingMode.HALF_UP).multiply(new BigDecimal("100")).setScale(2, RoundingMode.HALF_UP).divide(new BigDecimal("25"), 4, RoundingMode.HALF_UP).multiply(new BigDecimal("100")).setScale(2, RoundingMode.HALF_UP) : BigDecimal.ZERO;
   }

   public BigDecimal getCholesterolNrv() {
      return !ObjectUtil.isNull(this.weight) && !NumberUtil.equals(this.weight, BigDecimal.ZERO) ? ((BigDecimal)Optional.ofNullable(this.cholesterol).orElse(BigDecimal.ZERO)).divide(this.weight, 4, RoundingMode.HALF_UP).multiply(new BigDecimal("100")).setScale(2, RoundingMode.HALF_UP).divide(new BigDecimal("300"), 4, RoundingMode.HALF_UP).multiply(new BigDecimal("100")).setScale(2, RoundingMode.HALF_UP) : BigDecimal.ZERO;
   }

   public BigDecimal getCalciumNrv() {
      return !ObjectUtil.isNull(this.weight) && !NumberUtil.equals(this.weight, BigDecimal.ZERO) ? ((BigDecimal)Optional.ofNullable(this.calcium).orElse(BigDecimal.ZERO)).divide(this.weight, 4, RoundingMode.HALF_UP).multiply(new BigDecimal("100")).setScale(2, RoundingMode.HALF_UP).divide(new BigDecimal("800"), 4, RoundingMode.HALF_UP).multiply(new BigDecimal("100")).setScale(2, RoundingMode.HALF_UP) : BigDecimal.ZERO;
   }

   public BigDecimal getSodiumNrv() {
      return !ObjectUtil.isNull(this.weight) && !NumberUtil.equals(this.weight, BigDecimal.ZERO) ? ((BigDecimal)Optional.ofNullable(this.sodium).orElse(BigDecimal.ZERO)).divide(this.weight, 4, RoundingMode.HALF_UP).multiply(new BigDecimal("100")).setScale(2, RoundingMode.HALF_UP).divide(new BigDecimal("2000"), 4, RoundingMode.HALF_UP).multiply(new BigDecimal("100")).setScale(2, RoundingMode.HALF_UP) : BigDecimal.ZERO;
   }

   public Integer getMonthlySales() {
      return (Integer)Optional.ofNullable(this.monthlySales).orElse(0);
   }

   public BigDecimal getGoodProbability() {
      return (BigDecimal)Optional.ofNullable(this.goodProbability).orElse(BigDecimal.ZERO);
   }
}
