package sheet

import (
	"fmt"
	"io"
	"os"
	"path/filepath"
)

// Copy copies a cheatsheet to a new location
func (s *Sheet) Copy(dest string) error {

	// NB: while the `infile` has already been loaded and parsed into a `sheet`
	// struct, we're going to read it again here. This is a bit wasteful, but
	// necessary if we want the "raw" file contents (including the front-matter).
	// This is because the frontmatter is parsed and then discarded when the file
	// is loaded via `sheets.Load`.
	infile, err := os.Open(s.Path)
	if err != nil {
		return fmt.Errorf("failed to open cheatsheet: %s, %v", s.Path, err)
	}
	defer infile.Close()

	// create any necessary subdirectories
	dirs := filepath.Dir(dest)
	if dirs != "." {
		if err := os.MkdirAll(dirs, 0755); err != nil {
			return fmt.Errorf("failed to create directory: %s, %v", dirs, err)
		}
	}

	// create the outfile
	outfile, err := os.Create(dest)
	if err != nil {
		return fmt.Errorf("failed to create outfile: %s, %v", dest, err)
	}
	defer outfile.Close()

	// copy file contents
	_, err = io.Copy(outfile, infile)
	if err != nil {
		return fmt.Errorf(
			"failed to copy file: infile: %s, outfile: %s, err: %v",
			s.Path,
			dest,
			err,
		)
	}

	return nil
}
