let Parse = getApp().Parse;
let company = getApp().globalData.company
const request = require("../../utils/request");
const qiniuUploader = require("../../utils/qiniuUploader");
//获取应用实例
const app = getApp()
const real = require('../../utils/real')
var timer
/**
 * @class NovaAppAuth
 * @memberof module:components
 * @tutorial userauth
 * @desc 通用登录组件
 * # 登录组件相关数据表
 * - _User
 */
Page({
  data: {
    phoneModal: false, //短信验证码登录弹窗
    logo: "https://file-cloud.fmode.cn/MldI5PBNt7/20210928/g0k1jb034826.png",
    name: "未来商城",
    desc: "江西脑控科技有限公司是国内领先的IT技术企业。专注于互联网+服务,面向政府提供区块链、大数据、物联网、人工智能解决方案",
    wxModel: false,
    avatarUrl: '',
    avatar: '',
    nickname: '',
    check: false,
    mobile: '', //手机号
    verilyCode: '', //验证码
    s: 0, //获取验证码倒计时 秒/s
    countDown: false
  },
  onLoad: async function (options) {
    let Company = new Parse.Query('Company')
    Company.equalTo("objectId", company)
    let currentCompany = await Company.first()
    if (currentCompany && currentCompany.id) {
      this.setData({
        logo: currentCompany.get('logo'),
        name: currentCompany.get('name'),
        desc: currentCompany.get('desc')
      })
    }
    this.getUptoken()
    this.getAgreement() //用户协议
  },
  async getUptoken() {
    let res = await Parse.Cloud.run('qiniu_uptoken', {
      company: company
    })
    this.setData({
      uptokenURL: res.uptoken,
      domain: res.domain,
      uploadURL: res.zoneUrl
    })
  },
  async getAgreement() {
    let query = new Parse.Query('ContractAgreement')
    query.equalTo('type', 'wxapp')
    query.equalTo('company', company)
    query.select('title', 'content')
    let res = await query.first()
    if (res?.id) {
      this.setData({
        agreement: res.toJSON()
      })
    }
  },
  /* 是否同意授权协议 */
  getAgreementAuth() {
    if (!this.data.check && this.data.agreement) {
      wx.showModal({
        title: '提示',
        content: `请您仔细阅读并充分理解相关条款,点击同意即代表已阅读并同意《${this.data.agreement.title || '用户隐私协议'}》`,
        showCancel: true,
        cancelText: '取消',
        cancelColor: '#000000',
        confirmText: '同意',
        confirmColor: '#3CC51F',
        success: (result) => {
          if (result.confirm) {
            this.setData({
              check: true,
            })
            // this.getUserProfile()
          }
        },
        fail: () => { },
        complete: () => { }
      });
      return
    }
    // this.getUserProfile()
    return true
  },
  /* 判断是否绑定手机号 */
  async getUserProfile() {
    if (!Parse.User.current()?.id) {
      await getApp().checkAuth(true)
    }
    let currentUser = Parse.User.current()
    /* 如果手机号存在,已注册过判断是否上传过头像昵称信息 */
    if (currentUser?.get('mobile')) {
      wx.setStorageSync("userLogin", currentUser.id);
      if (currentUser.get('nickname') == '微信用户' || currentUser.get('nickname') == '' || !currentUser.get('nickname')) {
        this.setData({
          wxModel: true
        })
        return
      }
      this.backLoad()
      return
    }
    return true
  },
  /* 短信验证码登录弹窗 */
  async showDialogBtn() {
    let auth = this.getAgreementAuth()
    if (!auth) return
    let userProfile = await this.getUserProfile()
    if (!userProfile) return
    this.setData({
      phoneModal: true
    })
  },
  async getPhoneNumber(e) {
    let auth = this.getAgreementAuth()
    if (!auth) return
    let userProfile = await this.getUserProfile()
    if (!userProfile) return
    let {
      code
    } = e.detail
    console.log(code);
    let phoneNumber = await request.getPhone(code)
    if(phoneNumber) this.authMobileUser(phoneNumber)
  },

  //合并User与绑定手机号逻辑
  async authMobileUser(mobile) {
    let currentUser = Parse.User.current()
    let queryMobUser = new Parse.Query('_User')
    queryMobUser.equalTo('mobile', mobile)
    queryMobUser.equalTo('company', company)
    queryMobUser.notEqualTo('type', 'admin')
    queryMobUser.notEqualTo('isDeleted', true)
    // queryMobUser.exists(`wxapp.${getApp().globalData.appid}`)
    let resMobUser = await queryMobUser.first()
    if (resMobUser?.id) {
      //请求User合并API,获取token重新登录,再更新昵称头像信息等
      let token = await this.getUpdateUserToken(currentUser.id, resMobUser.id)
      console.log(token);
      if (token) {
        Parse.User.become(token).then(async user => {
          // let user = Parse.User.current();
          wx.setStorageSync("userLogin", user.id);
          if (!user.get('avatar') || user.get('nickname') == '微信用户' || !user.get('nickname')) {
            this.setData({
              phoneModal: false,
              wxModel: true
            })
            return
          }
          this.backLoad()
          return
        })
          .catch(err => {
            console.log('登录失败:', err);
            wx.setStorageSync("sessionToken", null);
            wx.showModal({
              title: '提示',
              content: '登录信息过期,请退出重新进入小程序',
              showCancel: false,
              cancelText: '取消',
              cancelColor: '#000000',
              confirmText: '确定',
              confirmColor: '#3CC51F',
              success: (result) => {
                if (result.confirm) {
                  wx.exitMiniProgram()
                }
              },
            });
            return
          })
        return
      }
      return
    }
    currentUser.set('mobile', mobile)
    await currentUser.save()
    if (!currentUser.get('avatar') || currentUser.get('nickname') == '微信用户' || !currentUser.get('nickname')) {
      this.setData({
        phoneModal: false,
        wxModel: true
      })
      return
    }
    this.backLoad()
    return
  },
  async getUpdateUserToken(oldUser, newUserId) {
    return new Promise((resolve, reject) => {
      wx.login({
        success: function (res) {
          let parms = {
            oldUserId: oldUser,
            newUserId: newUserId,
            appId: getApp().globalData.appid,
            code: res.code,
            companyId: company,
            appType: getApp().globalData.appType || ''
          }
          if (res.code) {
            let url = 'https://server.fmode.cn/api/wxapp/combine/user'
            wx.request({
              url: url,
              data: parms,
              header: { 'content-type': 'application/json' },
              method: 'POST',
              async success(res) {
                console.log(res);
                let data = res.data
                if (data.code == 200) {
                  wx.setStorageSync("sessionToken", data.data.token);
                  resolve(data.data.token)
                } else {
                  console.log(data?.mess);
                  wx.showModal({
                    title: '提示',
                    content: data?.mess,
                    showCancel: false,
                    cancelText: '取消',
                    cancelColor: '#000000',
                    confirmText: '确定',
                    confirmColor: '#3CC51F',
                    success: (result) => {
                      if (result.confirm) {
                      }
                    },
                    fail: () => { },
                    complete: () => { }
                  });
                  resolve()
                }
              },
            });
          }
        },
        fail: function (err) {
          wx.showModal({
            title: '提示',
            content: '登录超时,请稍后重试',
            showCancel: false,
            cancelText: '取消',
            cancelColor: '#000000',
            confirmText: '确定',
            confirmColor: '#3CC51F',
            success: (result) => {
              if (result.confirm) {
              }
            },
            fail: () => { },
            complete: () => { }
          });
          console.warn('小程序wx.login失败');
          resolve()
        }
      });
    })
  },

  //获取验证码
  async getPhoneCode() {
    let { mobile, s, countDown } = this.data
    if (!real.isPoneAvailable(mobile)) {
      wx.showToast({
        title: '手机号格式有误',
        icon: 'error',
        duration: 1500,
        mask: false,
      });
      return
    }
    if(countDown || s > 0) return
    this.setData({
      countDown:true
    })
    let parsm = {
      company: company,
      mobile: mobile
    }
    let code = await this.getRequest(parsm, 'message')
    if(code?.code == 1){
      this.setData({
        s:60
      })
      this.decrementTime()
    }else{
      wx.showToast({
        title: '验证码获取失败',
        icon: 'error',
        image: '',
        duration: 1500,
        mask: false,
      });
      this.setData({
        countDown:false
      })
    }
  },
  //接口请求
  getRequest(parsm, apig) {
    return new Promise((resolve, rej) => {
      let url = 'https://server.fmode.cn/api/apig/'
      wx.request({
        url: url + apig,
        data: parsm,
        header: { 'content-type': 'application/json' },
        method: 'POST',
        dataType: 'json',
        responseType: 'text',
        success: (result) => {
          console.log(result);
          resolve(result.data)
        },
        fail: () => {
          resolve(false)
        },
        complete: () => { }
      });
    })
  },
  // 倒计时
  decrementTime(){
    timer = setTimeout(() => {
      let { s } = this.data
      if(s == 0){
        this.setData({ countDown:false })
        timer && clearTimeout(timer)
        return
      }
      s--
      this.setData({
        s:s
      })
      this.decrementTime()
    }, 1000);
  },
  //验证码绑定手机号登录
  async completePhone() {
    let { mobile, verilyCode } = this.data
    if(!real.isPoneAvailable(mobile) || !verilyCode.toString().trim()){
      wx.showToast({
        title: '手机号或验证码不正确',
        icon: 'none',
        image: '',
        duration: 1500,
        mask: false,
      });
      return
    }
    let parsm = {
      mobile: mobile,
      code:verilyCode
    }
    let isVerify = await this.getRequest(parsm, 'verifyCode')
    console.log(isVerify);
    if(isVerify.code == 200){
      this.authMobileUser(mobile.toString())
    }else{
      wx.showToast({
        title:isVerify?.msg || '验证码错误',
        icon: 'none',
        image: '',
        duration: 1500,
        mask: false,
      });
      return
    }
  },
  //关闭手机号授权弹窗
  hideModal: function () {
    this.setData({
      phoneModal: false
    })
  },
  backLoad() {
    let pages = getCurrentPages();
    let beforePage = pages[pages.length - 2];
    let options = {
      isInit: true
    }
    beforePage?.onLoad(options)
    wx.navigateBack({
      delta: 1,
    })
  },
  goBack: function () {
    wx.navigateBack({
      delta: 1,
    })
  },

  //手动获取微信头像
  onChooseAvatar(e) {
    console.log(e);
    let {
      avatarUrl
    } = e.detail
    console.log(avatarUrl);
    this.setData({
      avatarUrl
    })
  },

  //获取昵称
  onChangeName(e) {
    console.log('1111');
    console.log(e);
  },
  //确定头像昵称
  async onComplete() {
    let {
      nickname,
      avatarUrl
    } = this.data
    // console.log(nickname, avatarUrl);
    if (!nickname || !avatarUrl) {
      wx.showToast({
        title: '请填写完整信息',
        icon: 'none',
        image: '',
        duration: 1500,
        mask: false,
      });
      return
    }
    //关键注释: https://up-z2.qiniup.com 合法域名必须配置
    try {
      let avatar = await this.updataAvatar(avatarUrl)
      let user = Parse.User.current()
      user.set("avatar", avatar)
      user.set("nickname", nickname)
      user.save().then(res => {
        this.onClose()
        this.backLoad()
      })
    } catch (err) {
      console.warn('https://up-z2.qiniup.com 合法域名必须配置');
      console.log(err);
      this.onClose()
      this.backLoad()
    }
  },
  //关闭头像昵称填写弹窗
  onClose() {
    this.setData({
      wxModel: false
    })
  },

  //上传头像
  updataAvatar(url) {
    let that = this;
    return new Promise((resolve, rejcet) => {
      qiniuUploader.upload(
        url,
        async (res) => {
          let img = res.imageURL;
          resolve(img)
        },
        (error) => {
          console.log("error: " + error);
          resolve(false)
        }, {
        region: "SCN",
        uploadURL: that.data.uploadURL,
        domain: that.data.domain,
        uptoken: that.data.uptokenURL,
      }
      );
    })
  },
  //选择勾选用户协议
  onCheckAgreement() {
    this.setData({
      check: !this.data.check
    })
  },
  //附件下载
  openFile() {
    let {
      agreement
    } = this.data
    let url = agreement.content,
      name = agreement.title
    const _this = this;
    let rep = this.getFileType(url)
    console.log(url, name);
    wx.showLoading({
      title: '加载中',
    })
    wx.downloadFile({
      url: url, //要预览的PDF的地址
      filePath: wx.env.USER_DATA_PATH + `/${name}.${rep}`,
      success: function (res) {
        console.log(res);
        if (res.statusCode === 200) { //成功
          var Path = res.filePath //返回的文件临时地址,用于后面打开本地预览所用
          console.log(Path)
          wx.openDocument({
            filePath: Path, //要打开的文件路径
            showMenu: true,
            success: function (res) {
              wx.hideLoading()
              console.log(res, '打开PDF成功');
            },
            fail: function (res) {
              console.log(res)
              wx.hideLoading()
            }
          })
        }
      },
      fail: function (res) {
        wx.hideLoading()
        console.log(res); //失败
      },
    })
  },
  //解析文件类型
  getFileType(url) {
    let pdfReg = /^.+(\.pdf)$/
    let txtReg = /^.+(\.txt)$/
    let wordReg = /^.+(\.doc|\.docx)$/
    let excelReg = /^.+(\.xls|\.xlsx)$/
    let jpgPng = /^.+(\.png)$/
    let jpgJpg = /^.+(\.jpg)$/
    let jpgJpeg = /^.+(\.jpeg)$/
    if (pdfReg.test(url)) {
      return 'pdf'
    }
    if (txtReg.test(url)) {
      return 'txt'
    }
    if (wordReg.test(url)) {
      return 'docx'
    }
    if (excelReg.test(url)) {
      return 'xls'
    }
    if (jpgPng.test(url)) {
      return 'png'
    }
    if (jpgJpg.test(url)) {
      return 'jpg'
    }
    if (jpgJpeg.test(url)) {
      return 'jpeg'
    }
  },

  onShow: function () {
    let userLogin = wx.getStorageSync('userLogin');
    if (userLogin != '') {
      wx.navigateBack();
    };
  },
  onReady: function () {

  },
})