// Package docsy transforms raw documents via Hugo and a Docsy template into
// final documentation.
package docsy

import (
	"context"
	"fmt"
	"os/exec"
	"path/filepath"

	"go.skia.org/infra/go/executil"
	"go.skia.org/infra/go/metrics2"
	"go.skia.org/infra/go/skerr"
	"go.skia.org/infra/go/sklog"
	"go.skia.org/infra/go/timer"
)

// Docsy renders documentation against a Docsy template.
type Docsy interface {
	// Render the documentation in 'src' into 'dst' using Hugo and the Docsy
	// templates.
	Render(ctx context.Context, src, dst string) error
}

// docsy implements Docsy.
type docsy struct {
	// Absolute path the 'hugo' executable.
	hugoExe string

	// The directory where Docsy is located.
	docsyDir string

	// The relative path in the git repo where the docs are stored, e.g. "site"
	// for Skia.
	docPath string

	// renderMetric records how long it is taking hugo to run.
	renderMetric metrics2.Float64SummaryMetric
}

// New returns an instance of *docsy.
func New(hugoExe string, docsyDir string, docPath string) *docsy {
	return &docsy{
		hugoExe:      hugoExe,
		docsyDir:     docsyDir,
		docPath:      docPath,
		renderMetric: metrics2.GetFloat64SummaryMetric("docsyserver_docsy_render"),
	}
}

// Render implements Docsy.
func (d *docsy) Render(ctx context.Context, src, dst string) error {
	defer timer.NewWithSummary("docsy_render", d.renderMetric).Stop()
	cmd := executil.CommandContext(ctx,
		d.hugoExe,
		fmt.Sprintf("--source=%s", d.docsyDir),
		fmt.Sprintf("--destination=%s", dst),
		fmt.Sprintf("--config=%s", filepath.Join(src, "config.toml")),
		fmt.Sprintf("--contentDir=%s", src),
	)
	sklog.Info(cmd.String())

	b, err := cmd.Output()

	if err != nil {
		if ee, ok := err.(*exec.ExitError); ok {
			err = skerr.Wrapf(err, "hugo stderr: %q\n stdout: %q", ee.Stderr, string(b))
		}
		return err
	}
	return nil
}

// Assert that docsy implements Docsy.
var _ Docsy = (*docsy)(nil)
