import { parse as JSONC } from "https://deno.land/x/jsonct@v0.1.0/mod.ts";

type JsonLike = { [key: string]: string | string[] | JsonLike; };

/** A `file://` url version of Deno.cwd() (contains trailing slash) */
export const Root:string = new URL(`file://${Deno.cwd().replaceAll("\\", "/")}`).toString() + "/";
export default async function HuntConfig(directory=Root):Promise<{
    imports: JsonLike;
    compilerOptions: JsonLike;
}>
{
    let path:string, json:JsonLike|undefined;
    console.log("searchig in directory", directory)
    const loadJSON =async(inPath:string)=>{
        try{
            const path = new URL(inPath, directory);
            console.log("looking at", path.href);
            const resp = await fetch(path);
            if(inPath.endsWith("./.jsonc"))
            {
                const text = await resp.text();
                json = JSONC(text) as JsonLike;
            }
            else
            {
                json = await resp.json();
            }
            return json;            
        }
        catch(_e)
        {
            return {};
        }
    }

    try// look for `deno.json`
    {
        json = await loadJSON("./deno.json");
    }
    catch(_e)
    {
        
        try // look for `deno.jsonc`
        {
            json = await loadJSON("./deno.jsonc");
        }
        catch(_e)
        {
            try // look in the vscode plugin settings
            {
                json = await loadJSON("./.vscode/settings.json")
                path = json ? json["deno.config"] as string : "";
                json = undefined;
                if(path)
                {
                    json = await loadJSON(path)
                }
            }
            catch(_e)
            {
                // cant find a config using the vscode plugin
            }
        }
    }

    if(!json)
    {
        json = {};
    }


    path = json.importMap as string;
    if(!json.imports && path)
    {
        json.imports = await loadJSON(path) as JsonLike;
    }      

    return json as {imports:JsonLike, compilerOptions:JsonLike};  

}