package metadata

import (
	"strings"
)

type BackupLogMetadataChangeset struct {
	Added      string
	Changed    string
	Unmodified string
}
type BackupLogMetadataProcessed struct {
	Files    string
	Size     string
	Duration string
}
type BackupLogMetadata struct {
	ParentSnapshotID string
	Files            BackupLogMetadataChangeset
	Dirs             BackupLogMetadataChangeset
	AddedSize        string
	Processed        BackupLogMetadataProcessed
	SnapshotID       string
	ExitCode         string
}

type MetadatExtractor interface {
	Matches(line string) bool
	Extract(metadata *BackupLogMetadata, line string)
}

var extractors = []MetadatExtractor{
	NewParentSnapshotIDExtractor(),
	NewFilesExtractor(),
	NewDirsExtractor(),
	NewAddedExtractor(),
	NewProcessedExtractor(),
	NewSnapshotExtractor(),
}

func ExtractMetadataFromBackupLog(log string) BackupLogMetadata {
	var md BackupLogMetadata
	for _, line := range strings.Split(log, "\n") {
		line = strings.TrimSpace(line)
		for _, extractor := range extractors {
			if extractor.Matches(line) {
				extractor.Extract(&md, line)
				continue
			}
		}
	}
	return md
}

func MakeEnvFromMetadata(metadata *BackupLogMetadata) map[string]string {
	env := make(map[string]string)
	var prefix = "AUTORESTIC_"

	env[prefix+"SNAPSHOT_ID"] = metadata.SnapshotID
	env[prefix+"PARENT_SNAPSHOT_ID"] = metadata.ParentSnapshotID
	env[prefix+"FILES_ADDED"] = metadata.Files.Added
	env[prefix+"FILES_CHANGED"] = metadata.Files.Changed
	env[prefix+"FILES_UNMODIFIED"] = metadata.Files.Unmodified
	env[prefix+"DIRS_ADDED"] = metadata.Dirs.Added
	env[prefix+"DIRS_CHANGED"] = metadata.Dirs.Changed
	env[prefix+"DIRS_UNMODIFIED"] = metadata.Dirs.Unmodified
	env[prefix+"ADDED_SIZE"] = metadata.AddedSize
	env[prefix+"PROCESSED_FILES"] = metadata.Processed.Files
	env[prefix+"PROCESSED_SIZE"] = metadata.Processed.Size
	env[prefix+"PROCESSED_DURATION"] = metadata.Processed.Duration
	env[prefix+"EXIT_CODE"] = metadata.ExitCode

	return env
}