syntax = "proto3";

package common.payment.v1;

option go_package = "github.com/tech/sendico/pkg/proto/common/payment/v1;paymentv1";

// CardNetwork identifies a card payment network (scheme).
enum CardNetwork {
  CARD_NETWORK_UNSPECIFIED = 0;
  CARD_NETWORK_VISA = 1;
  CARD_NETWORK_MASTERCARD = 2;
  CARD_NETWORK_MIR = 3;
  CARD_NETWORK_AMEX = 4;
  CARD_NETWORK_UNIONPAY = 5;
  CARD_NETWORK_JCB = 6;
  CARD_NETWORK_DISCOVER = 7;
}

// CardFundingType classifies the funding source behind a card.
enum CardFundingType {
  CARD_FUNDING_UNSPECIFIED = 0;
  CARD_FUNDING_DEBIT = 1;
  CARD_FUNDING_CREDIT = 2;
  CARD_FUNDING_PREPAID = 3;
}

// RawCardData carries PCI-scope card credentials for tokenisation or
// direct processing.
message RawCardData {
  string pan = 1;
  uint32 exp_month = 2; // 1–12
  uint32 exp_year = 3; // YYYY
  string cvv = 4; // optional; often omitted for payouts
}

// CardMetadata holds non-sensitive display and routing hints derived from
// card details.
message CardMetadata {
  string masked_pan = 1; // e.g. 411111******1111
  CardNetwork network = 2; // Visa/Mastercard/Mir/...
  CardFundingType funding = 3; // debit/credit/prepaid (if known)
  string issuing_country = 4; // ISO 3166-1 alpha-2 (if known)
  string issuer_name = 5; // display only (if known)
}

// CardDetails provides card credentials for a payment operation, either
// as inline raw data or a reference to a stored payment method.
message CardDetails {
  string id = 1;

  oneof source {
    RawCardData raw = 2;
    string payment_method_id = 3;
  }

  string cardholder_name = 4;
  string cardholder_surname = 5;

  string billing_country = 6; // ISO 3166-1 alpha-2, if you need it per operation
}
