// Copyright 2023 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

package database

import (
	"encoding/json"
	"fmt"
	"os"
	"path/filepath"
)

func (db *Database) Write(dir string) error {
	gzip := true
	if err := db.writeIndex(filepath.Join(dir, indexDir), gzip); err != nil {
		return err
	}
	return db.writeEntries(filepath.Join(dir, idDir), gzip)
}

func (db *Database) writeIndex(dir string, gzip bool) error {
	if err := os.MkdirAll(dir, 0755); err != nil {
		return fmt.Errorf("failed to create directory %q: %s", dir, err)
	}

	if err := write(filepath.Join(dir, dbEndpoint), db.DB, gzip); err != nil {
		return err
	}

	if err := write(filepath.Join(dir, modulesEndpoint), db.Modules, gzip); err != nil {
		return err
	}

	return write(filepath.Join(dir, vulnsEndpoint), db.Vulns, gzip)
}

func (db *Database) writeEntries(dir string, gzip bool) error {
	if err := os.MkdirAll(dir, 0755); err != nil {
		return fmt.Errorf("failed to create directory %q: %s", dir, err)
	}

	for _, entry := range db.Entries {
		if err := write(filepath.Join(dir, entry.ID+".json"), entry, gzip); err != nil {
			return err
		}
	}
	return nil
}

func write(filename string, v any, gzip bool) error {
	b, err := json.Marshal(v)
	if err != nil {
		return err
	}

	// Write standard.
	if err := os.WriteFile(filename, b, 0644); err != nil {
		return err
	}

	if gzip {
		return writeGzipped(filename+".gz", b)
	}

	return nil
}
