package filesystem

import (
	"encoding/json"
	"os"
	"testing"
	"time"
)

func TestCachedFile_Serialization(t *testing.T) {
	now := time.Now().Truncate(time.Second) // JSON marshal of time might lose precision
	cf := File{
		name:        "test.md",
		size:        123,
		mode:        0o644,
		modTime:     now,
		isDir:       false,
		contentType: "text/markdown",
		path:        "/test.md",
	}

	data, err := json.Marshal(cf)
	if err != nil {
		t.Fatalf("Marshal failed: %v", err)
	}

	var cf2 File
	if err := json.Unmarshal(data, &cf2); err != nil {
		t.Fatalf("Unmarshal failed: %v", err)
	}

	if cf.name != cf2.name {
		t.Errorf("Name mismatch: %s != %s", cf.name, cf2.name)
	}
	if cf.size != cf2.size {
		t.Errorf("Size mismatch: %d != %d", cf.size, cf2.size)
	}
	if cf.mode != cf2.mode {
		t.Errorf("Mode mismatch: %v != %v", cf.mode, cf2.mode)
	}
	if !cf.modTime.Equal(cf2.modTime) {
		t.Errorf("ModTime mismatch: %v != %v", cf.modTime, cf2.modTime)
	}
	if cf.isDir != cf2.isDir {
		t.Errorf("IsDir mismatch: %v != %v", cf.isDir, cf2.isDir)
	}
	if cf.contentType != cf2.contentType {
		t.Errorf("ContentType mismatch: %s != %s", cf.contentType, cf2.contentType)
	}
	if cf.path != cf2.path {
		t.Errorf("Path mismatch: %s != %s", cf.path, cf2.path)
	}
}

func TestCachedFile_Interface(t *testing.T) {
	// Verify CachedFile implements os.FileInfo
	var _ os.FileInfo = File{}
}
