// Copyright 2018 The Fuchsia 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 (
	"context"
	"flag"
	"io"
	"log"
	"os"
	"path/filepath"
	"strings"

	"go.fuchsia.dev/tools/build/gndoc"
)

type stringsFlag []string

func (s *stringsFlag) String() string {
	return strings.Join(*s, ", ")
}

func (s *stringsFlag) Set(value string) error {
	*s = append(*s, value)
	return nil
}

var (
	keyArgs     stringsFlag
	inputFiles  stringsFlag
	outFile     string
	sourcesFile string
)

func init() {
	flag.Var(&keyArgs, "key", "a label for output")
	flag.Var(&inputFiles, "in", "path to an input file")
	flag.StringVar(&outFile, "out", "", "path to output file (default stdout)")
	flag.StringVar(&sourcesFile, "s", "", "path to json file generated by Jiri projects")
}

func main() {
	flag.Parse()
	if flag.NArg() != 0 {
		flag.PrintDefaults()
	}

	if sourcesFile == "" {
		log.Fatalf("Error: no Jiri project reference file specified.\nTo generate, use jiri project -json-output=<file>.\n")
	}

	// Open the json file.
	sources, err := os.Open(sourcesFile)
	if err != nil {
		log.Fatalf("Error: unable to open %s", sourcesFile)
	}
	defer sources.Close()

	ctx := context.Background()
	sourceMap, err := gndoc.NewSourceMap(sources)
	if err != nil {
		log.Fatalf("Error: %s", err)
	}
	argMap := gndoc.NewArgMap(sourceMap)

	args, errs := gndoc.ParseGNArgs(ctx, inputFiles, keyArgs)
	argMap.AddArgs(args)
	if err := <-errs; err != nil {
		log.Fatalf("Error: %s\n", err)
	}

	var out io.Writer
	if outFile != "" {
		var err error
		if dirErr := os.MkdirAll(filepath.Dir(outFile), os.ModePerm); dirErr != nil {
			log.Fatalf("Error creating directories: %s", dirErr)
		}
		out, err = os.Create(outFile)
		if err != nil {
			log.Fatalf("Error opening file: %s", err)
		}
	} else {
		out = os.Stdout
	}

	argMap.EmitMarkdown(out)
}
