<template>
  <div class="app-container">
    <el-form ref="form" :model="form" :rules="rules" label-width="150px">
      <products-selector ref="productSelector" v-model="form.productIdList" show-all @setall="isAllProduct=$event" :default-ids="form.productIdList" enable-filtered @setFiltered="isAllFilteredProduct=$event" class="mb-20" />

      <routers-selector v-model="selectedRoutes" :type="type" />

      <el-card style="margin-bottom: 10px">
        <div slot="header" style="font-size:20px;">
          {{$t('价格设置')}}
          <!--空运只有阶梯价格，不显示阶梯价格勾选-->
          <span v-if="type != 'air'">
            <el-checkbox label="" @change="form.stepPrice=$event ? 1 : 0">{{$t('阶梯价格')}}</el-checkbox>
          </span>
        </div>
        <el-row :gutter="20">
          <el-col :span="12">
            <el-form-item :label="$t('预付')" prop="needPay" >
              <el-radio-group v-model="form.needPay">
                <el-radio :label="1">{{ $t('预付') }}</el-radio>
                <el-radio :label="0">{{ $t('均可') }}</el-radio>
              </el-radio-group>
            </el-form-item>
            <el-form-item :label="$t('单价模式')" prop="priceType">
              <dict-selector :type="DICT_TYPE.ECW_PRICE_TYPE" v-model="form.priceType" form-type="radio" formatter='number' />
            </el-form-item>
            <el-form-item
              :label="$t('最小起计量')"
              :prop="`minWeight`"
            >
              <el-input-number v-model="form.minWeight" class="w-100" :min="0" :controls="false"/>
              / <selector v-model="form.minWeightUnit" :options="unitList" :label-field="$l(null, 'title')" value-field="id"  class="w-100" disabled />
            </el-form-item>
          </el-col>
          <el-col :span="12">
						<quick-set :unit-list="unitList" :currency-list="currencyList" :value="form" type="sea"></quick-set>
          </el-col>
        </el-row>

				<template v-if="form.stepPrice">
					<!--全包价-->
					<template v-if="form.priceType==1" >
						<div v-for="(item, index) in form.fullPriceStepList" :key="index">
							<price-step
								ref="stepPrice"
								:index="index"
								:currency-list="currencyList"
								:unit-list="unitList"
								field-prefix="all"
								:price-name="$t('全包价')"
								:show-add="index === form.fullPriceStepList.length -1"
								:value="item"
								@add="handleAddPrice('fullPriceStepList', $event)"
								@delete="handleDeletePrice('fullPriceStepList', $event)"
								@changeUnit="handleUnitChange(form.fullPriceStepList, index, ...$event)"
							></price-step>
						</div>
					</template>
					<el-row v-else :gutter="20" class="mt-20">
						<el-col :span="12">
							<div v-for="(item, index) in form.freightPriceStepList" :key="index">
								<price-step
									ref="stepPrice"
									:index="index"
									:currency-list="currencyList"
									:unit-list="unitList"
									field-prefix="transport"
									:price-name="$t('运费')"
									:show-add="index === form.freightPriceStepList.length -1"
									:value="item"
									@add="handleAddPrice('freightPriceStepList', $event)"
									@delete="handleDeletePrice('freightPriceStepList', $event)"
									@changeUnit="handleUnitChange(form.freightPriceStepList, index, ...$event)"
								></price-step>
							</div>
						</el-col>
						<el-col :span="12">
							<div v-for="(item, index) in form.clearancePriceStepList" :key="index">
								<price-step
									ref="stepPrice"
									:index="index"
									:currency-list="currencyList"
									:unit-list="unitList"
									field-prefix="clearance"
									:price-name="$t('清关费')"
									:show-add="index === form.clearancePriceStepList.length -1"
									:value="item"
									@add="handleAddPrice('clearancePriceStepList', $event)"
									@delete="handleDeletePrice('clearancePriceStepList', $event)"
									@changeUnit="handleUnitChange(form.clearancePriceStepList, index, ...$event)"
								></price-step>
							</div>
						</el-col>
					</el-row>
				</template>
        <template v-else-if="form.priceType === 1">
          <sea-price
            ref="seaPrice"
            :currency-list="currencyList"
            :unit-list="unitList"
            :value="form"
            field-prefix="all"
            :price-name="$t('全包价')"
            packaging-field="fullPricePackagingList"
            @changeUnit="handleFormUnitChange($event)"
          ></sea-price>
        </template>
        <template v-else>
          <el-row :gutter="20">
            <el-col :span="12">
              <sea-price
                ref="seaPrice"
                :currency-list="currencyList"
                :unit-list="unitList"
                :value="form"
                field-prefix="transport"
                :price-name="$t('运费')"
                packaging-field="freightPricePackagingList"
                @changeUnit="handleFormUnitChange($event)"
              ></sea-price>
            </el-col>
            <el-col :span="12">
              <sea-price
                ref="seaPrice"
                :currency-list="currencyList"
                :unit-list="unitList"
                :value="form"
                field-prefix="clearance"
                :price-name="$t('清关费')"
                packaging-field="clearancePricePackagingList"
                @changeUnit="handleFormUnitChange($event)"
              ></sea-price>
            </el-col>
          </el-row>
        </template>
        <el-form-item :label="$t('价格有效期')">
          <el-date-picker v-model="form.validateStartDate" value-format="yyyy-MM-dd HH:mm:ss"></el-date-picker>
          -
          <el-date-picker v-model="form.validateEndDate" value-format="yyyy-MM-dd HH:mm:ss"></el-date-picker>
        </el-form-item>
      </el-card>


      <el-card>
        <div slot="header" style="font-size:20px;">
          {{$t('基础信息')}}
        </div>

        <el-form-item :label="$t('是否预约入仓')" prop="needBook">
          <el-radio v-model.number="form.needBook" :label="1">{{$t('是')}}</el-radio>
          <el-radio v-model.number="form.needBook" :label="0">{{$t('否')}}</el-radio>
        </el-form-item>

        <!--下面几个字段只有批量设置海运才需要-->
        <template v-if="type == 'sea'">
          <el-form-item :label="$t('每日入仓上限')" prop="dayLimit" v-if="form.needBook == 1">
            <el-input v-model.number="form.dayLimit" type="number" class="w-100" />{{$t('立方米')}}
          </el-form-item>

          <el-form-item :label="$t('货柜位置')" prop="containerLocation">
            <dict-selector :type="DICT_TYPE.ECW_CONTAINER_LOCATION" v-model="form.containerLocation" />
          </el-form-item>

          <el-form-item :label="$t('订单方数上限')" prop="square">
            <el-input v-model.number="form.square" type="number" style="width:200px" />
          </el-form-item>
        </template>

        <el-form-item :label="$t('是否单询')" prop="inquiry">
          <dict-selector :type="DICT_TYPE.NEED_ORDER_INQUIRY" v-model="form.needOrderInquiry" form-type="radio" formatter="number"></dict-selector>
        </el-form-item>
      </el-card>
    </el-form>

    <div style="margin: 20px 0">
      <el-button @click="submitForm" type="primary" :loading="loading">{{$t('确认提交')}}</el-button>
      <el-button type="default" @click="$router.back()">{{$t('返回上一页')}}</el-button>
    </div>
  </div>
</template>
<script>
import RoutersSelector from '@/components/RoutersSelector'
import {batchUpdateProductPrice, getProductPrice} from "@/api/ecw/productPrice";
import { getCurrencyList } from '@/api/ecw/currency';
import { getUnitList } from '@/api/ecw/unit';
import ProductsSelector from '@/components/ProductsSelector'
import Selector from '@/components/Selector'
import Inputor from '@/components/Inputor'
import Decimal from 'decimal.js'
import {getProduct} from "@/api/ecw/product";
import QuickSet from "@/views/ecw/productPrice/components/QuickSet.vue";
import PriceStep from "@/views/ecw/productPrice/components/PriceStep.vue";
import SeaPrice from "@/views/ecw/productPrice/components/SeaPrice.vue";
import Template from "@/views/cms/template/index.vue";

const DEFAULT_PRICE_UNIT = 1
const DEFAULT_VOLUME_UNIT = 7
const DEFAULT_WEIGHT_UNIT = 7

export default {
  components: {Template, SeaPrice, PriceStep, QuickSet, RoutersSelector, ProductsSelector, Selector, Inputor },
  data() {
    return {
      checkList: [],
      selectedRoutes: [], // 勾选的路线渠道
      form: {
        specialList: [],
        priceStepList: [],
        stepPrice: 0,
        priceType: null,
        minWeightUnit: null,
        allVolumeUnit: DEFAULT_VOLUME_UNIT,
        transportVolumeUnit: DEFAULT_VOLUME_UNIT,
        clearanceVolumeUnit: DEFAULT_VOLUME_UNIT,
        // advanceStatus: 0,
        // needBook: 0,
        // dayLimit: 10000
      },
      isAllProduct: false, // 是否全部商品
      isAllFilteredProduct: false, // 是否勾選全部搜索結果
      specialProducts: [],
      // priceStepList: [{},{}], // 阶梯价格
      // specialList:[], // 特殊需求,默认四个
      rules: {},
      product: null,
      /* productType: null, */
      currencyList: [],
      unitList: [],
      productTypeList: [],
      productDisabled: true,
      lineList: [], //路线数组
      loading: false,
      // 批量加价/减价
      quickForm:{}
    }
  },
  computed: {
    // 类型，默认海运sea,air表示空运
    type(){
      let type = this.$route.path.split(/[-_]/).pop()
      if(type == 'air' || type == 'sea') return type
      return null
    },
    // 默认运费的货币和体积单位
    currencyAndUnit(){
      let currency = null, unit = null, fields = null
      // 如果是阶梯价格则取第一阶梯,否则就取form中的字段
      let obj = this.form.stepPrice == 1 ? this.form.priceStepList[0] : this.form
      // 全包价
      if(this.form.priceType == 1){
        currency = obj.allPriceUnit
        unit = obj.allVolumeUnit
      }else{
        currency = obj.transportPriceUnit
        unit = obj.transportVolumeUnit
      }

      return {currency, unit}
    },
    // 判断是否空值
    isEmpty(){
      return (content) => {
        return !content && content !== 0 && content !== '0'
      }
    },
  },
  watch: {
    checkList() { //选择路线
      if (this.checkList.length > 0) {
        this.form.lineChannelList = this.checkList.map(item => {
          return { lineId: item, shippingChannelId: 0 }
        })
      } else {
        this.form.lineChannelList = []
      }
    },
    product() {
      this.$set(this.form, 'productType', this.product.typeId)
    },
    'form.stepPrice'(stepPrice){
        if(this.form.stepPrice === 1){
            this.initStepPrice()
        }
        this.syncMinWeightUnit()
    },
    'form.priceType'(priceType){
        if(this.form.stepPrice === 1){
            this.initStepPrice()
        }
        this.syncMinWeightUnit()
    },
    'form.needBook'(val){
      if(val) this.$set(this.form, 'dayLimit', 10000)
      else delete this.form.dayLimit
    },
  },
  async created() {
    this.currencyList = (await getCurrencyList())?.data || []
    this.unitList = (await getUnitList())?.data || []

    await this.$nextTick()

    // 如果是复制，则获取数据并填充，先复制，然后填充特需，避免数据的特需不全导致部分不显示
    if(this.$route.query.templateId){
      await this.getTemplateDetail(this.$route.query.templateId)
    }

    // 从价格中获取特需的默认单位
    this.getDictDatas(this.DICT_TYPE.ECW_SPECIAL_REQ_FOR_LINE_PRODUCTS).forEach(item => {
        // 没有的才push，已有的可能是从复制模板携带过来的数据
        if(!this.form.specialList.find(special => special.specialDictType == item.value)) {
          console.log('特需push', item.value)
          this.form.specialList.push({
            "clearancePrice": null,
            "clearancePriceUnit": DEFAULT_PRICE_UNIT,
            "clearanceVolumeUnit": DEFAULT_VOLUME_UNIT,
            "specialDictType": item.value,
            "transportPrice": null,
            "transportPriceUnit": DEFAULT_PRICE_UNIT,
            "transportVolumeUnit": DEFAULT_VOLUME_UNIT,
          })
        }else console.log('已存在特需', item.value)
    })


  },
  methods: {
    // 获取模板数据(复制的源路线价格信息)
    async getTemplateDetail(id){
      const res = await getProductPrice(id)
      // 填充商品、线路、价格信息、出货渠道（空运）
      // this.form.productIdList = [res.data.productId]
      /* 23-11-07要求不复制商品和线路 https://zentao.test.jdshangmen.com/bug-view-5145.html
      this.selectedRoutes = [{
        "lineId": res.data.warehouseLineId,
        "channelId": res.data.shippingChannelId,
        "transportId": res.data.warehouseLineDO.transportType,
        "shippingChannelId":res.data.channelId
      }]*/
      // 要复制过来的字段
      const {
        allPrice,
        allPriceUnit,
        allVolumeUnit,
        transportPrice,
        transportPriceUnit,
        transportVolumeUnit,
        clearancePrice,
        clearancePriceUnit,
        clearanceVolumeUnit,
        priceType,
        stepPrice,
        specialList,
        priceStepList,
        minWeight,
        minWeightUnit,
        needOrderInquiry,
        needBook,
        needPay,
        freightPriceStepList,
        clearancePriceStepList,
        fullPriceStepList
      } = res.data

      const data = {
        allPrice,
        allPriceUnit,
        allVolumeUnit,
        transportPrice,
        transportPriceUnit,
        transportVolumeUnit,
        clearancePrice,
        clearancePriceUnit,
        clearanceVolumeUnit,
        priceType,
        stepPrice,
        specialList,
        priceStepList,
        minWeight,
        minWeightUnit,
        needOrderInquiry,
        needBook,
        needPay,
        freightPriceStepList,
        clearancePriceStepList,
        fullPriceStepList
      }
      // 海运需要填充货柜位置和订单方数上限
      if(this.type == 'sea'){
        data.containerLocation = res.data.containerLocation
        data.square = res.data.square
      }
      this.$set(this, 'form', Object.assign({}, this.form, data))

      // 产品选择器默认选择的商品
      /* 23-11-07要求不复制商品和线路 https://zentao.test.jdshangmen.com/bug-view-5145.html
      getProduct(res.data.productId).then(res => {
        this.$refs.productSelector.choose(res.data)
      })*/
    },
    // 设置最小起计量单位
    syncMinWeightUnit(){
        // 如果是阶梯价
        if(this.form.stepPrice){
            const field = this.form.priceType === 1 ? "fullPriceStepList" : "freightPriceStepList"
            const stepPriceList = this.form[field]
            if(stepPriceList?.length){
                this.form.minWeightUnit = stepPriceList[0]?.weightUnit || DEFAULT_WEIGHT_UNIT
            }else {
                this.form.minWeightUnit = DEFAULT_WEIGHT_UNIT
            }
        }else{
            this.form.minWeightUnit = this.form[this.form.priceType === 1 ? 'allVolumeUnit' : 'transportVolumeUnit'] || DEFAULT_WEIGHT_UNIT
        }
    },
    handleAddPrice(field, fieldPrefix){
      if(!this.form[field]){
        this.$set(this.form, field, [])
      }
      let priceUnit = DEFAULT_PRICE_UNIT
      let volumeUnit = DEFAULT_VOLUME_UNIT
      let weightUnit = DEFAULT_WEIGHT_UNIT
      if(this.form[field].length){
        const first = this.form[field][0]
        priceUnit = first[`${fieldPrefix}PriceUnit`]
        volumeUnit = first[`${fieldPrefix}VolumeUnit`]
        weightUnit = first.weightUnit
      }
      console.log("添加价格的默认单位", {
        priceUnit,
        volumeUnit,
        weightUnit
      })
      this.form[field].push({
        [`${fieldPrefix}PriceUnit`]: priceUnit,
        [`${fieldPrefix}VolumeUnit`]: volumeUnit,
        weightUnit: weightUnit,
        specialList:[]
      })
    },
    handleDeletePrice(field, index){
      this.form[field].splice(index, 1)
    },
    handleUnitChange(stepPriceList, index, data){
      console.log('handleUnitChange', ...arguments)
      if(index > 0) return
      const isVolumeUnit = data.field.indexOf("VolumeUnit") > -1
      // 如果是重量单位,且不是清关费想换的，则需要同步最小起计量单位
      if(isVolumeUnit && data.type != 'clearance'){
        this.form.minWeightUnit = data.value
      }
      stepPriceList.forEach(item => {
        item[data.field] = data.value
        // 如果是设置体积单位，则还需要同步到阶梯重量单位
        if(isVolumeUnit){
          item['weightUnit'] = data.value
        }
        if(item.packagingList?.length){
          item.packagingList.forEach(p => {
            if(data.field.indexOf("PriceUnit") > -1){
              p['packagingPriceUnit'] = data.value
            }
            if(data.field.indexOf("VolumeUnit") > -1){
              p['packagingVolumeUnit'] = data.value
            }
          })
        }
        if(item.specialList?.length){
          item.specialList.forEach(p => {
            p[data.field] = data.value
          })
        }
      })
    },

    // 获得用语提交的阶梯价副本
    getPriceList(stepList, prefix){
      if(!stepList?.length) return []
      let stepPriceList = JSON.parse(JSON.stringify(stepList))
      stepPriceList.forEach((item, index) => {
        item.rankNum = index + 1
        item.packagingList = item.packagingList.filter(p => !!p.packagingTypes?.length)
        item.packagingList = item.packagingList.map( p => {
          p.packagingTypes = p.packagingTypes.join(",")
          return p
        })
      })
      // 240121应老王要求，未设置价格的不提交
      return stepPriceList.filter(item => {
        return !!item[`${prefix}Price`]
      })
    },
    // 格式化包装类型费用
    getPackingPrice(packging){
      if(!packging?.length) return
      packging = JSON.parse(JSON.stringify(packging))
      return packging.filter(item => !!item.packagingTypes).map(item => {
        item.packagingTypes = item.packagingTypes?.join(",") || ""
        return item
      })
    },
    // 非阶梯价格更新单位
    handleFormUnitChange(data){
      console.log("handleFormUnitChange", {...data})
      // 海运非阶梯价没有重量单位，所以按照体积单位同步最小起计量单位
      if(data.field === 'transportVolumeUnit' || data.field == 'allVolumeUnit'){
          this.form.minWeightUnit = data.value
      }

      if(this.form.specialList?.length){
        this.form.specialList.forEach(p => {
          p[data.field] = data.value
        })
      }

      // 同步包装的单位
      let packingField = {
        transportVolumeUnit: 'freightPricePackagingList',
        clearanceVolumeUnit: 'clearancePricePackagingList',
        allVolumeUnit: 'fullPricePackagingList',
        transportPriceUnit: 'freightPricePackagingList',
        clearancePriceUnit: 'clearancePricePackagingList'
      }[data.field]
      if(!this.form[packingField]?.length){
        return false
      }
      this.form[packingField].forEach(item => {
        if(data.field.indexOf("PriceUnit") > -1){
          item['packagingPriceUnit'] = data.value
        }
        if(data.field.indexOf("VolumeUnit") > -1){
          item['packagingVolumeUnit'] = data.value
        }
      })
    },
    initStepPrice(){
      if(this.form.priceType == 1 && !this.form.fullPriceStepList?.length){
        this.handleAddPrice("fullPriceStepList", 'all')
      }
      if(this.form.priceType === 0){
        if(!this.form.freightPriceStepList?.length){
          this.handleAddPrice('freightPriceStepList', 'transport')
        }
        if(!this.form.clearancePriceStepList?.length){
          this.handleAddPrice('clearancePriceStepList', 'clearance')
        }
      }
    },
    submitForm() {
      this.$refs["form"].validate(async (valid) => {
        if (!valid) {
          return;
        }

        // 只有新增的时候做判断
        if (!this.$route.query.ids && (!this.selectedRoutes || !this.selectedRoutes.length)) {
          this.$message.error(this.$t('请选择线路'));
          return;
        }

        let data = Object.assign({}, this.form, {
          // lineChannelList: this.selectedRoutes,
          // specialList: this.specialProducts,
          isAllProduct: this.isAllProduct ? 1:0,
          // 阶梯价
          freightPriceStepList: [],
          clearancePriceStepList: [],
          fullPriceStepList: [],
          // 非阶梯价包装类型
          freightPricePackagingList: [],
          clearancePricePackagingList: [],
          fullPricePackagingList: []
        })

        // 如果是勾選了全部篩選商品，則獲取商品ID
        if(this.isAllFilteredProduct){
          data.productIdList = await this.$refs.productSelector.getFilteredIds()
        }
        if(!data.isAllProduct && (!data.productIdList || !data.productIdList.length)){
          return this.$message.error('请选择商品')
        }

        // 阶梯价校验
        /* 根据甲方要求不做校验，所有字段均可留空，https://zentao.test.jdshangmen.com/bug-view-5915.html
        if(this.$refs.stepPrice){
            let isValid = true
            for (let stepPrice of this.$refs.stepPrice){
                if(!stepPrice.validate()){
                    isValid = false
                    break
                }
            }
            if(!isValid)return
        } */
        if(data.stepPrice){
          // 全包价
          if(this.form.priceType == 1) {
            data.fullPriceStepList = this.getPriceList(this.form.fullPriceStepList, 'all')
          }else{
            data.clearancePriceStepList = this.getPriceList(this.form.clearancePriceStepList, 'clearance')
            data.freightPriceStepList = this.getPriceList(this.form.freightPriceStepList, 'transport')
          }
        }
        // 非阶梯价则需要提交包装类型
        else{
          if(this.form.priceType == 1){
            data.fullPricePackagingList = this.getPackingPrice(this.form.fullPricePackagingList)
          }else{
            data.freightPricePackagingList = this.getPackingPrice(this.form.freightPricePackagingList)
            data.clearancePricePackagingList = this.getPackingPrice(this.form.clearancePricePackagingList)
          }
        }


        data.lineChannelList = this.selectedRoutes

        if(data.lineChannelList.length < 1){
          return this.$message.error(this.$t('请选择需要修改的路线'))
        }
        await this.$confirm(this.$t('已选择{route}条路线，{product}个商品；确认提交修改？', {
          route: data.lineChannelList.length,
          product: this.isAllProduct ? this.$refs.productSelector.allTotal : data.productIdList.length
        }))
        this.loading = true
        console.log('提交批量修改', data)
        batchUpdateProductPrice(data).then(response => {
          this.$modal.msgSuccess(this.$t("修改成功"));
          this.$router.replace('/lineProject/product-price?' + (new URLSearchParams(this.$route.query)).toString())
        })
        .finally(res => this.loading = false)
      });
    },
    // 快捷设置,只更新默认运费
    quickSet(){
      // 字段，根据是否全包价来取
      let field = this.form.priceType == 1 ? 'allPrice' : 'transportPrice'
      // 取得要加的数额（减少则是负数）
      let amount = Decimal(this.quickForm.plus || -this.quickForm.minus)
      this.form.priceStepList.forEach(item => {
        // 加上对应的价格，但是不能小于0
        this.$set(item, field, Math.max(0, Decimal(item[field] || 0).plus(amount).toNumber()))
      })
    }
  }
}
</script>
<style scoped>
.w100{
  width: 100px;
}
.mr10{
  margin-right: 10px;
}
</style>
