package model

import (
	"time"

	"github.com/tech/sendico/pkg/db/storable"
)

type TreasuryOperationType string

const (
	TreasuryOperationFund     TreasuryOperationType = "fund"
	TreasuryOperationWithdraw TreasuryOperationType = "withdraw"
)

type TreasuryRequestStatus string

const (
	TreasuryRequestStatusCreated   TreasuryRequestStatus = "created"
	TreasuryRequestStatusConfirmed TreasuryRequestStatus = "confirmed"
	TreasuryRequestStatusScheduled TreasuryRequestStatus = "scheduled"
	TreasuryRequestStatusExecuted  TreasuryRequestStatus = "executed"
	TreasuryRequestStatusCancelled TreasuryRequestStatus = "cancelled"
	TreasuryRequestStatusFailed    TreasuryRequestStatus = "failed"
)

type TreasuryRequest struct {
	storable.Base `bson:",inline" json:",inline"`

	RequestID         string                `bson:"requestId,omitempty" json:"request_id,omitempty"`
	OperationType     TreasuryOperationType `bson:"operationType,omitempty" json:"operation_type,omitempty"`
	TelegramUserID    string                `bson:"telegramUserId,omitempty" json:"telegram_user_id,omitempty"`
	LedgerAccountID   string                `bson:"ledgerAccountId,omitempty" json:"ledger_account_id,omitempty"`
	LedgerAccountCode string                `bson:"ledgerAccountCode,omitempty" json:"ledger_account_code,omitempty"`
	OrganizationRef   string                `bson:"organizationRef,omitempty" json:"organization_ref,omitempty"`
	ChatID            string                `bson:"chatId,omitempty" json:"chat_id,omitempty"`
	Amount            string                `bson:"amount,omitempty" json:"amount,omitempty"`
	Currency          string                `bson:"currency,omitempty" json:"currency,omitempty"`
	Status            TreasuryRequestStatus `bson:"status,omitempty" json:"status,omitempty"`

	ConfirmedAt time.Time `bson:"confirmedAt,omitempty" json:"confirmed_at,omitempty"`
	ScheduledAt time.Time `bson:"scheduledAt,omitempty" json:"scheduled_at,omitempty"`
	ExecutedAt  time.Time `bson:"executedAt,omitempty" json:"executed_at,omitempty"`
	CancelledAt time.Time `bson:"cancelledAt,omitempty" json:"cancelled_at,omitempty"`

	IdempotencyKey  string `bson:"idempotencyKey,omitempty" json:"idempotency_key,omitempty"`
	LedgerReference string `bson:"ledgerReference,omitempty" json:"ledger_reference,omitempty"`
	ErrorMessage    string `bson:"errorMessage,omitempty" json:"error_message,omitempty"`

	Active bool `bson:"active,omitempty" json:"active,omitempty"`
}

type TreasuryTelegramUser struct {
	storable.Base `bson:",inline" json:",inline"`

	TelegramUserID  string   `bson:"telegramUserId,omitempty" json:"telegram_user_id,omitempty"`
	LedgerAccountID string   `bson:"ledgerAccountId,omitempty" json:"ledger_account_id,omitempty"`
	AllowedChatIDs  []string `bson:"allowedChatIds,omitempty" json:"allowed_chat_ids,omitempty"`
}
