/*
 * @Description  :
 * @Version      : 1.0
 * @Author       : Shiming
 * @Date         : 2021-12-14 14:03:07
 * @LastEditors  : Shiming
 * @LastEditTime : 2022-03-01 19:27:28
 * @FilePath     : \\tms-obc-web\\src\\app\\routes\\order-management\\modal\\bulk\\update-freight\\update-freight.component.ts
 * Copyright (C) 2022 huzhenhong. All rights reserved.
 */
import { Component, Input, OnInit, ViewChild } from '@angular/core';
import { SFComponent, SFNumberWidgetSchema, SFSchema, SFSelectWidgetSchema, SFStringWidgetSchema, SFTextWidgetSchema } from '@delon/form';
import { NzModalRef } from 'ng-zorro-antd/modal';
import { Subscription } from 'rxjs';
import { OrderManagementService } from '../../../services/order-management.service';

@Component({
  selector: 'app-order-management-update-freight',
  templateUrl: './update-freight.component.html',
  styleUrls: ['./update-freight.component.less']
})
export class UpdateFreightComponent implements OnInit {
  @ViewChild('sf', { static: false }) sf!: SFComponent;
  schema!: SFSchema;

  @Input()
  data: any;
  freightTypeOptions: any;

  calculateSub!: Subscription;
  constructor(private service: OrderManagementService, private modal: NzModalRef) {}

  ngOnInit(): void {
    this.schema = this.initSF(this.data);
    this.service.getDictByKey('freight:type').subscribe(res => {
      this.freightTypeOptions = res;
    });
  }

  /**
   * 初始化表单
   */
  private initSF(data: any): SFSchema {
    return {
      properties: {
        freightPrice: {
          type: 'number',
          title: '运费单价',
          ui: {
            placeholder: '请输入',
            widget: 'custom',
            grid: { span: 12 },
          } as SFStringWidgetSchema,
          default: data.freightPrice
        },
        rule: {
          title: '',
          type: 'string',
          default: data.rule,
          enum: [
            { label: '保留小数', value: '1' },
            { label: '抹除小数', value: '2' },
            { label: '抹除个数', value: '3' }
          ],
          ui: {
            widget: 'select',
            spanLabelFixed: 10,
            grid: {
              span: 10
            }
          } as SFSelectWidgetSchema
        },
        settlementBasis: {
          title: '结算依据',
          type: 'string',
          default: data.settlementBasis,
          ui: {
            widget: 'dict-select',
            params: { dictKey: 'goodresource:settlement:type' },
            containsAllLabel: false,
            placeholder: '结算依据',
            errors: { required: '请选择结算依据' },
            grid: {span: 12}
          } as SFSelectWidgetSchema
        },
        blank1: {
          title: '',
          type: 'string',
          ui: { widget: 'text', grid: { span: 12 }, class: 'input-back' },
          default: ' '
        },
        freightType: {
          title: '',
          type: 'string',
          ui: { hidden: true },
          default: data.freightType
        },
        loadWeight: {
          type: 'number',
          title: '装货重量',
          default: data.loadWeight || 0,
          minimum: 0,
          maximum: 99999,
          ui: {
            unit: '吨',
            placeholder: '请输入',
            grid: {
              span: 12
            },
            hideStep: true,
            change: (val: any) => this.changeNumVal()
          } as SFNumberWidgetSchema
        },
        loadVolume: {
          type: 'number',
          title: '装货体积',
          default: data.loadVolume || 0,
          minimum: 0,
          maximum: 99999,
          ui: {
            unit: '方',
            placeholder: '请输入',
            grid: {
              span: 12
            },
            hideStep: true,
            change: (val: any) => this.changeNumVal()
          } as SFNumberWidgetSchema
        },
        settlementWeight: {
          type: 'number',
          title: '卸货重量',
          default: data.settlementWeight || 0,
          minimum: 0,
          maximum: 99999,
          ui: {
            unit: '吨',
            placeholder: '请输入',
            grid: {
              span: 12
            },
            hideStep: true,
            change: (val: any) => this.changeNumVal()
          } as SFNumberWidgetSchema
        },
        settlementVolume: {
          type: 'number',
          title: '卸货体积',
          default: data.settlementVolume || 0,
          minimum: 0,
          maximum: 99999,
          ui: {
            unit: '方',
            placeholder: '请输入',
            grid: {
              span: 12
            },
            hideStep: true,
            change: (val: any) => this.changeNumVal()
          } as SFNumberWidgetSchema
        },
        changeCause: {
          title: '审核备注',
          type: 'string',
          maxLength: 100,
          default: data.changeCause,
          ui: {
            widget: 'textarea',
            span: 24,
            placeholder: '选填，最多不超过100字',
            autosize: {
              minRows: 3,
              maxRows: 5
            }
          } as SFTextWidgetSchema
        },
      },
      required: ['freightPrice', 'settlementBasis']
    };
  }

  changeNumVal() {
    console.log('444')
    if (this.calculateSub) {
      this.calculateSub.unsubscribe();
    }
    const params =  { billId: this.data.billId, changeCause: this.sf.value.changeCause, dto: {...this.sf.value}  }
    this.calculateSub = this.service
      .request(this.service.$api_calculate_cost, params)
      .subscribe(res => {
        if (res) {
          Object.assign(this.data, {
            totalAmount: res.totalAmount,
            totalFreight: res.totalFreight,
            totalSurcharge: res.totalSurcharge
          });
        }
      });
  }

  save(value: any): void {
    if (!this.sf.valid) {
      this.sf.validator({ emitError: true });
      return;
    }
    const params =  { billId: this.data.billId, changeCause: this.sf.value.changeCause, dto: {...this.sf.value}  }
    this.service.request(this.service.$api_change_bulk,params).subscribe((res: any) => {
      if (res) {
        this.service.msgSrv.success('变更运费成功！');
        this.modal.destroy(true);
      }
    });
  }

  close(): void {
    this.modal.destroy(false);
  }
}
