package common

import (
	"archive/zip"
	"fmt"
	"image"

	"go.devnw.com/ooxml/zippkg"
)

// DocBase is the type embedded in in the Document/Workbook/Presentation types
// that contains members common to all.
type DocBase struct {
	ContentTypes     ContentTypes
	AppProperties    AppProperties
	Rels             Relationships
	CoreProperties   CoreProperties
	CustomProperties CustomProperties
	Thumbnail        image.Image // thumbnail preview of the document

	Images     []ImageRef
	ExtraFiles []ExtraFile
	TmpPath    string // path where temporary files are stored when opening documents

}

// AddExtraFileFromZip is used when reading an unsupported file from an OOXML
// file. This ensures that unsupported file content will at least round-trip
// correctly.
func (d *DocBase) AddExtraFileFromZip(f *zip.File) error {
	path, err := zippkg.ExtractToDiskTmp(f, d.TmpPath)
	if err != nil {
		return fmt.Errorf("error extracting unsupported file: %s", err)
	}
	d.ExtraFiles = append(d.ExtraFiles, ExtraFile{
		ZipPath:  f.Name,
		DiskPath: path,
	})
	return nil
}

// WriteExtraFiles writes the extra files to the zip package.
func (d *DocBase) WriteExtraFiles(z *zip.Writer) error {
	for _, ef := range d.ExtraFiles {
		if err := zippkg.AddFileFromDisk(z, ef.ZipPath, ef.DiskPath); err != nil {
			return err
		}
	}
	return nil
}

// ExtraFile is an unsupported file type extracted from, or to be written to a
// zip package
type ExtraFile struct {
	ZipPath  string
	DiskPath string
}
