package models

import (
	"apskel-pos-be/internal/constants"
	"time"

	"github.com/google/uuid"
)

type PaymentMethod struct {
	ID             uuid.UUID
	OrganizationID uuid.UUID
	Name           string
	Type           constants.PaymentMethodType
	Processor      *string
	Configuration  map[string]interface{}
	IsActive       bool
	CreatedAt      time.Time
	UpdatedAt      time.Time
}

type CreatePaymentMethodRequest struct {
	OrganizationID uuid.UUID                   `validate:"required"`
	OutletID       uuid.UUID                   `validate:"required"`
	Name           string                      `validate:"required,min=1,max=100"`
	Type           constants.PaymentMethodType `validate:"required"`
	Processor      *string                     `validate:"omitempty,max=100"`
	Configuration  map[string]interface{}      `validate:"omitempty"`
	IsActive       *bool                       `validate:"omitempty"`
}

type UpdatePaymentMethodRequest struct {
	Name          *string                      `validate:"omitempty,min=1,max=100"`
	Type          *constants.PaymentMethodType `validate:"omitempty"`
	Processor     *string                      `validate:"omitempty,max=100"`
	Configuration map[string]interface{}       `validate:"omitempty"`
	IsActive      *bool                        `validate:"omitempty"`
}

type PaymentMethodResponse struct {
	ID             uuid.UUID
	OrganizationID uuid.UUID
	Name           string
	Type           constants.PaymentMethodType
	Processor      *string
	Configuration  map[string]interface{}
	IsActive       bool
	CreatedAt      time.Time
	UpdatedAt      time.Time
}

type ListPaymentMethodsRequest struct {
	OrganizationID *uuid.UUID
	Type           *constants.PaymentMethodType
	IsActive       *bool
	Search         string
	Page           int `validate:"min=1"`
	Limit          int `validate:"min=1,max=100"`
}

type ListPaymentMethodsResponse struct {
	PaymentMethods []PaymentMethodResponse
	TotalCount     int
	Page           int
	Limit          int
	TotalPages     int
}

func (pm *PaymentMethod) IsDigital() bool {
	return pm.Type == constants.PaymentMethodTypeCard ||
		pm.Type == constants.PaymentMethodTypeDigitalWallet ||
		pm.Type == constants.PaymentMethodTypeEDC ||
		pm.Type == constants.PaymentMethodTypeQR
}

func (pm *PaymentMethod) RequiresProcessor() bool {
	return pm.IsDigital() && pm.Processor != nil
}
