import crypto from "crypto";
import fetch from "fetch-with-proxy";
import env from "@server/env";
import Collection from "@server/models/Collection";
import Document from "@server/models/Document";
import Team from "@server/models/Team";
import User from "@server/models/User";
import Redis from "@server/redis";
import packageInfo from "../../package.json";

const UPDATES_URL = "https://updates.getoutline.com";
const UPDATES_KEY = "UPDATES_KEY";

export async function checkUpdates() {
  const secret = env.SECRET_KEY.slice(0, 6) + env.URL;
  const id = crypto.createHash("sha256").update(secret).digest("hex");
  const [
    userCount,
    teamCount,
    collectionCount,
    documentCount,
  ] = await Promise.all([
    User.count(),
    Team.count(),
    Collection.count(),
    Document.count(),
  ]);
  const body = JSON.stringify({
    id,
    version: 1,
    clientVersion: packageInfo.version,
    analytics: {
      userCount,
      teamCount,
      collectionCount,
      documentCount,
    },
  });
  await Redis.defaultClient.del(UPDATES_KEY);

  try {
    const response = await fetch(UPDATES_URL, {
      method: "POST",
      headers: {
        Accept: "application/json",
        "Content-Type": "application/json",
      },
      body,
    });
    const data = await response.json();

    if (data.severity) {
      await Redis.defaultClient.set(
        UPDATES_KEY,
        JSON.stringify({
          severity: data.severity,
          message: data.message,
          url: data.url,
        })
      );
    }
  } catch (_e) {
    // no-op
  }
}
