using System;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using BTCPayServer.Client.Models;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure;
using NBitcoin;
namespace BTCPayServer.Data
{
public partial class PayoutData
{
[Key]
[MaxLength(30)]
public string Id { get; set; }
public DateTimeOffset Date { get; set; }
public string PullPaymentDataId { get; set; }
public string StoreDataId { get; set; }
///
/// The currency of the payout (eg. BTC)
///
public string Currency { get; set; }
///
/// The amount of the payout in Currency.
/// The Amount only get set when the payout is actually approved.
///
public decimal? Amount { get; set; }
///
/// The original currency of the payout (eg. USD)
///
public string OriginalCurrency { get; set; }
///
/// The amount of the payout in OriginalCurrency
///
public decimal OriginalAmount { get; set; }
public PullPaymentData PullPaymentData { get; set; }
[MaxLength(20)]
public PayoutState State { get; set; }
[MaxLength(20)]
[Required]
public string PayoutMethodId { get; set; }
public string Blob { get; set; }
public string Proof { get; set; }
#nullable enable
///
/// For example, BTC-CHAIN needs to ensure that only a single address is tied to an active payout.
/// If `PayoutBlob.Destination` is `bitcoin://1BvBMSeYstWetqTFn5Au4m4GFg7xJaNVN2?amount=0.1`
/// Then `DedupId` is `1BvBMSeYstWetqTFn5Au4m4GFg7xJaNVN2`
/// For Lightning, Destination could be the lightning address, BOLT11 or LNURL
/// But the `DedupId` would be the `PaymentHash`.
///
public string? DedupId { get; set; }
#nullable restore
public StoreData StoreData { get; set; }
internal static void OnModelCreating(ModelBuilder builder, DatabaseFacade databaseFacade)
{
builder.Entity()
.HasOne(o => o.PullPaymentData)
.WithMany(o => o.Payouts).OnDelete(DeleteBehavior.Cascade);
builder.Entity()
.HasOne(o => o.StoreData)
.WithMany(o => o.Payouts).OnDelete(DeleteBehavior.Cascade);
builder.Entity()
.Property(o => o.State)
.HasConversion();
builder.Entity()
.HasIndex(o => o.State);
builder.Entity()
.HasIndex(x => new { DestinationId = x.DedupId, x.State });
builder.Entity()
.Property(o => o.Blob)
.HasColumnType("jsonb");
builder.Entity()
.Property(o => o.Proof)
.HasColumnType("JSONB");
}
}
}