<template>
  <view class="update-container">
    <!-- 进度条 -->
    <view v-if="showProgress" class="progress-container">
      <view class="progress-title">正在更新 {{ progress }}%</view>
      <view class="progress-bar">
        <view class="progress" :style="{ width: progress + '%' }"></view>
      </view>
    </view>
    
    <!-- 更新提示弹窗 -->
    <view v-if="showUpdateDialog" class="dialog-mask">
      <view class="dialog">
        <view class="dialog-title">发现新版本 v{{ newVersion }}</view>
        <view class="dialog-content">{{ updateInfo.desc || '有新的功能和优化，建议立即更新' }}</view>
        <view class="dialog-buttons">
          <button v-if="!updateInfo.force" class="cancel-btn" @click="showUpdateDialog = false">稍后更新</button>
          <button class="confirm-btn" @click="startUpdate">立即更新</button>
        </view>
      </view>
    </view>
  </view>
</template>

<script>
export default {
  data() {
    return {
      // 当前版本
      currentVersion: '',
      // 最新版本
      newVersion: '',
      // 更新信息
      updateInfo: {},
      // 是否显示更新弹窗
      showUpdateDialog: false,
      // 是否显示进度条
      showProgress: false,
      // 更新进度
      progress: 0
    };
  },
  
  onLoad() {
    // 初始化时检查版本
    this.checkVersion();
  },
  
  methods: {
    /**
     * 检查当前版本
     */
    async checkVersion() {
      try {
        // 获取当前应用版本
        const versionInfo = plus.runtime.version;
        this.currentVersion = versionInfo;
        console.log('当前版本:', this.currentVersion);
        
        // 调用后端接口检查最新版本
        // 这里替换为你的后端接口地址
        const res = await this.$http.get('/api/checkVersion', {
          platform: uni.getSystemInfoSync().platform,
          version: this.currentVersion
        });
        
        if (res.code === 0 && res.data.hasUpdate) {
          this.newVersion = res.data.version;
          this.updateInfo = res.data;
          // 显示更新提示
          this.showUpdateDialog = true;
        } else {
          console.log('当前已是最新版本');
        }
      } catch (error) {
        console.error('版本检查失败:', error);
      }
    },
    
    /**
     * 开始更新
     */
    startUpdate() {
      if (!this.updateInfo.downloadUrl) {
        uni.showToast({
          title: '更新地址不存在',
          icon: 'none'
        });
        return;
      }
      
      this.showUpdateDialog = false;
      this.showProgress = true;
      this.downloadWgt(this.updateInfo.downloadUrl);
    },
    
    /**
     * 下载wgt包
     */
    downloadWgt(url) {
      const downloadTask = uni.downloadFile({
        url: url,
        success: (downloadResult) => {
          if (downloadResult.statusCode === 200) {
            // 下载成功，安装wgt包
            this.installWgt(downloadResult.tempFilePath);
          } else {
            this.showProgress = false;
            uni.showToast({
              title: '下载失败',
              icon: 'none'
            });
          }
        },
        fail: (err) => {
          this.showProgress = false;
          console.error('下载失败:', err);
          uni.showToast({
            title: '下载失败，请稍后重试',
            icon: 'none'
          });
        }
      });
      
      // 监听下载进度
      downloadTask.onProgressUpdate((res) => {
        this.progress = res.progress;
      });
    },
    
    /**
     * 安装wgt包
     */
    installWgt(path) {
      plus.runtime.install(
        path,
        {
          force: false // 是否强制安装
        },
        () => {
          console.log('安装成功');
          this.showProgress = false;
          
          // 安装成功后提示重启
          uni.showModal({
            title: '更新完成',
            content: '应用已更新，是否立即重启？',
            showCancel: !this.updateInfo.force,
            success: (res) => {
              if (res.confirm) {
                // 重启应用
                plus.runtime.restart();
              }
            }
          });
        },
        (err) => {
          console.error('安装失败:', err);
          this.showProgress = false;
          uni.showToast({
            title: '更新失败: ' + err.message,
            icon: 'none',
            duration: 3000
          });
        }
      );
    }
  }
};
</script>

<style scoped>
.update-container {
  position: fixed;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  pointer-events: none;
  z-index: 9999;
}

/* 进度条样式 */
.progress-container {
  position: fixed;
  top: 0;
  left: 0;
  width: 100%;
  background-color: #fff;
  padding: 10rpx 20rpx;
  pointer-events: auto;
}

.progress-title {
  font-size: 28rpx;
  color: #333;
  margin-bottom: 10rpx;
  text-align: center;
}

.progress-bar {
  height: 8rpx;
  background-color: #eee;
  border-radius: 4rpx;
  overflow: hidden;
}

.progress {
  height: 100%;
  background-color: #007aff;
  transition: width 0.3s ease;
}

/* 弹窗样式 */
.dialog-mask {
  position: fixed;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  background-color: rgba(0, 0, 0, 0.5);
  display: flex;
  justify-content: center;
  align-items: center;
  pointer-events: auto;
}

.dialog {
  width: 600rpx;
  background-color: #fff;
  border-radius: 16rpx;
  overflow: hidden;
}

.dialog-title {
  font-size: 36rpx;
  font-weight: bold;
  color: #333;
  padding: 30rpx;
  text-align: center;
  border-bottom: 1px solid #eee;
}

.dialog-content {
  font-size: 32rpx;
  color: #666;
  padding: 40rpx 30rpx;
  line-height: 1.6;
}

.dialog-buttons {
  display: flex;
  border-top: 1px solid #eee;
}

.cancel-btn, .confirm-btn {
  flex: 1;
  height: 100rpx;
  line-height: 100rpx;
  font-size: 32rpx;
  border: none;
  background-color: transparent;
}

.cancel-btn {
  color: #666;
  border-right: 1px solid #eee;
}

.confirm-btn {
  color: #007aff;
}
</style>
