import { string } from "https://raw.githubusercontent.com/soremwar/deno_types/b5a146610e2c97c1612371fcf610b541f950ee73/prop-types/v15.7.2/prop-types.d.ts";
import { S3, S3Bucket } from "../deps.ts";
import { wait } from "../deps.ts"

const S3inner = wait({
    text: "Generating S3 Index...",
    spinner: "aesthetic"
})

interface S3File {
    url: string
    key: string | undefined
}

const s3 = new S3({
    accessKeyID: Deno.env.get("S3_ACCESS_KEY")!,
    secretKey: Deno.env.get("S3_SECRET_KEY")!,
    endpointURL: Deno.env.get("S3_ENDPOINT_URL"),
    region: "eu-central-1"
});


let DreamlandBucket = s3.getBucket(Deno.env.get("S3_BUCKET") || "dreamland-assets.lio.systems")

const bucketDomain = Deno.env.get("S3_DOMAIN") || Deno.env.get("S3_ENDPOINT_URL")

const list = DreamlandBucket.listAllObjects({
    batchSize: 5
})

let Files: S3File[] = []

for await (const obj of list) {
    if (obj.size === 0) {
        S3inner.text = `${bucketDomain}/${obj.key} - Is a Folder, Continue`
        continue
    }

    Files.push({
        url: `${bucketDomain}/${obj.key}`,
        key: obj.key
    })
}

function createFile(files: S3File[]) {
    let string =
        `// This File is Autogenerated by scripts/routes.ts
// Do not edit this File manually
// run \`vr s3\` to regenerate this File

const S3Files = [
    ${files.map(file => (`{ key: "${file.key}", url: "${file.url}" }`)).join(",\n    ")}
]

export default S3Files
    `

    return string
}


async function write(files: S3File[], file: string | URL) {
    const content = createFile(files)

    await Deno.writeTextFile(`./src/${file}`, content)
}


if (import.meta.main) {

    try {
        await write(Files, `s3.generated.ts`)
    } catch (error) {
        console.error(error)
        S3inner.fail()
        Deno.exit(1)
    }
    S3inner.succeed("S3 Index generated.")
    Deno.exit(0)
}