package model

import (
	"time"

	"github.com/tech/sendico/pkg/db/storable"
	"github.com/tech/sendico/pkg/model"
	paymenttypes "github.com/tech/sendico/pkg/payments/types"
)

type PaymentStatus string

const (
	PaymentStatusCreated    PaymentStatus = "created"    // created
	PaymentStatusProcessing PaymentStatus = "processing" // processing
	PaymentStatusWaiting    PaymentStatus = "waiting"    // waiting external action
	PaymentStatusSuccess    PaymentStatus = "success"    // final success
	PaymentStatusFailed     PaymentStatus = "failed"     // final failure
	PaymentStatusCancelled  PaymentStatus = "cancelled"  // cancelled final
)

type PaymentRecord struct {
	storable.Base              `bson:",inline" json:",inline"`
	OperationRef               string              `bson:"operationRef,omitempty" json:"operation_ref,omitempty"`
	IdempotencyKey             string              `bson:"idempotencyKey,omitempty" json:"idempotency_key,omitempty"`
	ConfirmationRef            string              `bson:"confirmationRef,omitempty" json:"confirmation_ref,omitempty"`
	ConfirmationMessageID      string              `bson:"confirmationMessageId,omitempty" json:"confirmation_message_id,omitempty"`
	ConfirmationReplyMessageID string              `bson:"confirmationReplyMessageId,omitempty" json:"confirmation_reply_message_id,omitempty"`
	PaymentIntentID            string              `bson:"paymentIntentId,omitempty" json:"payment_intent_id,omitempty"`
	QuoteRef                   string              `bson:"quoteRef,omitempty" json:"quote_ref,omitempty"`
	IntentRef                  string              `bson:"intentRef,omitempty" json:"intent_ref,omitempty"`
	PaymentRef                 string              `bson:"paymentRef,omitempty" json:"payment_ref,omitempty"`
	OutgoingLeg                string              `bson:"outgoingLeg,omitempty" json:"outgoing_leg,omitempty"`
	TargetChatID               string              `bson:"targetChatId,omitempty" json:"target_chat_id,omitempty"`
	RequestedMoney             *paymenttypes.Money `bson:"requestedMoney,omitempty" json:"requested_money,omitempty"`
	ExecutedMoney              *paymenttypes.Money `bson:"executedMoney,omitempty" json:"executed_money,omitempty"`
	Status                     PaymentStatus       `bson:"status,omitempty" json:"status,omitempty"`
	FailureReason              string              `bson:"failureReason,omitempty" json:"Failure_reason,omitempty"`
	ExecutedAt                 time.Time           `bson:"executedAt,omitempty" json:"executed_at,omitempty"`
	ExpiresAt                  time.Time           `bson:"expiresAt,omitempty" json:"expires_at,omitempty"`
	ExpiredAt                  time.Time           `bson:"expiredAt,omitempty" json:"expired_at,omitempty"`
}

type TelegramConfirmation struct {
	storable.Base   `bson:",inline" json:",inline"`
	RequestID       string                 `bson:"requestId,omitempty" json:"request_id,omitempty"`
	PaymentIntentID string                 `bson:"paymentIntentId,omitempty" json:"payment_intent_id,omitempty"`
	QuoteRef        string                 `bson:"quoteRef,omitempty" json:"quote_ref,omitempty"`
	RawReply        *model.TelegramMessage `bson:"rawReply,omitempty" json:"raw_reply,omitempty"`
	ReceivedAt      time.Time              `bson:"receivedAt,omitempty" json:"received_at,omitempty"`
}

type PendingConfirmation struct {
	storable.Base   `bson:",inline" json:",inline"`
	RequestID       string              `bson:"requestId,omitempty" json:"request_id,omitempty"`
	MessageID       string              `bson:"messageId,omitempty" json:"message_id,omitempty"`
	TargetChatID    string              `bson:"targetChatId,omitempty" json:"target_chat_id,omitempty"`
	AcceptedUserIDs []string            `bson:"acceptedUserIds,omitempty" json:"accepted_user_ids,omitempty"`
	RequestedMoney  *paymenttypes.Money `bson:"requestedMoney,omitempty" json:"requested_money,omitempty"`
	SourceService   string              `bson:"sourceService,omitempty" json:"source_service,omitempty"`
	Rail            string              `bson:"rail,omitempty" json:"rail,omitempty"`
	Clarified       bool                `bson:"clarified,omitempty" json:"clarified,omitempty"`
	ExpiresAt       time.Time           `bson:"expiresAt,omitempty" json:"expires_at,omitempty"`
}
