syntax = "proto3";

package payments.quotation.v2;

option go_package = "github.com/tech/sendico/pkg/proto/payments/quotation/v2;quotationv2";

import "google/protobuf/timestamp.proto";
import "api/proto/common/storable/v1/storable.proto";
import "api/proto/common/money/v1/money.proto";
import "api/proto/common/payment/v1/asset.proto";
import "api/proto/common/payment/v1/settlement.proto";
import "api/proto/billing/fees/v1/fees.proto";
import "api/proto/oracle/v1/oracle.proto";

// QuoteState tracks the lifecycle of a payment quote.
enum QuoteState {
  QUOTE_STATE_UNSPECIFIED = 0;
  QUOTE_STATE_INDICATIVE = 1;
  QUOTE_STATE_EXECUTABLE = 2;
  QUOTE_STATE_BLOCKED = 3;
  QUOTE_STATE_EXPIRED = 4;
}

// QuoteBlockReason explains why a quote cannot be executed.
enum QuoteBlockReason {
  QUOTE_BLOCK_REASON_UNSPECIFIED = 0;
  QUOTE_BLOCK_REASON_ROUTE_UNAVAILABLE = 1;
  QUOTE_BLOCK_REASON_LIMIT_BLOCKED = 2;
  QUOTE_BLOCK_REASON_RISK_BLOCKED = 3;
  QUOTE_BLOCK_REASON_INSUFFICIENT_LIQUIDITY = 4;
  QUOTE_BLOCK_REASON_PRICE_STALE = 5;
  QUOTE_BLOCK_REASON_AMOUNT_TOO_SMALL = 6;
  QUOTE_BLOCK_REASON_AMOUNT_TOO_LARGE = 7;
}

// QuoteExecutionReadiness indicates how readily a quote can be executed.
enum QuoteExecutionReadiness {
  QUOTE_EXECUTION_READINESS_UNSPECIFIED = 0;
  QUOTE_EXECUTION_READINESS_LIQUIDITY_READY = 1;
  QUOTE_EXECUTION_READINESS_LIQUIDITY_OBTAINABLE = 2;
  QUOTE_EXECUTION_READINESS_INDICATIVE = 3;
}

// RouteHopRole classifies a hop's position in the payment route.
enum RouteHopRole {
  ROUTE_HOP_ROLE_UNSPECIFIED = 0;
  ROUTE_HOP_ROLE_SOURCE = 1;
  ROUTE_HOP_ROLE_TRANSIT = 2;
  ROUTE_HOP_ROLE_DESTINATION = 3;
}

// FeeTreatment determines how fees are applied to the transfer amount.
enum FeeTreatment {
  FEE_TREATMENT_UNSPECIFIED = 0;
  FEE_TREATMENT_ADD_TO_SOURCE = 1;
  FEE_TREATMENT_DEDUCT_FROM_DESTINATION = 2;
}

// RouteHop represents a single step in the payment route topology.
message RouteHop {
  uint32 index = 1;
  string rail = 2;
  string gateway = 3;
  string instance_id = 4;
  string network = 5;
  RouteHopRole role = 6;
}

// RouteSettlement describes the settlement asset and model for a route.
message RouteSettlement {
  common.payment.v1.ChainAsset asset = 1;
  string model = 2;
}

// Abstract execution route selected during quotation.
// This is not an execution plan and must not contain operational steps.
message RouteSpecification {
  // Optional summary fields. Topology is represented by hops + route_ref.
  string rail = 1;
  string provider = 2;
  string payout_method = 3;
  string network = 4;
  string route_ref = 5;
  string pricing_profile_ref = 6;
  repeated RouteHop hops = 7;
  RouteSettlement settlement = 8;
}

// Execution assumptions and constraints evaluated at quotation time.
// Operational planning is performed by the execution layer later.
message ExecutionConditions {
  QuoteExecutionReadiness readiness = 1;
  bool batching_eligible = 2;
  bool prefunding_required = 3;
  bool prefunding_cost_included = 4;
  bool liquidity_check_required_at_execution = 5;
  string latency_hint = 6;
  repeated string assumptions = 7;
}

// PaymentQuote is a priced, time-bound quote for a single payment intent.
message PaymentQuote {
  common.storable.v1.Storable storable = 1;
  QuoteState state = 2;
  QuoteBlockReason block_reason = 3;

  // Transfer principal amount before fees.
  common.money.v1.Money transfer_principal_amount = 4;
  // Expected destination settlement amount.
  common.money.v1.Money destination_amount = 5;

  repeated fees.v1.DerivedPostingLine fee_lines = 6;
  repeated fees.v1.AppliedRule fee_rules = 7;

  oracle.v1.Quote fx_quote = 8;

  string quote_ref = 9;

  google.protobuf.Timestamp expires_at = 10;
  google.protobuf.Timestamp priced_at = 11;

  RouteSpecification route = 12;
  ExecutionConditions execution_conditions = 13;
  // Total amount expected to be debited from payer side (principal +/- fee lines in source currency).
  common.money.v1.Money payer_total_debit_amount = 14;
  common.payment.v1.SettlementMode resolved_settlement_mode = 15;
  FeeTreatment resolved_fee_treatment = 16;
  // Correlates this quote item with the originating quote intent.
  // Required for disambiguating batch quotations at execution time.
  string intent_ref = 17;
}
