package utils_test

import (
	"testing"

	"github.com/stretchr/testify/assert"
	"penahub.gitlab.yandexcloud.net/pena-services/customer/internal/models"
	"penahub.gitlab.yandexcloud.net/pena-services/customer/internal/utils"
)

func TestValidateGetPaymentLinkBody(t *testing.T) {
	t.Run("Валидация объекта запроса для получения платёжной ссылки по банковской карточке (Успешно)", func(t *testing.T) {
		assert.NoError(t, utils.ValidateGetPaymentLinkBody(&models.GetPaymentLinkBody{
			Type:     models.PaymentTypeBankCard,
			Currency: "RUB",
			Amount:   10050,
			BankCard: &models.BankCard{
				Number:      "5315 5310 5310 5011",
				ExpiryYear:  "2021",
				ExpiryMonth: "05",
			},
		}))
	})

	t.Run("Валидация объекта запроса для получения платёжной ссылки по банковской карточке (Не успешно)", func(t *testing.T) {
		assert.Error(t, utils.ValidateGetPaymentLinkBody(&models.GetPaymentLinkBody{
			Type:     models.PaymentTypeBankCard,
			Currency: "RUB",
			Amount:   10050,
		}))
		assert.Error(t, utils.ValidateGetPaymentLinkBody(&models.GetPaymentLinkBody{
			Type:     models.PaymentTypeBankCard,
			Currency: "RUB",
			Amount:   10050,
			BankCard: &models.BankCard{
				Number:     "5315 5310 5310 5011",
				ExpiryYear: "2021",
			},
		}))
		assert.Error(t, utils.ValidateGetPaymentLinkBody(&models.GetPaymentLinkBody{
			Type:     models.PaymentTypeBankCard,
			Currency: "RUB",
			Amount:   10050,
			BankCard: &models.BankCard{
				Number:      "5315 5310 5310 5011",
				ExpiryMonth: "05",
			},
		}))
		assert.Error(t, utils.ValidateGetPaymentLinkBody(&models.GetPaymentLinkBody{
			Type:     models.PaymentTypeBankCard,
			Currency: "RUB",
			Amount:   10050,
			BankCard: &models.BankCard{
				ExpiryYear:  "2021",
				ExpiryMonth: "05",
			},
		}))
	})

	t.Run("Валидация объекта запроса для получения платёжной ссылки через yoomoney (Успешно)", func(t *testing.T) {
		assert.NoError(t, utils.ValidateGetPaymentLinkBody(&models.GetPaymentLinkBody{
			Type:     models.PaymentTypeYoomoney,
			Currency: "USD",
			Amount:   10050,
		}))
	})

	t.Run("Валидация объекта запроса для получения платёжной ссылки через yoomoney (Успешно)", func(t *testing.T) {
		assert.NoError(t, utils.ValidateGetPaymentLinkBody(&models.GetPaymentLinkBody{
			Type:     models.PaymentTypeYoomoney,
			Currency: "USD",
			Amount:   10050,
		}))
	})

	t.Run("Валидация объекта запроса для получения платёжной ссылки через qiwi (Успешно)", func(t *testing.T) {
		assert.NoError(t, utils.ValidateGetPaymentLinkBody(&models.GetPaymentLinkBody{
			Type:        models.PaymentTypeQiwi,
			Currency:    "USD",
			Amount:      10050,
			PhoneNumber: "79000000000",
		}))
	})

	t.Run("Валидация объекта запроса для получения платёжной ссылки через qiwi (Не успешно)", func(t *testing.T) {
		assert.Error(t, utils.ValidateGetPaymentLinkBody(&models.GetPaymentLinkBody{
			Type:     models.PaymentTypeQiwi,
			Currency: "USD",
			Amount:   10050,
		}))
	})

	t.Run("Валидация объекта запроса для получения платёжной ссылки через sberpay (Успешно)", func(t *testing.T) {
		assert.NoError(t, utils.ValidateGetPaymentLinkBody(&models.GetPaymentLinkBody{
			Type:        models.PaymentTypeSberPay,
			Currency:    "USD",
			Amount:      10050,
			PhoneNumber: "79000000000",
		}))
	})

	t.Run("Валидация объекта запроса для получения платёжной ссылки через sberpay (Не успешно)", func(t *testing.T) {
		assert.Error(t, utils.ValidateGetPaymentLinkBody(&models.GetPaymentLinkBody{
			Type:     models.PaymentTypeSberPay,
			Currency: "USD",
			Amount:   10050,
		}))
	})

	t.Run("Валидация объекта запроса для получения платёжной ссылки через alfaclick (Успешно)", func(t *testing.T) {
		assert.NoError(t, utils.ValidateGetPaymentLinkBody(&models.GetPaymentLinkBody{
			Type:     models.PaymentTypeAlfabank,
			Currency: "USD",
			Amount:   10050,
			Login:    "login_test",
		}))
	})

	t.Run("Валидация объекта запроса для получения платёжной ссылки через alfaclick (Не успешно)", func(t *testing.T) {
		assert.Error(t, utils.ValidateGetPaymentLinkBody(&models.GetPaymentLinkBody{
			Type:     models.PaymentTypeAlfabank,
			Currency: "BYN",
			Amount:   10050,
		}))
	})

	t.Run("Валидация объекта запроса для получения платёжной ссылки через sbp (Успешно)", func(t *testing.T) {
		assert.NoError(t, utils.ValidateGetPaymentLinkBody(&models.GetPaymentLinkBody{
			Type:     models.PaymentTypeSBP,
			Currency: "USD",
			Amount:   10050,
		}))
	})

	t.Run("Валидация объекта запроса для получения платёжной ссылки через tinkoff (Успешно)", func(t *testing.T) {
		assert.NoError(t, utils.ValidateGetPaymentLinkBody(&models.GetPaymentLinkBody{
			Type:     models.PaymentTypeTinkoff,
			Currency: "USD",
			Amount:   10050,
		}))
	})

	t.Run("Валидация объекта запроса для получения платёжной ссылки через мобильный (Успешно)", func(t *testing.T) {
		assert.NoError(t, utils.ValidateGetPaymentLinkBody(&models.GetPaymentLinkBody{
			Type:        models.PaymentTypeMobile,
			Currency:    "USD",
			Amount:      10050,
			PhoneNumber: "79000000000",
		}))
	})

	t.Run("Валидация объекта запроса для получения платёжной ссылки через мобильный (Не успешно)", func(t *testing.T) {
		assert.Error(t, utils.ValidateGetPaymentLinkBody(&models.GetPaymentLinkBody{
			Type:     models.PaymentTypeMobile,
			Currency: "USD",
			Amount:   10050,
		}))
	})

	t.Run("Валидация объекта запроса для получения платёжной ссылки через наличные (Успешно)", func(t *testing.T) {
		assert.NoError(t, utils.ValidateGetPaymentLinkBody(&models.GetPaymentLinkBody{
			Type:        models.PaymentTypeCash,
			Currency:    "USD",
			Amount:      10050,
			PhoneNumber: "79000000000",
		}))
	})

	t.Run("Валидация объекта запроса для получения платёжной ссылки через наличные (Не успешно)", func(t *testing.T) {
		assert.Error(t, utils.ValidateGetPaymentLinkBody(&models.GetPaymentLinkBody{
			Type:     models.PaymentTypeCash,
			Currency: "USD",
			Amount:   10050,
		}))
	})

	t.Run("Валидация объекта запроса для получения платёжной ссылки через оплату по частям (Успешно)", func(t *testing.T) {
		assert.NoError(t, utils.ValidateGetPaymentLinkBody(&models.GetPaymentLinkBody{
			Type:     models.PaymentTypeInstallments,
			Currency: "USD",
			Amount:   10050,
		}))
	})

	t.Run("Не успешная валидация из-за неопределённого типа оплаты", func(t *testing.T) {
		assert.Error(t, utils.ValidateGetPaymentLinkBody(&models.GetPaymentLinkBody{
			Type:     "some_radmon_payment_type",
			Currency: "USD",
			Amount:   10050,
		}))
	})
}
