Imports Newtonsoft.Json
Imports Newtonsoft.Json.Converters

Public Class AuthRequest
    Inherits RequestBaseExtend

    ''' <summary>
    ''' İşlemin döviz kodunu belirtir.
    ''' Desteklenen döviz kodları: TRY, RUB, AED, JPY, SAR, GBP, USD, EUR
    ''' </summary>
    <JsonConverter(GetType(StringEnumConverter))>
    Public Property Currency As CurrencyTypes = CurrencyTypes.TRY

    ''' <summary>
    ''' Taksit bilgisi, tek çekim için 1 gönderilmelidir.
    ''' </summary>
    Public Property InstallmentCount As Integer = 1

    ''' <summary>
    ''' Standart değeri false olarak değerlendirilmektedir.
    ''' </summary>
    Public Property MotoInd As Boolean = False

    ''' <summary>
    ''' Ödeme grubu, varsayılan PRODUCT. 
    ''' Geçerli değerler enum içinde sunulmaktadır.
    ''' </summary>
    <JsonConverter(GetType(StringEnumConverter))>
    Public Property PaymentGroup As PaymentGroups = PaymentGroups.PRODUCT

    ''' <summary>
    ''' Ödeme kanalı. Geçerli değerler enum içinde sunulmaktadır.
    ''' </summary>
    <JsonConverter(GetType(StringEnumConverter))>
    Public Property PaymentChannel As PaymentChannels

    ''' <summary>
    ''' 
    ''' </summary>
    Public Property SubType As String

    ''' <summary>
    ''' İşlem yapılan kart bilgilerinin tutulduğu objedir.
    ''' </summary>
    Public Property Card As RequestCardBase

    ''' <summary>
    ''' Fatura adresi bilgilerinin tutulduğu objedir.
    ''' </summary>
    Public Property BillingAddress As RequestAddressBase

    ''' <summary>
    ''' Kargo adresi bilgilerinin tutulduğu objedir.
    ''' </summary>
    Public Property ShippingAddress As RequestAddressBase

    ''' <summary>
    ''' Üye işyeri tarafında işlem yapan kullanıcıya ait bilgilerin tutulduğu objedir.
    ''' </summary>
    Public Property Buyer As RequestBuyerBase

    ''' <summary>
    ''' Sepetteki ürünlerin bilgilerini barındıran objedir.
    ''' </summary>
    Public Property Basket As RequestBasketBase

    Public Overrides Function Validate() As ValidationResult
        Dim errors As New HashSet(Of String)()

        If String.IsNullOrEmpty(OrderId) Then
            errors.Add("OrderId alanı boş veya null olamaz.")
        End If

        If Amount <= 0 Then
            errors.Add("Amount alanı 0'dan büyük olmalıdır.")
        End If

        If Basket Is Nothing OrElse Basket.BasketItems Is Nothing OrElse Basket.BasketItems.Count <= 0 OrElse Basket.BasketItems.Sum(Function(m) m.TotalPrice) <> Amount Then
            errors.Add("Sepet bilgilerini kontrol ediniz.")
        End If

        If Card Is Nothing Then
            errors.Add("Card objesi null olmamalıdır.")
        Else
            If String.IsNullOrEmpty(Card.HolderName) Then
                errors.Add("Kart sahibinin ad soyad alanı zorunludur.")
            End If

            If Card.ExpireMonth = 0 OrElse Card.ExpireYear = 0 Then
                errors.Add("Kart son kullanma tarihi alanları zorunludur.")
            End If

            If String.IsNullOrEmpty(Card.Number) Then
                errors.Add("Kart numarası alanı zorunludur.")
            End If
        End If

        If errors IsNot Nothing AndAlso errors.Count > 0 Then
            Return ValidationResult.Failed(errors.ToArray())
        End If

        Return ValidationResult.Success
    End Function
End Class