// Copyright 2020 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

package main

import (
	"flag"
	"fmt"
	"io/ioutil"
	"log"
	"path"
	"strings"

	"go.chromium.org/luci/lucicfg/docgen"
)

// Returns a func which returns the contents of a Starlark module relative to
// starlarkRoot.
//
// Some modules are skipped, e.g. "@stdlib" modules.
func getSourceFn(starlarkRoot string) func(string) (string, error) {
	return func(module string) (string, error) {
		if strings.HasPrefix(module, "@stdlib") || strings.HasPrefix(module, "@proto") {
			log.Printf("Skipping module %v", module)
			return "", nil
		}

		if !strings.HasPrefix(module, "//") {
			return "", fmt.Errorf("Expected module to start with '//', actual %v", module)
		}

		log.Printf("Reading module %v\n", module)

		fileBytes, err := ioutil.ReadFile(
			path.Join(
				starlarkRoot,
				strings.TrimLeft(module, "/"),
			),
		)

		if err != nil {
			return "", err
		}

		return string(fileBytes), nil
	}
}

func main() {
	template := flag.String("template", "", "Path to a markdown template file. Required.")
	output := flag.String("output", "", "Path to output a markdown file to. Required.")
	starlarkRoot := flag.String(
		"starlarkRoot",
		"",
		"Path to the root of the Starlark package. This is the directory "+
			"load statements are relative to, i.e. if //config/util/liba.star "+
			"is pointing to ~/chromiumos/src/config/util/liba.star, "+
			"starlarkRoot is ~/chromiumos/src. Required.",
	)

	flag.Parse()

	if len(*template) == 0 {
		log.Fatalln("template must be specified.")
	}

	if len(*output) == 0 {
		log.Fatalln("output must be specified.")
	}

	if len(*starlarkRoot) == 0 {
		log.Fatalln("starlarkRoot must be specified.")
	}

	templateBytes, err := ioutil.ReadFile(*template)
	if err != nil {
		log.Fatalln(err)
	}

	generator := &docgen.Generator{Starlark: getSourceFn(*starlarkRoot)}

	outputBytes, err := generator.Render(string(templateBytes))
	if err != nil {
		log.Fatalln(err)
	}

	if err = ioutil.WriteFile(*output, outputBytes, 0640); err != nil {
		log.Fatalln(err)
	}

	log.Printf("Wrote output to %v\n", *output)
}
