package models_test

import (
	"testing"

	"github.com/pocketbase/pocketbase/models"
)

func TestBaseModelHasId(t *testing.T) {
	scenarios := []struct {
		model    models.BaseModel
		expected bool
	}{
		{
			models.BaseModel{},
			false,
		},
		{
			models.BaseModel{Id: ""},
			false,
		},
		{
			models.BaseModel{Id: "abc"},
			true,
		},
	}

	for i, s := range scenarios {
		result := s.model.HasId()
		if result != s.expected {
			t.Errorf("(%d) Expected %v, got %v", i, s.expected, result)
		}
	}
}

func TestBaseModelId(t *testing.T) {
	m := models.BaseModel{}

	if m.GetId() != "" {
		t.Fatalf("Expected empty id value, got %v", m.GetId())
	}

	m.SetId("test")

	if m.GetId() != "test" {
		t.Fatalf("Expected %q id, got %v", "test", m.GetId())
	}

	m.RefreshId()

	if len(m.GetId()) != 15 {
		t.Fatalf("Expected 15 chars id, got %v", m.GetId())
	}
}

func TestBaseModelIsNew(t *testing.T) {
	m0 := models.BaseModel{}
	m1 := models.BaseModel{Id: ""}
	m2 := models.BaseModel{Id: "test"}
	m3 := models.BaseModel{}
	m3.MarkAsNotNew()
	m4 := models.BaseModel{Id: "test"}
	m4.MarkAsNotNew()
	m5 := models.BaseModel{Id: "test"}
	m5.MarkAsNew()
	m5.MarkAsNotNew()
	m6 := models.BaseModel{}
	m6.RefreshId()
	m7 := models.BaseModel{}
	m7.MarkAsNotNew()
	m7.RefreshId()
	m8 := models.BaseModel{}
	m8.PostScan()

	scenarios := []struct {
		model    models.BaseModel
		expected bool
	}{
		{m0, true},
		{m1, true},
		{m2, true},
		{m3, false},
		{m4, false},
		{m5, false},
		{m6, true},
		{m7, false},
		{m8, false},
	}

	for i, s := range scenarios {
		result := s.model.IsNew()
		if result != s.expected {
			t.Errorf("(%d) Expected IsNew %v, got %v", i, s.expected, result)
		}
	}
}

func TestBaseModelCreated(t *testing.T) {
	m := models.BaseModel{}

	if !m.GetCreated().IsZero() {
		t.Fatalf("Expected zero datetime, got %v", m.GetCreated())
	}

	m.RefreshCreated()

	if m.GetCreated().IsZero() {
		t.Fatalf("Expected non-zero datetime, got %v", m.GetCreated())
	}
}

func TestBaseModelUpdated(t *testing.T) {
	m := models.BaseModel{}

	if !m.GetUpdated().IsZero() {
		t.Fatalf("Expected zero datetime, got %v", m.GetUpdated())
	}

	m.RefreshUpdated()

	if m.GetUpdated().IsZero() {
		t.Fatalf("Expected non-zero datetime, got %v", m.GetUpdated())
	}
}