package thumb

import (
	"fmt"
	"image"
	"image/jpeg"
	"os"
	"testing"

	"github.com/cloudreve/Cloudreve/v3/pkg/cache"
	"github.com/cloudreve/Cloudreve/v3/pkg/util"
	"github.com/stretchr/testify/assert"
)

func CreateTestImage() *os.File {
	file, err := os.Create("TestNewThumbFromFile.jpeg")
	alpha := image.NewAlpha(image.Rect(0, 0, 500, 200))
	jpeg.Encode(file, alpha, nil)
	if err != nil {
		fmt.Println(err)
	}
	_, _ = file.Seek(0, 0)
	return file
}

func TestNewThumbFromFile(t *testing.T) {
	asserts := assert.New(t)
	file := CreateTestImage()
	defer file.Close()

	// 无扩展名时
	{
		thumb, err := NewThumbFromFile(file, "123")
		asserts.Error(err)
		asserts.Nil(thumb)
	}

	{
		thumb, err := NewThumbFromFile(file, "123.jpg")
		asserts.NoError(err)
		asserts.NotNil(thumb)
	}
	{
		thumb, err := NewThumbFromFile(file, "123.jpeg")
		asserts.Error(err)
		asserts.Nil(thumb)
	}
	{
		thumb, err := NewThumbFromFile(file, "123.png")
		asserts.Error(err)
		asserts.Nil(thumb)
	}
	{
		thumb, err := NewThumbFromFile(file, "123.gif")
		asserts.Error(err)
		asserts.Nil(thumb)
	}
	{
		thumb, err := NewThumbFromFile(file, "123.3211")
		asserts.Error(err)
		asserts.Nil(thumb)
	}
}

func TestThumb_GetSize(t *testing.T) {
	asserts := assert.New(t)
	file := CreateTestImage()
	defer file.Close()
	thumb, err := NewThumbFromFile(file, "123.jpg")
	asserts.NoError(err)

	w, h := thumb.GetSize()
	asserts.Equal(500, w)
	asserts.Equal(200, h)
}

func TestThumb_GetThumb(t *testing.T) {
	asserts := assert.New(t)
	file := CreateTestImage()
	defer file.Close()
	thumb, err := NewThumbFromFile(file, "123.jpg")
	asserts.NoError(err)

	asserts.NotPanics(func() {
		thumb.GetThumb(10, 10)
	})
}

func TestThumb_Thumbnail(t *testing.T) {
	asserts := assert.New(t)
	{
		img := image.NewRGBA(image.Rect(0, 0, 500, 200))
		thumb := Thumbnail(100, 100, img)
		asserts.Equal(thumb.Bounds(), image.Rect(0, 0, 100, 40))
	}
	{
		img := image.NewRGBA(image.Rect(0, 0, 200, 200))
		thumb := Thumbnail(100, 100, img)
		asserts.Equal(thumb.Bounds(), image.Rect(0, 0, 100, 100))
	}
	{
		img := image.NewRGBA(image.Rect(0, 0, 500, 500))
		thumb := Thumbnail(100, 100, img)
		asserts.Equal(thumb.Bounds(), image.Rect(0, 0, 100, 100))
	}
	{
		img := image.NewRGBA(image.Rect(0, 0, 200, 500))
		thumb := Thumbnail(100, 100, img)
		asserts.Equal(thumb.Bounds(), image.Rect(0, 0, 40, 100))
	}
}

func TestThumb_Save(t *testing.T) {
	asserts := assert.New(t)
	file := CreateTestImage()
	defer file.Close()
	thumb, err := NewThumbFromFile(file, "123.jpg")
	asserts.NoError(err)

	err = thumb.Save("/:noteexist/")
	asserts.Error(err)

	err = thumb.Save("TestThumb_Save.png")
	asserts.NoError(err)
	asserts.True(util.Exists("TestThumb_Save.png"))

}

func TestThumb_CreateAvatar(t *testing.T) {
	asserts := assert.New(t)
	file := CreateTestImage()
	defer file.Close()

	thumb, err := NewThumbFromFile(file, "123.jpg")
	asserts.NoError(err)

	cache.Set("setting_avatar_path", "tests", 0)
	cache.Set("setting_avatar_size_s", "50", 0)
	cache.Set("setting_avatar_size_m", "130", 0)
	cache.Set("setting_avatar_size_l", "200", 0)

	asserts.NoError(thumb.CreateAvatar(1))
	asserts.True(util.Exists(util.RelativePath("tests/avatar_1_1.png")))
	asserts.True(util.Exists(util.RelativePath("tests/avatar_1_2.png")))
	asserts.True(util.Exists(util.RelativePath("tests/avatar_1_0.png")))
}