import { Component, ViewChild } from '@angular/core';
import { Router } from '@angular/router';
import { apiConf } from '@conf/api.conf';
import {
  SFUploadWidgetSchema,
  SFComponent,
  SFSchema,
  SFUISchema,
  SFDateWidgetSchema,
  SFCheckboxWidgetSchema,
  SFTreeSelectWidgetSchema
} from '@delon/form';
import { NzTreeNode } from 'ng-zorro-antd/tree';
import { NzUploadFile } from 'ng-zorro-antd/upload';
import { of, Subscription } from 'rxjs';
import { map } from 'rxjs/operators';

import { PartnerListService } from '../../services/partner-list.service';

const IMAGECONFIG = {
  previewFile: (file: NzUploadFile) => of(file.url),
  action: apiConf.waterFileUpload,
  fileType: 'image/png,image/jpeg,image/jpg,image/gif',
  fileSize: 5120,
  limit: 1,
  limitFileCount: 1,
  resReName: 'data.fullFileWatermarkPath',
  urlReName: 'data.fullFileWatermarkPath',
  widget: 'upload',
  name: 'multipartFile',
  multiple: false,
  listType: 'picture-card'
} as SFUploadWidgetSchema;

const DATECONFIG = {
  grid: { xxl: 13, xl: 18, lg: 24, md: 24 },
  widget: 'date',
  format: 'yyyy-MM-dd',
  placeholder: '请选择'
};

@Component({
  selector: 'app-add-personal-partner',
  templateUrl: './add-personal-partner.component.html',
  styleUrls: ['./add-personal-partner.component.less']
})
export class AddPersonalPartnerComponent {
  @ViewChild('sf', { static: false })
  sf!: SFComponent;
  schema: SFSchema = this.initBasicInfoSF();
  ui: SFUISchema = {
    '*': {
      spanLabelFixed: 180,
      grid: { span: 24 }
    },
    $_basicInfoTitle: {
      spanLabelFixed: 0
    },
    $_legalPersontitle: {
      spanLabelFixed: 0
    },
    $_isLoingDate: {
      spanLabelFixed: 100,
      grid: { xxl: 6, xl: 6, lg: 4, md: 6 }
    }
  };

  getIdentityInfoSub = new Subscription();
  loadingIdentityInfoSub = false;

  constructor(private router: Router, public service: PartnerListService) {}

  submitForm() {
    if (!this.sf.valid) {
      this.sf.validator({ emitError: true });
      this.service.msgSrv.warning('请修改填写错误信息');
      return;
    }
    if (this.sf.value.cityCodesList?.length > 3) {
      this.sf.validator({ emitError: true });
      this.service.msgSrv.warning('所属城市不能超过3个');
      return;
    }
    if (this.sf.value.validEndTime) {
      const validStartTime = new Date(this.sf.value.validStartTime);
      const validEndTime = new Date(this.sf.value.validEndTime);
      if (validStartTime.getTime() > validEndTime.getTime()) {
        this.service.msgSrv.warning('身份证有效截止日期不能小于开始日期');
        return;
      }
    }
    const params = {};
    Object.assign(params, { ...this.sf.value, source: 2 });

    this.service.request(this.service.$api_save_personal_partner, params).subscribe(res => {
      if (res) {
        this.service.msgSrv.success('新增个人合伙人成功');
        this.goBack();
      }
    });
  }

  /*
   * 根据地区code查询地区列表
   */
  getRegionDetailByCode(regionCode: any) {
    return this.service.request(this.service.$api_get_region_by_code, { regionCode });
  }

  // 识别身份证 参数isFront：front-正面、back-背面；type：0-申请人身份证，1-法定代表人身份证
  checkIdCard(imgurl: any, isFront: string) {
    const params = {
      idCardUrl: imgurl,
      side: isFront
    };
    this.service.request(this.service.$api_ocr_recognize_id_card, params).subscribe(res => {
      if (res) {
        // 法定代表人证件照
        if (isFront === 'front') {
          // 正面
          if (res.name) {
            this.sf.setValue('/adminUserInfo/name', res.name);
          }
          if (res.number) {
            this.sf.setValue('/adminUserInfo/certificateType', 0);
            this.sf.setValue('/adminUserInfo/certificateNumber', res.number);
          }
        }
        if (isFront === 'back') {
          // 背面
          if (res.validFrom) {
            this.sf.setValue('/adminUserInfo/validStartTime', res.validFrom);
          }
          if (res.validTo) {
            this.sf.setValue('/adminUserInfo/validEndTime', res.validTo);
            this.sf.setValue('/adminUserInfo/_isLoingDate', false);
          } else {
            this.sf.setValue('/adminUserInfo/_isLoingDate', true);
          }
        }
      }
    });
  }

  goBack() {
    window.history.go(-1);
  }

  private initBasicInfoSF(): SFSchema {
    return {
      properties: {
        _adminTitle: { title: '', type: 'string', ui: { widget: 'custom' } },
        mobile: {
          title: ' 手机号',
          type: 'string',
          minLength: 1,
          format: 'mobile',
          maxLength: 11,
          ui: {
            grid: { xxl: 13, xl: 18, lg: 24, md: 24 },
            placeholder: '请输入手机号',
            errors: { required: '请输入手机号', format: '手机号格式错误' },
            change: (mobile: any) => {
              // 根据手机号获取实名信息
              if (mobile?.length === 11) {
                if (this.loadingIdentityInfoSub) {
                  this.getIdentityInfoSub.unsubscribe();
                }
                this.loadingIdentityInfoSub = true;
                this.getIdentityInfoSub = this.service.request(this.service.$api_get_identityInfo_by_mobile, { mobile }).subscribe(
                  res => {
                    if (res) {
                      this.setInfo(res);
                      this.sf.setValue('/adminUserInfo/id', res.id);
                      this.sf.setValue('/adminUserInfo/userId', res.userId);
                    }
                    this.loadingIdentityInfoSub = false;
                  },
                  _ => {},
                  () => (this.loadingIdentityInfoSub = false)
                );
              }
            }
          }
        },
        // 合伙人信息
        adminUserInfo: {
          type: 'object',
          properties: {
            _adminCertificatePhotoTipsA: {
              title: '证件照',
              type: 'string',
              ui: {
                widget: 'custom'
              },
              default: true
            },
            certificatePhotoFront: { title: '', type: 'string', ui: { hidden: true } },
            id: { title: '', type: 'string', ui: { hidden: true } },
            userId: { title: '', type: 'string', ui: { hidden: true } },
            certificatePhotoBack: { title: '', type: 'string', ui: { hidden: true } },
            certificateType: { title: '', type: 'string', ui: { hidden: true }, default: 0 },
            certificatePhotoFrontWatermark: {
              type: 'string',
              title: '',
              ui: {
                ...IMAGECONFIG,
                descriptionI18n: '图片支持jpg、jpeg、png、gif格式，大小不超过5M',
                change: args => {
                  if (args.type === 'success') {
                    this.sf.setValue('/adminUserInfo/certificatePhotoFront', args.fileList[0].response.data.fullFilePath);
                    this.checkIdCard(args.fileList[0].response.data.fullFilePath, 'front');
                  }
                }
              } as SFUploadWidgetSchema
            },
            _adminCertificatePhotoTipsB: {
              title: '',
              type: 'string',
              ui: {
                widget: 'custom',
                offsetControl: 6
              }
            },
            certificatePhotoBackWatermark: {
              type: 'string',
              title: '',
              ui: {
                ...IMAGECONFIG,
                descriptionI18n: '图片支持jpg、jpeg、png、gif格式，大小不超过5M',
                change: args => {
                  if (args.type === 'success') {
                    this.sf.setValue('/adminUserInfo/certificatePhotoBack', args.fileList[0].response.data.fullFilePath);
                    this.checkIdCard(args.fileList[0].response.data.fullFilePath, 'back');
                  }
                }
              } as SFUploadWidgetSchema
            },
            name: {
              title: '姓名',
              type: 'string',
              maxLength: 8,
              ui: {
                grid: { xxl: 13, xl: 18, lg: 24, md: 24 },
                placeholder: '请输入姓名'
              }
            },
            certificateNumber: {
              title: '身份证号',
              type: 'string',
              format: 'id-card',
              minLength: 1,
              maxLength: 18,
              ui: {
                grid: { xxl: 13, xl: 18, lg: 24, md: 24 },
                placeholder: '请输入身份证号'
              }
            },
            validStartTime: {
              title: '身份证有效开始日期',
              type: 'string',
              ui: {
                ...DATECONFIG,
                grid: { xxl: 13, xl: 18, lg: 24, md: 24 },
                errors: {
                  required: '请选择开始日期'
                }
              } as SFDateWidgetSchema
            },
            validEndTime: {
              title: '身份证有效截止日期',
              type: 'string',
              ui: {
                ...DATECONFIG,
                grid: { xxl: 13, xl: 18, lg: 20, md: 18 },
                errors: {
                  required: '请选择截止日期'
                },
                change: i => {
                  this.sf?.setValue('/adminUserInfo/_isLoingDate', false);
                }
              } as SFDateWidgetSchema
            },
            _isLoingDate: {
              title: '长期',
              type: 'boolean',
              ui: {
                spanLabelFixed: 100,
                grid: { span: 6 },
                class: 'input-back',
                widget: 'checkbox',
                change: i => this.sf?.setValue('/adminUserInfo/validEndTime', null)
              } as SFCheckboxWidgetSchema
            }
          },
          required: ['_adminCertificatePhotoTipsA', 'adminMobile', 'name', 'certificateNumber', 'validStartTime']
        },
        // 所属城市
        _addressTitle: { title: '', type: 'string', ui: { widget: 'custom' } },
        cityCodesList: {
          type: 'string',
          title: '所属城市',
          ui: {
            widget: 'tree-select',
            grid: { xxl: 13, xl: 18, lg: 24, md: 24 },
            placeholder: '请选择城市(最多3个)',
            checkable: true,
            class: 'city-tree-select',
            asyncData: () =>
              this.getRegionDetailByCode('').pipe(
                map((res: any) =>
                  res.map((item: any) => ({ ...item, title: item.name, key: item.regionCode, disabled: true, isDisableCheckbox: true }))
                )
              ),
            expandChange: ({ node }: { node: NzTreeNode }) =>
              this.getRegionDetailByCode(node.key).pipe(
                map((res: any) => res.map((item: any) => ({ ...item, title: item.name, key: item.regionCode, isLeaf: true })))
              )
          } as SFTreeSelectWidgetSchema
        },
        // 渠道销售
        _channelTitle: { title: '', type: 'string', ui: { widget: 'custom' } },
        invitationCode: {
          title: '渠道销售邀请码',
          type: 'string',
          minLength: 1,
          maxLength: 100,
          ui: {
            grid: { xxl: 13, xl: 18, lg: 24, md: 24 },
            placeholder: '请输入渠道销售邀请码',
            errors: {
              required: '请输入渠道销售邀请码'
            }
          }
        }
      },
      required: ['cityCodesList', 'invitationCode']
    };
  }

  private setInfo(info: any) {
    if (info.name) {
      this.sf.setValue('/adminUserInfo/name', info.name);
    }
    if (info.certificatePhotoFront) {
      this.sf.setValue('/adminUserInfo/certificatePhotoFront', info.certificatePhotoFront);
    }
    if (info.certificatePhotoFrontWatermark) {
      console.log(this.sf.getProperty('/adminUserInfo/certificatePhotoFrontWatermark'));

      this.sf.setValue('/adminUserInfo/certificatePhotoFrontWatermark', [
        {
          uid: -1,
          name: '文件',
          status: 'done',
          url: info.certificatePhotoFrontWatermark,
          response: info.certificatePhotoFrontWatermark
        }
      ]);
    }
    if (info.certificatePhotoBack) {
      this.sf.setValue('/adminUserInfo/certificatePhotoBack', info.certificatePhotoBack);
    }
    if (info.certificatePhotoBackWatermark) {
      this.sf.setValue('/adminUserInfo/certificatePhotoBackWatermark', [
        {
          uid: -1,
          name: '文件',
          status: 'done',
          url: info.certificatePhotoBackWatermark,
          response: info.certificatePhotoBackWatermark
        }
      ]);
    }
    if (info.certificateNumber) {
      this.sf.setValue('/adminUserInfo/certificateNumber', info.certificateNumber);
    }
    if (info.validStartTime) {
      this.sf.setValue('/adminUserInfo/validStartTime', info.validStartTime);
    }
    if (info.validEndTime) {
      this.sf.setValue('/adminUserInfo/validEndTime', info.validEndTime);
      this.sf.setValue('/adminUserInfo/_isLoingDate', false);
    } else {
      this.sf.setValue('/adminUserInfo/_isLoingDate', true);
    }
  }
}
