package main_test

import (
	"strings"
	"testing"

	"github.com/kataras/iris/v12"
	"github.com/kataras/iris/v12/httptest"
)

const (
	female = iota + 1
	male
)

func TestI18nPlurals(t *testing.T) {
	handler := func(ctx iris.Context) {
		tr(ctx, "Classic")

		tr(ctx, "YouLate", 1)
		tr(ctx, "YouLate", 2)

		tr(ctx, "FreeDay", 1)
		tr(ctx, "FreeDay", 5)

		tr(ctx, "FreeDay", 3, 15)

		tr(ctx, "HeIsHome", "Peter")

		tr(ctx, "HouseCount", female, 2, "Maria")
		tr(ctx, "HouseCount", male, 1, "Peter")

		tr(ctx, "nav.home")
		tr(ctx, "nav.user")
		tr(ctx, "nav.more.what")
		tr(ctx, "nav.more.even.more")
		tr(ctx, "nav.more.even.aplural", 1)
		tr(ctx, "nav.more.even.aplural", 15)

		tr(ctx, "VarTemplate", iris.Map{
			"Name":        "Peter",
			"GenderCount": male,
		})

		tr(ctx, "VarTemplatePlural", 1, female)
		tr(ctx, "VarTemplatePlural", 2, female, 1)
		tr(ctx, "VarTemplatePlural", 2, female, 5)
		tr(ctx, "VarTemplatePlural", 1, male)
		tr(ctx, "VarTemplatePlural", 2, male, 1)
		tr(ctx, "VarTemplatePlural", 2, male, 2)

		tr(ctx, "VarTemplatePlural", iris.Map{
			"PluralCount": 5,
			"Names":       []string{"Makis", "Peter"},
			"InlineJoin": func(arr []string) string {
				return strings.Join(arr, ", ")
			},
		})

		tr(ctx, "TemplatePlural", iris.Map{
			"PluralCount": 1,
			"Name":        "Peter",
		})
		tr(ctx, "TemplatePlural", iris.Map{
			"PluralCount": 5,
			"Names":       []string{"Makis", "Peter"},
			"InlineJoin": func(arr []string) string {
				return strings.Join(arr, ", ")
			},
		})
		tr(ctx, "VarTemplatePlural", 2, male, 4)

		tr(ctx, "TemplateVarTemplatePlural", iris.Map{
			"PluralCount": 3,
			"DogsCount":   5,
		})

		tr(ctx, "message.HostResult")

		tr(ctx, "LocalVarsHouseCount.Text", 3, 4)
	}

	w := httptest.NewRecorder()
	r := httptest.NewRequest("GET", "/", nil)
	defer r.Body.Close()
	httptest.Do(w, r, handler, func(app *iris.Application) {
		err := app.I18n.Load("./locales/*/*", "en-US", "el-GR")
		if err != nil {
			panic(err)
		}
	})

	expected := `Classic=classic
YouLate=You are 1 minute late.
YouLate=You are 2 minutes late.
FreeDay=You have a day off
FreeDay=You have 5 free days
FreeDay=You have three days and 15 minutes off.
HeIsHome=Peter is home
HouseCount=She (Maria) has 2 houses
HouseCount=He (Peter) has 1 house
nav.home=Home
nav.user=Account
nav.more.what=this
nav.more.even.more=yes
nav.more.even.aplural=You are 1 minute late.
nav.more.even.aplural=You are 15 minutes late.
VarTemplate=(He) Peter is home
VarTemplatePlural=She is awesome
VarTemplatePlural=other (She) has 1 house
VarTemplatePlural=other (She) has 5 houses
VarTemplatePlural=He is awesome
VarTemplatePlural=other (He) has 1 house
VarTemplatePlural=other (He) has 2 houses
VarTemplatePlural=Makis, Peter are awesome
TemplatePlural=Peter is unique
TemplatePlural=Makis, Peter are awesome
VarTemplatePlural=other (He) has 4 houses
TemplateVarTemplatePlural=These 3 are wonderful, feeding 5 dogsssss in total!
message.HostResult=Store Encrypted Message Online
LocalVarsHouseCount.Text=She has 4 houses
`
	if got := w.Body.String(); expected != got {
		t.Fatalf("expected:\n'%s'\n\nbut got:\n'%s'", expected, got)
	}
}

func tr(ctx iris.Context, key string, args ...interface{}) {
	translation := ctx.Tr(key, args...)
	ctx.Writef("%s=%s\n", key, translation)
}