/** @module services/update */
import DeviceInfo from 'react-native-device-info';
import post from '../utils/post';
import { encrypt } from '../utils/helper';
import config from '../utils/config';

/**
 * @typedef {Object} DeploymentInfo 部署信息
 * @property {number} id 部署id
 * @property {string} versionNumber 版本号
 * @property {string} description 描述，一般为更新说明
 * @property {Date} updateTime 部署发布时间
 * @property {string} uri 资源内部uri，表示app安装包文件的内部定位地址
 * @property {string} status 部署状态，可能值为release，development，broken。release表示公开版本，development表示内部测试版，broken表示有重大bug，短时间不能解决，需要回滚
 */

/**
 * @typedef {Object} VersionCheck 升级检查结果
 * @property {string} tokenId 更新服务器所使用的tokenId
 * @property {string} action 可能值分别为update（可更新），rollback（需回滚），upToDate（已经是最新版，无需更新）
 * @property {DeploymentInfo} deploymentInfo 需更新或回滚的部署包信息
 */

/**
 * 升级检查
 * @returns {Promise.<VersionCheck>}
 */
export const checkUpdate = async () => {
  const { tokenId } = await post(`${config.updateContextPath}/api/auth/login`, {
    type: 'quest',
    authRequest: {
      type: 'quest',
    },
    tokenInfo: {
      productId: config.productId,
      deviceId: `${DeviceInfo.getUniqueID()}`,
    },
  }, {}, {}, false);
  const result = await post(`${config.updateContextPath}/api/app/user/apps/check`, {
    name: config.productId,
    version: DeviceInfo.getVersion(),
    token: encrypt(tokenId),
  }, {}, {}, false);
  result.tokenId = tokenId;
  return result;
};
