<template>
  <div class="container">
    <div class="policy-tip-wrap">
      <div class="policy-tip">您所填写的数据，仅用于投保，平台将严格保密</div>
    </div>
    <cr-form
      ref="policyForm"
      class="policy-form"
      scroll-to-error
      @submit="onFormSubmit"
      @failed="onFormFailed"
    >
      <cr-cell-group title="投保人信息">
        <cr-field
          v-model="formData.holderUserInfo.name"
          name="holderUserInfo_name"
          label="姓名"
          placeholder="请输入投保人姓名"
          :readonly="selfInfoReadonly"
          :rules="[{ required: true, message: '请输入投保人姓名' }]"
          @click.native="inputClick"
        />
        <cr-field
          v-model="formData.holderUserInfo.idNo"
          name="holderUserInfo_idNo"
          label="身份证号"
          placeholder="请填写投保人身份证号"
          :readonly="selfInfoReadonly"
          :rules="[{ required: true, message: '请填写投保人身份证号' }]"
          @click.native="inputClick"
        />
        <cr-field
          v-model="formData.holderUserInfo.phoneNo"
          name="holderUserInfo_phoneNo"
          type="tel"
          label="手机号"
          placeholder="请填写投保人手机号"
          :readonly="selfInfoReadonly"
          :rules="[{ required: true, message: '请填写投保人手机号' }]"
          @click.native="inputClick"
        />
        <cr-field
          v-model="formData.holderUserInfo.email"
          name="holderUserInfo_email"
          type="email"
          label="电子邮箱"
          placeholder="用户接收电子保单"
          :rules="[{ required: true, message: '请填写电子邮箱' }]"
        />
        <cr-field
          v-model="formData.holderUserInfo.annualIncome"
          name="holderUserInfo_annualIncome"
          label="年收入"
          type="digit"
          placeholder="请输入投保人年收入"
          :rules="[{ required: true, message: '请输入投保人年收入' }]"
        />
        <cr-field
          v-model="formData.holderUserInfo.addressCode"
          name="holderUserInfo_addressCode"
          label="居住省市"
          :rules="[{ required: true, message: '请选择投保人居住省市' }]"
        >
          <template #input>
            <popup-area-picker
              v-model="formData.holderUserInfo.addressCode"
              placeholder="请选择投保人居住省市"
            />
          </template>
        </cr-field>
        <cr-field
          v-model="formData.holderUserInfo.addressDetail"
          name="holderUserInfo_addressDetail"
          label="详细地址"
          placeholder="请输入居住详细地址"
          :rules="[{ required: true, message: '请输入居住详细地址' }]"
        />
        <cr-field
          v-model="formData.holderUserInfo.occupation"
          name="holderUserInfo_occupation"
          label="职业"
          :rules="[{ required: true, message: '请选择投保人职业' }]"
        >
          <template #input>
            <popup-cascade
              v-model="formData.holderUserInfo.occupation"
              placeholder="请选择投保人职业"
            />
          </template>
        </cr-field>
        <cr-field
          v-model="formData.holderUserInfo.longTerm"
          name="holderUserInfo_longTerm"
          label="身份证有效期"
          :rules="[{ required: true, message: '请选择身份证有效期' }]"
        >
          <template #input>
            <cr-radio-btn
              v-model="formData.holderUserInfo.longTerm"
              :radio-data="idCardInvaildOptions"
            />
          </template>
        </cr-field>
        <cr-field
          v-if="formData.holderUserInfo.longTerm === '1'"
          v-model="formData.holderUserInfo.validEnd"
          name="holderUserInfo_validEnd"
          label="有效期至"
          :rules="[{ required: true, message: '请选择您的证件有效止期' }]"
        >
          <template #input>
            <popup-date-picker
              v-model="formData.holderUserInfo.validEnd"
              placeholder="请选择您的证件有效止期"
            />
          </template>
        </cr-field>
      </cr-cell-group>
      <cr-cell-group title="被保人信息">
        <cr-field
          v-model="formData.insuredUserInfo.relation"
          name="insuredUserInfo_relation"
          label="为谁投保"
        >
          <template #input>
            <cr-radio-btn
              v-model="formData.insuredUserInfo.relation"
              @input="relationChange"
              :radio-data="insuredOptions"
            />
          </template>
        </cr-field>
        <cr-field
          v-model="formData.insuredUserInfo.socialSecurity"
          name="insuredUserInfo_socialSecurity"
          label="有无社保"
          :rules="[{ required: true, message: '请选择社保状态' }]"
        >
          <template #input>
            <cr-radio-btn
              v-model="formData.insuredUserInfo.socialSecurity"
              :radio-data="socialSecOptions"
            />
          </template>
        </cr-field>
        <cr-field
          v-model="formData.insuredUserInfo.height"
          name="insuredUserInfo_height"
          label="身高"
          type="number"
          placeholder="请填写被保人身高"
          :rules="[{ required: true, message: '请填写被保人身高' }]"
        >
          <div class="form-unit" slot="button">厘米</div>
        </cr-field>
        <cr-field
          v-model="formData.insuredUserInfo.weight"
          name="insuredUserInfo_weight"
          label="体重"
          type="number"
          placeholder="请填写被保人体重"
          :rules="[{ required: true, message: '请填写被保人体重' }]"
        >
          <div class="form-unit" slot="button">公斤</div>
        </cr-field>
        <template v-if="formData.insuredUserInfo.relation !== '1'">
          <cr-field
            v-model="formData.insuredUserInfo.name"
            name="insuredUserInfo_name"
            label="姓名"
            placeholder="请输入投保人姓名"
            :readonly="infoReadonly"
            :rules="[{ required: true, message: '请输入投保人姓名' }]"
          />
          <cr-field
            v-model="formData.insuredUserInfo.idNo"
            name="insuredUserInfo_idNo"
            label="身份证号"
            placeholder="请填写投保人身份证号"
            :readonly="infoReadonly"
            :rules="[{ required: true, message: '请填写投保人身份证号' }]"
          />
          <cr-field
            v-model="formData.insuredUserInfo.phoneNo"
            name="insuredUserInfo_phoneNo"
            label="手机号"
            type="tel"
            placeholder="请填写投保人手机号"
            :rules="[{ required: true, message: '请填写投保人手机号' }]"
          />
          <cr-field
            v-model="formData.insuredUserInfo.annualIncome"
            name="insuredUserInfo_annualIncome"
            label="年收入"
            type="digit"
            placeholder="请输入投保人年收入"
            :rules="[{ required: true, message: '请输入投保人年收入' }]"
          />
          <cr-field
            v-model="formData.insuredUserInfo.addressCode"
            name="insuredUserInfo_addressCode"
            label="居住省市"
            :rules="[{ required: true, message: '请选择投保人居住省市' }]"
          >
            <template #input>
              <popup-area-picker
                v-model="formData.insuredUserInfo.addressCode"
                placeholder="请选择投保人居住省市"
              />
            </template>
          </cr-field>
          <cr-field
            v-model="formData.insuredUserInfo.addressDetail"
            name="insuredUserInfo_weigaddressDetailht"
            label="详细地址"
            placeholder="请输入居住详细地址"
            :rules="[{ required: true, message: '请输入居住详细地址' }]"
          />
          <cr-field
            v-model="formData.insuredUserInfo.occupation"
            name="insuredUserInfo_occupation"
            label="职业"
            :rules="[{ required: true, message: '请选择被保人职业' }]"
          >
            <template #input>
              <popup-cascade
                v-model="formData.insuredUserInfo.occupation"
                placeholder="请选择被保人职业"
                :is-lite="true"
              />
            </template>
          </cr-field>
          <cr-field
            v-model="formData.insuredUserInfo.longTerm"
            name="insuredUserInfo_longTerm"
            label="身份证有效期"
            :rules="[{ required: true, message: '请选择身份证有效期' }]"
          >
            <template #input>
              <cr-radio-btn
                v-model="formData.insuredUserInfo.longTerm"
                :radio-data="idCardInvaildOptions"
              />
            </template>
          </cr-field>
          <cr-field
            v-if="formData.insuredUserInfo.longTerm === '1'"
            v-model="formData.insuredUserInfo.validEnd"
            name="insuredUserInfo_validEnd"
            label="有效期至"
            :rules="[{ required: true, message: '请选择您的证件有效止期' }]"
          >
            <template #input>
              <popup-date-picker
                v-model="formData.insuredUserInfo.validEnd"
                placeholder="请选择您的证件有效止期"
              />
            </template>
          </cr-field>
        </template>
      </cr-cell-group>
      <cr-cell-group title="保障方案">
        <cr-field
          v-model="formData.productItem.amountInsured"
          name="productItem_insuredAmount"
          label="投保限额"
          :rules="[{ required: true, message: '请选择投保限额' }]"
        >
          <template #input>
            <stepper v-model="formData.productItem.amountInsured" :option="insuredAmountOptions" />
          </template>
        </cr-field>
        <cr-field
          v-model="formData.productItem.policyPeriod"
          name="productItem_policyPeriod"
          label="保险期限"
          :rules="[{ required: true, message: '请选择保险期限' }]"
        >
          <template #input>
            <cr-radio-btn v-model="formData.productItem.policyPeriod" :radio-data="termOptions" />
          </template>
        </cr-field>
        <cr-field
          v-model="formData.productItem.payType"
          name="payPeriod"
          label="交费方式"
          :rules="[{ required: true, message: '请选择交费方式' }]"
        >
          <template #input>
            <cr-radio-btn v-model="formData.productItem.payType" :radio-data="paywayOptions" />
          </template>
        </cr-field>
        <cr-field
          v-model="formData.productItem.payPeriod"
          name="productItem_paymentPeriod"
          label="交费期间"
          :rules="[{ required: true, message: '请选择交费期间' }]"
        >
          <template #input>
            <cr-radio-btn v-model="formData.productItem.payPeriod" :radio-data="benefitOptions" />
          </template>
        </cr-field>
        <cr-field :value="formData.effectiveDate" name="effectiveDate" readonly label="生效日期" />
        <cr-field value="法定" name="beneficiaryUser" disabled label="受益人" />
      </cr-cell-group>
      <cr-cell-group title="续费银行账户">
        <cr-field
          v-model="formData.holderUserInfo.bankCardName"
          name="insuredUserInfo_bankCardName"
          label="持卡人"
          placeholder="请输入持卡人姓名"
          :rules="[{ required: true, message: '请输入持卡人姓名' }]"
        />
        <cr-field
          v-model="formData.holderUserInfo.bankCardCode"
          name="insuredUserInfo_bankCardCode"
          label="开户行"
          :rules="[{ required: true, message: '请选择开户行' }]"
        >
          <template #input>
            <popup-picker
              v-model="formData.holderUserInfo.bankCardCode"
              :picker-data="bankInfo"
              placeholder="请选择开户行"
            />
          </template>
        </cr-field>
        <cr-field
          v-model="formData.holderUserInfo.bankCardNo"
          name="insuredUserInfo_bankCardNo"
          label="银行卡号"
          type="digit"
          placeholder="请输入银行卡号"
          :rules="[{ required: true, message: '请输入银行卡号' }]"
        />
      </cr-cell-group>
      <good-action @leftClick="goInsureState = true" :content="goodActionInfo" />
    </cr-form>
    <go-insure-dialog
      v-model="goInsureState"
      :title="headerInfo.title"
      :pay-data="goodBuyModalInfo"
      @confirm="nextStep"
    >
      <div class="pay-protocol">
        <div class="pay-protocol-tip"><span>投保前请阅读</span><span>*不犹豫期免费退保</span></div>
        <div class="pay-protocol-link">
          <a href="javascript:;" @click="openIframePupop(0)">保险条款</a>
          <i></i>
          <a href="javascript:;" @click="openIframePupop(2)">投保须知与声明</a>
          <i></i>
          <a href="javascript:;" @click="openIframePupop(3)">服务协议</a>
          <i></i>
          <a href="javascript:;" @click="openIframePupop(1)">转账授权书</a>
        </div>
        <div class="pay-protocol-link pay-protocol-link_wrap">
          <a href="javascript:;" @click="openIframePupop(8)">人身保险投保提示书</a>
          <a href="javascript:;" @click="openIframePupop(3)">税收居民身份证明</a>
          <a href="javascript:;" @click="openIframePupop(3)">风控查询授权书</a>
        </div>
      </div>
    </go-insure-dialog>
    <popup-with-iframe
      v-model="popupShow"
      :title="pupopData.title"
      :content="pupopData.content"
      :url="pupopData.url"
    >
    </popup-with-iframe>
  </div>
</template>

<script>
import GoodAction from "@/components/GoodAction";
import CrRadioBtn from "@/components/CrRadioBtn";
import PopupAreaPicker from "@/components/PopupAreaPicker";
import PopupPicker from "@/components/PopupPicker";
import PopupDatePicker from "@/components/PopupDatePicker";
import PopupWithIframe from "@/components/PopupWithIframe";
import PopupCascade from "@/components/PopupCascade";
import Stepper from "@/components/Stepper";
import GoInsureDialog from "@/views/Goods/Detail/modules/GoInsureDialog";
import detailPayMixin from "@/views/Goods/Detail/modules/detailPay.mixin";
import autoSaveForm from "@/mixins/autoSaveForm.mixin";

import localStorage from "@/service/localStorage";
import { mapState, mapActions } from "vuex";
import Detail from "@/api/detail.huagui.shouxian";
import { list, trail } from "@/api/product";
import { getFamilyList } from "@/api/user";
import { parseTime } from "@/service/utils";
import { isIdNo } from "@/service/validation";

const AUTO_SAVE_KEY = "PolicyFormData";
const AUTO_SAVE_TARGET = "formData";
const {
  headerInfo,
  popupArray,
  paywayOptions,
  insuredAmountOptions,
  termOptions,
  benefitOptions,
  insuredOptions,
  idCardInvaildOptions,
  socialSecOptions,
  bankInfo
} = Detail;
export default {
  name: "AddPolicy",
  mixins: [detailPayMixin, autoSaveForm],
  components: {
    GoodAction,
    CrRadioBtn,
    GoInsureDialog,
    PopupAreaPicker,
    PopupDatePicker,
    PopupWithIframe,
    PopupPicker,
    PopupCascade,
    Stepper
  },
  data() {
    return {
      popupArray,
      headerInfo,
      calTimer: null,
      goInsureState: false,
      popupShow: false,
      currentPupopIndex: null,
      goodActionInfo: {},
      goodBuyModalInfo: [],
      mongoToken: localStorage.get("mongoToken"),
      policyFormData: JSON.parse(sessionStorage.getItem("policyFormData") || "{}"),
      formData: {
        insuredUserInfo: {
          relation: "",
          longTerm: "1"
        },
        holderUserInfo: {
          longTerm: "1"
        },
        productItem: {
          amountInsured: "500000"
        },
        payPeriod: "1"
      },
      subFromData: {},
      familyList: [],
      formMaskData: {},
      idCardInvaildOptions,
      socialSecOptions,
      insuredOptions,
      termOptions,
      paywayOptions,
      benefitOptions,
      insuredAmountOptions,
      bankInfo,
      selfInfoReadonly: false,
      infoReadonly: false
    };
  },
  watch: {
    popupShow(val) {
      if (!val && this.currentPupopIndex === 6) this.currentPupopIndex = null;
    },
    userInfo: {
      immediate: true,
      deep: true,
      handler(val) {
        this.formData.holderUserInfo.phoneNo =
          val.phoneNoMask && val.phoneNoMask !== "点击登录" ? val.phoneNoMask : "";
      }
    },
    headerInfo: {
      deep: true,
      handler(val) {
        const { price } = val;
        this.goodActionInfo = {
          title: price
        };
        this.goodBuyModalInfo = [{ title: `${price[2]}保费`, value: `${price[0]}${price[1]}` }];
      }
    },
    formDataCpu: {
      deep: true,
      handler(val, oldVal) {
        this.autoSaveHandler(AUTO_SAVE_TARGET, AUTO_SAVE_KEY);
        if (this.calTimer) {
          clearTimeout(this.calTimer);
        }
        const { relation, idNo } = val.insuredUserInfo;
        const { idNo: oldIdNo } = oldVal.insuredUserInfo;
        if (relation === "1") {
          const { idNo: holderIdNo } = val.holderUserInfo;
          const { idNo: oldHolderIdNo } = oldVal.holderUserInfo;
          if (!isIdNo(holderIdNo) || holderIdNo === oldHolderIdNo) {
            return;
          }
        } else {
          if (!isIdNo(idNo) || idNo === oldIdNo) {
            return;
          }
        }
        this.calTimer = setTimeout(() => {
          this.calFee();
        }, 1000);
      }
    },
    showAuthXyqb: {
      immediate: true,
      handler(val) {
        if (val === 4) {
          const xyqbUserInfo = localStorage.get("xyqbUserInfo");
          this.formData.holderUserInfo.name = xyqbUserInfo.nameMask;
          this.formData.holderUserInfo.idNo = xyqbUserInfo.idNoMask;
          this.formData.holderUserInfo.phoneNo = xyqbUserInfo.phoneNoMask;
          this.selfInfoReadonly = true;
          this.$forceUpdate();
        }
      }
    }
  },
  computed: {
    ...mapState(["showAuthXyqb"]),
    ...mapState("user", ["userInfo"]),
    pupopData() {
      const { popupArray, currentPupopIndex } = this;
      return popupArray[currentPupopIndex] || {};
    },
    socialSecurityReadonly() {
      const { relation } = this.formData.insuredUserInfo;
      const { selfInfoReadonly, infoReadonly } = this;
      return (relation === "1" && selfInfoReadonly) || (relation !== "1" && infoReadonly);
    },
    formDataCpu() {
      return JSON.parse(JSON.stringify(this.formData));
    }
  },
  mounted() {
    this.getParamFromSession();
    this.getDetail();
    this.getFamilyList();
  },
  methods: {
    ...mapActions(["setAuthXyqb"]),
    ...mapActions("user", ["setUserInfo"]),
    inputClick() {
      if (this.showAuthXyqb === 1) {
        this.setAuthXyqb(2);
      }
    },
    onFormSubmit() {
      this.goInsureState = true;
    },
    onFormFailed(errorInfo) {
      const { errors } = errorInfo;
      this.$notify({ type: "warning", message: errors[0].message });
    },
    nextStep() {
      this.subFromData = JSON.parse(JSON.stringify(this.formData));
      const { socialSecurity, longTerm, relation } = this.subFromData.insuredUserInfo;
      this.subFromData.insuredUserInfo.socialSecurity = socialSecurity === "1" ? true : false;
      this.subFromData.insuredUserInfo.longTerm = longTerm === "2" ? true : false;
      this.subFromData.holderUserInfo.longTerm = longTerm === "2" ? true : false;
      if (relation === "1") {
        this.subFromData.holderUserInfo = {
          ...this.subFromData.holderUserInfo,
          ...this.subFromData.insuredUserInfo
        };
        delete this.subFromData.insuredUserInfo;
      }
      this.generateOrder();
    },
    relationChange(relation = this.formData.insuredUserInfo.relation) {
      this.formData.insuredUserInfo = {
        relation,
        longTerm: "1"
      };
      this.familyList.forEach(item => {
        const { relation, nameMask: name, idNoMask: idNo, userInfoSecId } = item;
        if (+relation === 1) {
          this.formData.holderUserInfo = {
            ...this.formData.holderUserInfo,
            ...{ name, idNo, userInfoSecId }
          };
          this.selfInfoReadonly = true;
        }
      });
      const userArray = this.familyList.filter(
        item => item.relation === +relation && item.relation !== 1
      );
      let [name, idNo, userInfoSecId, socialSecurity] = [undefined, undefined, undefined, ""];
      if (userArray.length) {
        let { nameMask, idNoMask, userInfoSecId: id, socialSecurity: ss } = userArray[0];
        [name, idNo, userInfoSecId, socialSecurity] = [nameMask, idNoMask, id, ss];
        this.infoReadonly = true;
      } else {
        if (relation === "1") {
          userInfoSecId = this.formData.holderUserInfo.userInfoSecId;
        }
        this.infoReadonly = false;
      }
      this.formData.insuredUserInfo = {
        ...this.formData.insuredUserInfo,
        ...{
          name,
          idNo,
          userInfoSecId,
          socialSecurity:
            typeof socialSecurity === undefined || socialSecurity === ""
              ? ""
              : socialSecurity
              ? "1"
              : "0"
        }
      };
      this.calFee();
      this.$forceUpdate();
    },
    openIframePupop(index) {
      this.currentPupopIndex = index;
      this.popupShow = true;
    },
    getParamFromSession() {
      const { amountInsured, policyPeriod, payPeriod, payType, productNo } = this.policyFormData;
      this.formData.productNo = productNo;
      if (amountInsured && policyPeriod && payPeriod && payType) {
        this.formData.productItem = {
          ...this.formData.productItem,
          ...{ amountInsured, policyPeriod, payPeriod, payType }
        };
      }
      const nextDate = Date.parse(new Date()) + 86400000;
      this.formData.effectiveDate = parseTime(nextDate, "{y}-{m}-{d} 00:00:00");
      this.$forceUpdate();
    },
    async getDetail() {
      const res = await list();
      if (res) {
        res.forEach(item => {
          if (item.productNo === this.formData.productNo) {
            this.headerInfo.price[0] = item.downPayPrice;
          }
        });
      }
    },
    async getFamilyList() {
      if (!this.mongoToken) return;
      this.setUserInfo();
      const res = await getFamilyList();
      if (res) {
        this.familyList = res;
        if (this.hasAutoSaveData(AUTO_SAVE_KEY)) {
          this.getSaveInfoHandler(AUTO_SAVE_KEY, AUTO_SAVE_TARGET);
        } else {
          const queryId = this.$route.query.userInfoSecId;
          let relation = this.formData.insuredUserInfo.relation;
          if (queryId) {
            relation = this.familyList.filter(item => item.userInfoSecId === queryId)[0].relation;
          }
          (this.showAuthXyqb || this.mongoToken) && this.relationChange(relation);
        }
      }
    },
    async calFee() {
      let { price } = this.headerInfo;
      const { amountInsured, policyPeriod, payPeriod, payType } = this.formData.productItem;
      let idNo = "";
      let userInfoSecId = undefined;
      const { socialSecurity } = this.formData.insuredUserInfo;
      if (this.formData.insuredUserInfo.relation !== "1") {
        userInfoSecId = this.formData.insuredUserInfo.userInfoSecId;
        idNo = this.formData.insuredUserInfo.idNo;
      } else {
        userInfoSecId = this.formData.holderUserInfo.userInfoSecId;
        idNo = this.formData.holderUserInfo.idNo;
      }
      if (!amountInsured || !policyPeriod || !payPeriod || !payType || !idNo) return;
      const _param = {
        productNo: this.formData.productNo,
        productUserInfo: {
          insuredUserInfo: {
            idNo,
            userInfoSecId,
            socialSecurity: socialSecurity === "1" ? true : false
          },
          productItem: {
            amountInsured,
            policyPeriod,
            payPeriod,
            payType
          }
        }
      };
      const res = await trail(_param);
      if (res) {
        price[0] = res.downPayPrice;
        this.goodActionInfo = {
          title: price
        };
        this.goodBuyModalInfo = [{ title: `保费`, value: `${price[0]}${price[1]}` }];
      }
    }
  }
};
</script>
<style lang="less" src="./index.less" scoped></style>
