package options

import (
	"fmt"

	"github.com/anchore/clio"
	"github.com/anchore/fangs"
	"github.com/anchore/go-homedir"
	"github.com/anchore/syft/syft/sbom"
)

var _ interface {
	clio.FlagAdder
	clio.PostLoader
} = (*OutputFile)(nil)

// Deprecated: OutputFile supports the --file to write the SBOM output to
type OutputFile struct {
	Enabled    bool   `yaml:"-" json:"-" mapstructure:"-"`
	LegacyFile string `yaml:"-" json:"-" mapstructure:"legacyFile"`
}

func (o *OutputFile) AddFlags(flags clio.FlagSet) {
	if o.Enabled {
		flags.StringVarP(&o.LegacyFile, "file", "",
			"file to write the default report output to (default is STDOUT)")

		if pfp, ok := flags.(fangs.PFlagSetProvider); ok {
			flagSet := pfp.PFlagSet()
			flagSet.Lookup("file").Deprecated = "use: --output FORMAT=PATH"
		}
	}
}

func (o *OutputFile) PostLoad() error {
	if !o.Enabled {
		return nil
	}
	if o.LegacyFile != "" {
		file, err := expandFilePath(o.LegacyFile)
		if err != nil {
			return err
		}
		o.LegacyFile = file
	}
	return nil
}

func (o *OutputFile) SBOMWriter(f sbom.FormatEncoder) (sbom.Writer, error) {
	if !o.Enabled {
		return nil, nil
	}
	writer, err := newSBOMMultiWriter(newSBOMWriterDescription(f, o.LegacyFile))
	if err != nil {
		return nil, err
	}

	return writer, nil
}

func expandFilePath(file string) (string, error) {
	if file != "" {
		expandedPath, err := homedir.Expand(file)
		if err != nil {
			return "", fmt.Errorf("unable to expand file path=%q: %w", file, err)
		}
		file = expandedPath
	}
	return file, nil
}
