// This Source Code Form is subject to the terms of the Mozilla Public
// License, v. 2.0. If a copy of the MPL was not distributed with this
// file, You can obtain one at http://mozilla.org/MPL/2.0/.

package makefs

import (
	"fmt"

	"github.com/siderolabs/go-cmd/pkg/cmd"
)

const (
	// FilesystemTypeXFS is the filesystem type for XFS.
	FilesystemTypeXFS = "xfs"
)

// XFSGrow expands a XFS filesystem to the maximum possible. The partition
// MUST be mounted, or this will fail.
func XFSGrow(partname string) error {
	_, err := cmd.Run("xfs_growfs", "-d", partname)

	return err
}

// XFSRepair repairs a XFS filesystem on the specified partition.
func XFSRepair(partname, fsType string) error {
	if fsType != FilesystemTypeXFS {
		return fmt.Errorf("unsupported filesystem type: %s", fsType)
	}

	_, err := cmd.Run("xfs_repair", partname)

	return err
}

// XFS creates a XFS filesystem on the specified partition.
func XFS(partname string, setters ...Option) error {
	if partname == "" {
		return fmt.Errorf("missing path to disk")
	}

	opts := NewDefaultOptions(setters...)

	// The ftype=1 naming option is required by overlayfs.
	// The bigtime=1 metadata option enables timestamps beyond 2038.
	args := []string{"-n", "ftype=1", "-m", "bigtime=1"}

	if opts.Force {
		args = append(args, "-f")
	}

	if opts.Label != "" {
		args = append(args, "-L", opts.Label)
	}

	args = append(args, partname)

	_, err := cmd.Run("mkfs.xfs", args...)

	return err
}
