package disk

import (
	"io/fs"
	"log/slog"
	"os"
	"time"
)

type osDisk struct {
	logger *slog.Logger
}

// Default returns a new instance of the defaultDisk type, which implements
// the Disk interface. This is the default implementation for file operations
// using the standard os package.
func Default() Disk {
	return &osDisk{logger: slog.Default()}
}

// Create implements Disk.
func (d *osDisk) Create(name string) (File, error) {
	ts := time.Now()
	file, err := os.Create(name)
	el := time.Now().Sub(ts).String()
	d.logger.Debug("(io) disk.Create", "duration", el)
	return file, err
}

// Mkdir implements Disk.
func (d *osDisk) Mkdir(name string, perm fs.FileMode) error {
	ts := time.Now()
	err := os.Mkdir(name, perm)
	el := time.Now().Sub(ts).String()
	d.logger.Debug("(io) disk.Mkdir", "duration", el)
	return err
}

// Open implements Disk.
func (d *osDisk) Open(name string) (File, error) {
	ts := time.Now()
	file, err := os.Open(name)
	el := time.Now().Sub(ts).String()
	d.logger.Debug("(io) disk.Open", "duration", el)
	return file, err
}

// Remove implements Disk.
func (d *osDisk) Remove(name string) error {
	ts := time.Now()
	err := os.Remove(name)
	el := time.Now().Sub(ts).String()
	d.logger.Debug("(io) disk.Remove", "duration", el)
	return err
}

// Stat implements Disk.
func (d *osDisk) Stat(name string) (fs.FileInfo, error) {
	ts := time.Now()
	info, err := os.Stat(name)
	el := time.Now().Sub(ts).String()
	d.logger.Debug("(io) disk.Stat", "duration", el)
	return info, err
}