// 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 codegen

import (
	"io"
	"os"
	"path/filepath"
	"text/template"

	"go.fuchsia.dev/fuchsia/tools/fidl/lib/fidlgen"
)

type FidlGenerator struct {
	tmpls *template.Template
}

func NewFidlGenerator() *FidlGenerator {
	tmpls := template.New("DartTemplates")
	template.Must(tmpls.Parse(bitsTmpl))
	template.Must(tmpls.Parse(constTmpl))
	template.Must(tmpls.Parse(enumTmpl))
	template.Must(tmpls.Parse(protocolTmpl))
	template.Must(tmpls.Parse(libraryTmpl))
	template.Must(tmpls.Parse(structTmpl))
	template.Must(tmpls.Parse(tableTmpl))
	template.Must(tmpls.Parse(unionTmpl))
	return &FidlGenerator{
		tmpls: tmpls,
	}
}

func (gen FidlGenerator) generateAsyncFile(wr io.Writer, tree Root) error {
	return gen.tmpls.ExecuteTemplate(wr, "GenerateAsyncFile", tree)
}

func (gen FidlGenerator) generateTestFile(wr io.Writer, tree Root) error {
	return gen.tmpls.ExecuteTemplate(wr, "GenerateTestFile", tree)
}

func writeFile(
	generate func(io.Writer, Root) error, tree Root,
	outputFilename string, dartfmt string) error {

	if err := os.MkdirAll(filepath.Dir(outputFilename), os.ModePerm); err != nil {
		return err
	}
	generated, err := fidlgen.NewLazyWriter(outputFilename)
	if err != nil {
		return err
	}
	defer generated.Close()

	generatedPipe, err := fidlgen.NewFormatter(dartfmt).FormatPipe(generated)
	if err != nil {
		return err
	}

	if err := generate(generatedPipe, tree); err != nil {
		return err
	}
	return generatedPipe.Close()
}

func (gen FidlGenerator) GenerateAsyncFile(tree Root, path string, dartfmt string) error {
	return writeFile(gen.generateAsyncFile, tree, path, dartfmt)
}

func (gen FidlGenerator) GenerateTestFile(tree Root, path string, dartfmt string) error {
	return writeFile(gen.generateTestFile, tree, path, dartfmt)
}
