--!strict
local fs = require("@lune/fs")
local net = require("@lune/net")
local process = require("@lune/process")
local serde = require("@lune/serde")

local types = require("./types")

print("-- 🟧 Starting pull of latest release...")

print("🟧 Fetching github token...")
local github_token: string = process.args[1]

if not github_token then
    local env_exists = fs.metadata(".env").exists
    if not env_exists then
        error("Usage: lune run download-jecs [GITHUB_PAT]\nAlternatively, put the PAT in an .env file under GITHUB_PAT")
    end

    local env = serde.decode("toml", fs.readFile(".env"))
    local pat = env.GITHUB_PAT or error("❌ Couldn't read GITHUB_PAT from .env")
    github_token = pat
end
print("✅ Got github token.")

--local manifest_contents = fs.readFile("wally.toml") or error("Couldn't read manifest.")
print("🟧 Fetching latest jecs wally manifest...")
local pull_manifest_res = net.request("https://raw.githubusercontent.com/Ukendio/jecs/refs/heads/main/wally.toml")
if not pull_manifest_res.ok then
    error(`❌ Couldn't download jecs manifest: {pull_manifest_res.statusCode} {pull_manifest_res.statusMessage}`)
end
local manifest_contents = pull_manifest_res.body
local manifest: types.wally_manifest = serde.decode("toml", manifest_contents) or error("Couldn't decode manifest.")
local jecs_version = manifest.package.version
print(`✅ Got latest manifest. Version: {jecs_version}`)

type gh_api_tag = {
    ref: string,
    node_id: string,
    url: string,
    object: {
        sha: string,
        type: string,
        url: string,
    },
}

print("🟧 Getting tag associated with version in manifest...")
local response = net.request({
    url = `https://api.github.com/repos/ukendio/jecs/git/refs/tags/v{jecs_version}`,
    method = "GET",
    headers = {
        Accept = "application/vnd.github+json",
        Authorization = `Bearer {github_token}`,
        ["X-GitHub-Api-Version"] = "2022-11-28",
    },
})

if not response.ok then
    error(`❌ Github api response not ok:\n{response.statusCode} @ {response.statusMessage}\n{response.body}`)
end

local gh_api_tag: gh_api_tag = serde.decode("json", response.body)
print(`✅ Got associated tag: {gh_api_tag.object.sha}`)

local URL = `https://raw.githubusercontent.com/Ukendio/jecs/{gh_api_tag.object.sha}/`
local function download(path: string, output: string)
    process.spawn("curl", { URL .. path, "-o", output })
end

local function download_list(list: { { path: string, output: string } })
    local n = #list
    print(`🟧 Downloading {n} files...`)

    for idx = 1, n do
        local file = list[idx]

        if file.output == "$" then
            file.output = file.path
        end

        print(`Downloading file {idx}/{n} - {file.path} -> {file.output}...`)
        download(file.path, file.output)
    end

    print(`✅ Downloaded {n} files.`)
end

download_list({
    { path = "jecs.luau", output = "init.luau" },
    { path = ".luaurc", output = "$" },
    { path = "LICENSE", output = "$" },
    { path = "README.md", output = "$" },
    { path = "CHANGELOG.md", output = "$" },
})

print(`🟧 Modifying README.md to include repo info...`)
local readme_contents = fs.readFile("README.md")
local new_readme_contents = [[
An automatically synced minimal copy of the [jecs](https://github.com/Ukendio/jecs) repo published to pesde.
Install with pesde @ `marked/jecs`


]] .. readme_contents
fs.writeFile("README.md", new_readme_contents)
print(`✅ Modified README.md.`)

local pesde_manifest: types.pesde_manifest = {
    name = "marked/jecs",
    description = "A minimal copy of jecs published on the official pesde registry",
    version = jecs_version,
    authors = { "jecs authors" },
    repository = "https://git.devmarked.win/marked/jecs-pesde",
    license = manifest.package.license,
    includes = {
        "init.luau",
        "pesde.toml",
        "README.md",
        "CHANGELOG.md",
        "LICENSE",
        ".luaurc",
    },

    target = {
        environment = "luau",
        lib = "init.luau",
    },

    indices = {
        default = "https://github.com/pesde-pkg/index",
    },
}

local pesde_roblox_manifest: types.pesde_manifest = {
    name = "marked/jecs",
    description = "A minimal copy of jecs published on the official pesde registry",
    version = jecs_version,
    authors = { "jecs authors" },
    repository = "https://git.devmarked.win/marked/jecs-pesde",
    license = manifest.package.license,
    includes = {
        "init.luau",
        "pesde.toml",
        "README.md",
        "CHANGELOG.md",
        "LICENSE",
        ".luaurc",
    },

    target = {
        environment = "roblox",
        lib = "init.luau",
        build_files = { "init.luau" },
    },

    indices = {
        default = "https://github.com/pesde-pkg/index",
    },
}

print("🟧 Writing pesde manifest...")
local serialized_manifest = serde.encode("toml", pesde_manifest, true)
fs.writeFile("pesde.toml", serialized_manifest)
local serialized_rbx_manifest = serde.encode("toml", pesde_roblox_manifest, true)
fs.writeFile("pesde-rbx.toml", serialized_rbx_manifest)
print("✅ Wrote pesde manifest.")

print("-- ✅ Finished pulling latest release.")