
_USAGE := "
    tomo-install file.tm...
"

_HELP := "
    tomo-install: a tool for installing libraries for the Tomo language
    Usage: $_USAGE
"

func find_urls(path:Path -> [Text]):
    urls := @[:Text]
    if path:is_directory():
        for f in path:children():
            urls:insert_all(find_urls(f))
    else if path:is_file() and path:ends_with(".tm"):
        for line in path:by_line()!:
            if m := line:matches($/use{space}{url}/) or line:matches($/{id}{space}:={space}use{space}{url}/):
                urls:insert(m[-1])
    return urls

func main(paths:[Path]):
    if paths.length == 0:
        paths = [(./)]

    urls := (++: find_urls(p) for p in paths) or [:Text]

    github_token := (~/.config/tomo/github-token):read()

    (~/.local/share/tomo/installed):create_directory()
    (~/.local/share/tomo/lib):create_directory()

    for url in urls:
        original_url := url
        url_without_protocol := url:trim($|http{0-1 s}://|, trim_right=no)
        hash := $(echo -n @url_without_protocol | sha256sum):run()!:slice(to=32)
        if (~/.local/share/tomo/installed/$hash):is_directory():
            say("Already installed: $url")
            skip

        alias := none:Text
        curl_flags := ["-L"]
        if github := url_without_protocol:matches($|github.com/{!/}/{!/}#{..}|):
            user := github[1]
            repo := github[2]
            tag := github[3]
            url = "https://api.github.com/repos/$user/$repo/tarball/$tag"
            alias = "$(repo:trim($/tomo-/, trim_right=no)).$(tag).$(user)"
            if github_token:
                curl_flags ++= ["-H", "Authorization: Bearer $github_token"]
            curl_flags ++= [
                "-H", "Accept: application/vnd.github+json",
                "-H", "X-GitHub-Api-Version: 2022-11-28",
            ]

        (~/.local/share/tomo/downloads/$hash):create_directory()
        say($Shell@`
            set -euo pipefail
            cd ~/.local/share/tomo/downloads/@hash
            curl @curl_flags @url | tar xz -C ~/.local/share/tomo/installed --strip-components=1 --one-top-level=@hash
            echo @original_url > ~/.local/share/tomo/installed/@hash/source.url
            tomo -L ~/.local/share/tomo/installed/@hash
            ln -f -s ../installed/@hash/lib@hash.so ~/.local/share/tomo/lib/lib@hash.so
        `:run()!)

        if alias:
            say($(
                set -exuo pipefail
                ln -f -s @hash ~/.local/share/tomo/installed/@alias
                ln -f -s lib@hash.so ~/.local/share/tomo/lib/lib@alias.so
            ):run()!)
        
        say("$\[1]Installed $url!$\[]")
                
