package cache

import (
	"os"
	"testing"
	"time"

	"github.com/tidbcloud/aws-shared-provider/tools/cloud-instances/types"
)

func TestSaveLoadUnified(t *testing.T) {
	tmp := t.TempDir()
	mgr := NewManager(tmp)

	data := types.NewUnifiedData("aws")
	data.Instances["us-east-1"] = []types.UnifiedInstance{{
		Provider:     "aws",
		InstanceType: "t3.micro",
		VCPU:         "2",
		Memory:       "1 GiB",
		Price:        0.01,
		Region:       "us-east-1",
	}}

	if err := mgr.SaveToCache(data, "aws", "us-east-1"); err != nil {
		t.Fatalf("save unified: %v", err)
	}

	loaded, err := mgr.LoadFromCache("aws", "us-east-1")
	if err != nil {
		t.Fatalf("load unified: %v", err)
	}

	if loaded.Provider != "aws" {
		t.Fatalf("unexpected provider: %s", loaded.Provider)
	}
	if len(loaded.Instances["us-east-1"]) != 1 {
		t.Fatalf("unexpected instance count")
	}
}

func TestSaveLoadRaw(t *testing.T) {
	tmp := t.TempDir()
	mgr := NewManager(tmp)

	payload := []byte(`{"ok":true}`)
	if err := mgr.SaveRaw("azure", "eastus", "pricing", payload); err != nil {
		t.Fatalf("save raw: %v", err)
	}

	data, err := mgr.LoadRaw("azure", "eastus", "pricing")
	if err != nil {
		t.Fatalf("load raw: %v", err)
	}
	if string(data) != string(payload) {
		t.Fatalf("raw payload mismatch")
	}

	path := mgr.getRawFilePath("azure", "eastus", "pricing")
	info, err := os.Stat(path)
	if err != nil {
		t.Fatalf("stat raw: %v", err)
	}
	if info.Mode().Perm() != 0600 {
		t.Fatalf("expected 0600 perms, got %v", info.Mode().Perm())
	}
}

func TestIsCacheValid(t *testing.T) {
	tmp := t.TempDir()
	mgr := NewManager(tmp)

	path := mgr.getRawFilePath("aws", "us-east-1", "manifest")
	if err := os.MkdirAll(mgr.rawDir()+"/aws/us-east-1", 0700); err != nil {
		t.Fatalf("mkdir: %v", err)
	}
	if err := os.WriteFile(path, []byte("{}"), 0600); err != nil {
		t.Fatalf("write: %v", err)
	}

	old := time.Now().Add(-2 * time.Hour)
	if err := os.Chtimes(path, old, old); err != nil {
		t.Fatalf("chtimes: %v", err)
	}

	if mgr.IsCacheValid(path, 30*time.Minute) {
		t.Fatalf("expected cache to be invalid")
	}
	if !mgr.IsCacheValid(path, 3*time.Hour) {
		t.Fatalf("expected cache to be valid")
	}
}
