<template>
  <div class="relative"
       v-loading="loading">
    <div class="page">
      <h6 class="l-title"><img src="@/assets/images/info1.png"
             alt=""> 基本信息</h6>
      <div class="page-content">
        <ul class="list">
          <li>
            <label>姓名：</label>
            <el-input placeholder="请输入姓名"
                      type="text"
                      v-model="form.realName" />
          </li>
          <li>
            <label>性别：</label>
            <el-select size="small"
                       v-model="form.sex">
              <el-option v-for="item in sexList"
                         :key="item.value"
                         :label="item.name"
                         :value="item.value"></el-option>
            </el-select>
          </li>
          <li>
            <label>账号：</label>
            <el-input class="m-r-10"
                      type="text"
                      size="small"
                      v-model="form.username"></el-input>
            <!-- <el-button type="text" size="small" @click="showAccount">修改</el-button> -->
          </li>
          <li>
            <label>工号：</label>
            <el-input size="small"
                      v-model="form.jobNumber"
                      clearable></el-input>
          </li>
          <li>
            <label>邮箱：</label>
            <el-input class="m-r-10"
                      size="small"
                      v-model="form.email"></el-input>
            <!-- <el-button v-if="form.email" type="text" size="small" @click="bindEmail">更换</el-button>
            <el-button v-else type="text" size="small" @click="bindEmail">添加</el-button> -->
          </li>
          <li>
            <label>手机号：</label>
            <el-input class="m-r-10"
                      type="text"
                      size="small"
                      maxlength="11"
                      v-model="form.phone"></el-input>
            <!-- <el-button type="text" size="small" @click="bindPhone">{{ form.phone ? '更换' : '绑定' }}</el-button>
            <el-button v-if="form.phone" type="text" size="small" @click="unbind">解绑</el-button> -->
          </li>
          <li>
            <label>密码：</label>
            <el-input class="m-r-10"
                      size="small"
                      value="******"
                      disabled></el-input>
            <el-button type="text"
                       size="small"
                       @click="bindPassword">修改</el-button>
          </li>
        </ul>
      </div>
      <div class="btn-wrap">
        <el-button size="small"
                   @click="$emit('back')">取消</el-button>
        <el-button type="primary"
                   size="small"
                   @click="submit">更新</el-button>
      </div>
    </div>
    <el-dialog :title="form.email ? '更换邮箱' : '绑定邮箱'"
               :visible.sync="emailVisible"
               :close-on-click-modal="false"
               @close="closeEmail"
               width="30%">
      <el-form ref="form"
               :model="form"
               label-width="60px">
        <el-form-item label="邮箱">
          <el-input placeholder="请输入邮箱"
                    v-model="email"></el-input>
        </el-form-item>
        <el-form-item label="验证码">
          <div class="flex-between">
            <el-input v-model="emailCode"
                      placeholder="请输入验证码"
                      maxlength="6"></el-input>
            <el-button style="margin-left: 10px"
                       type="text"
                       @click="sendEmailCode"
                       :disabled="emailDisabled">{{ emailBtnText }}</el-button>
          </div>
        </el-form-item>
      </el-form>
      <span slot="footer"
            class="dialog-footer">
        <el-button @click="emailVisible = false">取 消</el-button>
        <el-button type="primary"
                   @click="emailSubmit">确 定</el-button>
      </span>
    </el-dialog>
    <el-dialog :title="form.phone ? '更换手机号' : '绑定手机号'"
               :visible.sync="phoneVisible"
               :close-on-click-modal="false"
               @close="closePhone"
               width="30%">
      <el-form ref="form"
               :model="form"
               label-width="60px">
        <el-form-item label="手机号">
          <el-input style="width: 404px;"
                    placeholder="请输入手机号"
                    v-model="phone"
                    maxlength="11"></el-input>
        </el-form-item>
        <el-form-item label="验证码">
          <div class="flex-between">
            <el-input v-model="phoneCode"
                      placeholder="请输入验证码"
                      maxlength="6"></el-input>
            <el-button style="margin-left: 10px"
                       type="text"
                       @click="sendPhoneCode"
                       :disabled="phoneDisabled">{{ phoneBtnText }}</el-button>
          </div>
        </el-form-item>
      </el-form>
      <span slot="footer"
            class="dialog-footer">
        <el-button @click="phoneVisible = false">取 消</el-button>
        <el-button type="primary"
                   @click="phoneSubmit">确 定</el-button>
      </span>
    </el-dialog>
    <el-dialog title="更换密码"
               :visible.sync="pwdVisible"
               :close-on-click-modal="false"
               @close="closePassword"
               width="30%">
      <el-form ref="pwdForm"
               :model="form"
               label-width="60px">
        <el-form-item label="原密码">
          <el-input type="password"
                    v-model="pwdForm.password"
                    placeholder="请输入原密码"></el-input>
        </el-form-item>
        <el-form-item label="新密码">
          <el-input type="password"
                    v-model="pwdForm.newPassword"
                    placeholder="请输入新密码"
                    @keyup.enter.native="editPassword"></el-input>
        </el-form-item>
        <el-form-item label="新密码">
          <el-input type="password"
                    v-model="pwdForm.reNewPassword"
                    placeholder="请确认新密码"
                    @keyup.enter.native="editPassword"></el-input>
        </el-form-item>
      </el-form>
      <span slot="footer"
            class="dialog-footer">
        <el-button @click="pwdVisible = false">取 消</el-button>
        <el-button type="primary"
                   @click="editPassword">确 定</el-button>
      </span>
    </el-dialog>
    <el-dialog title="修改账号"
               :visible.sync="accountVisible"
               :close-on-click-modal="false"
               width="30%">
      <el-form label-width="70px">
        <el-form-item label="账号">
          <el-input v-model="editUsername"
                    placeholder="请输入账号"></el-input>
        </el-form-item>
      </el-form>
      <span slot="footer"
            class="dialog-footer">
        <el-button size="small"
                   @click="accountVisible = false">取 消</el-button>
        <el-button size="small"
                   type="primary"
                   @click="confirmAccount">确 定</el-button>
      </span>
    </el-dialog>
  </div>
</template>

<script>
import Setting from '@/setting'
import Util from '@/libs/util'
import { mapState, mapMutations } from 'vuex'
export default {
  data () {
    return {
      loading: false,
      editUsername: '',
      accountVisible: false,
      updateTime: 0,
      token: Util.local.get(Setting.tokenKey),
      form: {
        userName: "",
        name: "",
        jobNumber: "",
        password: "",
        phone: "",
        email: "",
        sex: 1,
      },
      emailVisible: false,
      pwdVisible: false,
      phoneVisible: false,
      showArch: false,
      pwdForm: {
        password: "",
        newPassword: "",
        reNewPassword: ""
      },
      sexList: [
        {
          name: "男",
          value: 1
        },
        {
          name: "女",
          value: 2
        }
      ],
      email: "",
      emailBtnText: "发送验证码",
      emailCode: "",
      emailDisabled: false,
      emailTimer: null,
      phone: "",
      phoneBtnText: "发送验证码",
      phoneCode: "",
      phoneDisabled: false,
      phoneTimer: null,
      emailOpener: "",
      phoneOpener: "",
      originAccount: "",
      accountReapeat: false
    };
  },
  computed: {
    ...mapState("user", [
      "userId", "avatar"
    ])
  },
  watch: {
    // 监听信息是否有更改,有的话页面离开的时候要询问是否要保存
    form: {
      handler () {
        this.updateTime++
        if (this.updateTime > 1) this.$emit('updateStatus', this.updateTime > 1)
      },
      deep: true
    }
  },
  mounted () {
    this.getData()
  },
  methods: {
    ...mapMutations('user', [
      'setUserName'
    ]),
    // 获取用户信息
    getData () {
      this.loading = true
      this.$post(this.api.queryUser, Util.rsa(this.userId)).then(({ data }) => {
        this.form = data
        this.loading = false
      }).catch(err => { })
    },
    // 显示修改账号弹框
    showAccount () {
      this.accountVisible = true
    },
    // 修改账号
    confirmAccount () {
      if (this.editUsername) {
        form.username = this.editUsername
        this.accountVisible = false
        const { form } = this
        this.$post(this.api.updateUser, Util.rsa(form)).then(res => {
          this.setUserName(form.username)
          this.$message.success("提交成功！")
        }).catch(res => { })
      } else {
        Util.errorMsg('请输入账号')
      }
    },
    bindEmail () {
      this.email = this.form.email
      this.emailVisible = true
    },
    bindPhone () {
      this.phone = this.form.phone
      this.phoneVisible = true
    },
    // 解绑手机号
    unbind () {
      this.$confirm('确定要解绑该手机号吗？', '提示', {
        type: 'warning'
      }).then(() => {
        this.$get(this.api.unbindMobilePhone).then(res => {
          this.$message.success('解绑成功')
          this.getData()
        }).catch(res => { })
      }).catch(() => { })
    },
    bindPassword () {
      this.pwdVisible = true
    },
    editPassword () {
      const data = this.pwdForm
      if (!data.password) return Util.warningMsg("请输入原密码")
      if (!data.newPassword) return Util.warningMsg("请输入新密码")
      if (!data.reNewPassword) return Util.warningMsg("请确认新密码")
      if (data.newPassword.length < 6 || data.reNewPassword.length < 6) return Util.warningMsg("请输入6位数以上的密码")
      if (data.newPassword !== data.reNewPassword) return Util.warningMsg("输入的新密码不一致，请重新确认")
      if (data.password === data.newPassword) return Util.warningMsg("原密码跟新密码不能一致")
      this.$put(this.api.pwd, {
        id: this.form.id,
        oldPwd: data.password,
        newPwd: data.newPassword
      }).then(res => {
        Util.successMsg("更换成功")
        this.pwdVisible = false
      }).catch(err => { })
    },
    closePassword () {
      this.pwdForm = {
        password: "",
        newPassword: "",
        reNewPassword: ""
      }
    },
    submit () {
      const { form } = this
      this.$post(this.api.updateUser, Util.rsa({
        id: form.id,
        jobNumber: form.jobNumber,
        phone: form.phone,
        realName: form.realName,
        username: form.username,
        email: form.email,
        sex: form.sex,
      })).then(res => {
        this.$emit('updateStatus', false)
        this.setUserName(form.realName)
        this.$message.success("提交成功！")
      }).catch(res => { })
    },
    emailCountdown () {
      let count = 60;
      if (!this.emailTimer) {
        this.emailDisabled = true;
        this.emailTimer = setInterval(() => {
          console.log("倒计时中");
          if (count > 0) {
            count--;
            this.emailBtnText = `${count}秒后重试`;
          } else {
            this.emailDisabled = false;
            clearInterval(this.emailTimer);
            this.emailTimer = null;
            this.emailBtnText = `发送验证码`;
          }
        }, 1000);
      }
    },
    phoneCountdown () {
      let count = 60;
      if (!this.phoneTimer) {
        this.phoneDisabled = true;
        this.phoneTimer = setInterval(() => {
          console.log("倒计时中");
          if (count > 0) {
            count--;
            this.phoneBtnText = `${count}秒后重试`;
          } else {
            this.phoneDisabled = false;
            clearInterval(this.phoneTimer);
            this.phoneTimer = null;
            this.phoneBtnText = `发送验证码`;
          }
        }, 1000);
      }
    },
    closeEmail () {
      if (!this.emailDisabled) {
        this.emailCode = "";
      }
    },
    sendEmailCode () {
      if (!this.email) return Util.warningMsg("请输入邮箱")
      if (!/^([a-zA-Z]|[0-9])(\w|\-)+@[a-zA-Z0-9]+\.([a-zA-Z]{2,4})$/.test(this.email)) return Util.warningMsg("请输入正确的邮箱")
      this.$post(this.api.sendPhoneOrEmailCode, {
        email: this.email,
        types: 1
      }).then(res => {
        if (res.message.opener) {
          this.emailCountdown();
          this.emailOpener = res.message.opener;
        } else {
          Util.errorMsg(res.message);
        }
      }).catch(res => { })
    },
    emailSubmit () {
      if (!this.email) return Util.warningMsg("请输入邮箱")
      if (!/^([a-zA-Z]|[0-9])(\w|\-)+@[a-zA-Z0-9]+\.([a-zA-Z]{2,4})$/.test(this.email)) return Util.warningMsg("请输入正确的邮箱")
      if (!this.emailCode) return Util.warningMsg("请输入验证码")
      this.$put(this.api.bindPhoneOrEmail, {
        userId: this.userId,
        email: this.email,
        types: 1,
        code: this.emailCode,
        opener: this.emailOpener
      }).then(res => {
        Util.successMsg("绑定成功")
        this.form.email = this.email
        this.emailVisible = false
      }).catch(res => { })
    },
    closePhone () {
      if (!this.emailDisabled) {
        this.emailCode = "";
      }
    },
    sendPhoneCode () {
      if (!this.phone) return Util.warningMsg("请输入手机号");
      if (!/^1[3456789]\d{9}$/.test(this.phone)) return Util.warningMsg("请输入正确的手机号");
      let data = {
        userId: this.userId,
        phone: this.phone,
        types: 2
      };
      this.$post(this.api.sendPhoneOrEmailCode, data).then(res => {
        if (res.message.opener) {
          this.phoneCountdown();
          this.phoneOpener = res.message.opener;
        } else {
          Util.errorMsg(res.message);
        }
      }).catch(res => {
      });
    },
    phoneSubmit () {
      if (!this.phone) return Util.warningMsg("请输入手机号");
      if (!/^1[3456789]\d{9}$/.test(this.phone)) return Util.warningMsg("请输入正确的手机号");
      if (!this.phoneCode) return Util.warningMsg("请输入验证码");
      let data = {
        userId: this.userId,
        phone: this.phone,
        types: 2,
        code: this.phoneCode,
        opener: this.phoneOpener
      };
      this.$post(this.api.bindPhoneOrEmail, data).then(res => {
        Util.successMsg("绑定成功");
        this.form.phone = this.phone;
        this.phoneVisible = false;
      }).catch(res => {
      });
    }
  }
};
</script>

<style lang="scss" scoped>
.page {
    min-height: 100%;
}
.l-title {
    display: flex;
    align-items: center;
    margin-bottom: 12px;
    font-size: 14px;
    color: #333;
    img {
        margin-right: 5px;
    }
}
.list {
    .line {
        display: flex;
        margin-bottom: 24px;
    }
    .el-input,
    .el-select {
        width: 220px;
        .el-input__inner {
            border-color: #cacfdb;
        }
    }
    li {
        display: flex;
        align-items: center;
        margin-bottom: 20px;
        & > label {
            width: 100px;
            margin-right: 5px;
            text-align: right;
            font-size: 14px;
            color: #4c4c4c;
            white-space: nowrap;
        }
        .el-select .el-input.is-disabled .el-input__inner {
            border-color: #ddd;
        }
        .val {
            margin-right: 15px;
            color: #606266;
            font-size: 14px;
        }
    }
}
.btn-wrap {
    position: absolute;
    bottom: 0;
    left: 0;
    width: 100%;
    padding: 12px 0;
    text-align: center;
    background-color: #fff;
    .el-button {
        width: 80px;
    }
}
</style>