import { AwsClient } from "aws4fetch";

const contentTypes: { [k: string]: string } = {
  avif: "image/avif",
  gif: "image/gif",
  jpeg: "image/jpeg",
  jpg: "image/jpeg",
  m4v: "video/x-m4v",
  mkv: "video/x-matroska",
  mov: "video/mp4",
  mp4: "video/mp4",
  png: "image/png",
  webm: "video/webm",
  webp: "image/webp",
  wmv: "video/x-ms-wmv",
};

export default async function (
  env: Env,
  path: string,
  size: number,
  extension: string,
) {
  const aws = new AwsClient({
    accessKeyId: env.R2_ACCESS_KEY,
    secretAccessKey: env.R2_SECRET_KEY,
  });

  return (
    await aws.sign(
      `https://car-crushers.${env.R2_ZONE}.r2.cloudflarestorage.com/${path}?X-Amz-Expires=1800`,
      {
        aws: {
          allHeaders: true,
          signQuery: true,
        },
        headers: {
          "content-length": size.toString(),
          "content-type": contentTypes[extension],
        },
        method: "PUT",
      },
    )
  ).url;
}
