package state

import (
	"git.marketally.com/tutus-one/tutus-chain/pkg/util"
)

// AgreementStatus represents the status of a bilateral agreement.
type AgreementStatus uint8

// Agreement status constants.
const (
	AgreementPending   AgreementStatus = 0
	AgreementActive    AgreementStatus = 1
	AgreementSuspended AgreementStatus = 2
	AgreementTerminated AgreementStatus = 3
)

// AgreementType represents the type of bilateral agreement.
type AgreementType uint8

// Agreement type constants.
const (
	AgreementTypeGeneral         AgreementType = 0 // General cooperation
	AgreementTypeIdentity        AgreementType = 1 // Identity verification
	AgreementTypeSettlement      AgreementType = 2 // VTS settlement
	AgreementTypeEducation       AgreementType = 3 // Education credential sharing
	AgreementTypeHealthcare      AgreementType = 4 // Healthcare record sharing
	AgreementTypeComprehensive   AgreementType = 5 // All services
)

// VerificationStatus represents the status of a verification request.
type VerificationStatus uint8

// Verification status constants.
const (
	VerificationPending   VerificationStatus = 0
	VerificationApproved  VerificationStatus = 1
	VerificationRejected  VerificationStatus = 2
	VerificationExpired   VerificationStatus = 3
)

// VerificationType represents the type of verification request.
type VerificationType uint8

// Verification type constants.
const (
	VerificationTypeIdentity    VerificationType = 0 // Identity verification
	VerificationTypeCredential  VerificationType = 1 // Education credential
	VerificationTypeHealth      VerificationType = 2 // Healthcare record
	VerificationTypeCertificate VerificationType = 3 // Professional certificate
)

// SettlementStatus represents the status of a settlement request.
type SettlementStatus uint8

// Settlement status constants.
const (
	SettlementPending   SettlementStatus = 0
	SettlementCompleted SettlementStatus = 1
	SettlementRejected  SettlementStatus = 2
	SettlementCancelled SettlementStatus = 3
)

// BilateralAgreement represents an agreement between two sovereign chains.
type BilateralAgreement struct {
	ID              uint64           // Unique agreement ID
	LocalChainID    uint32           // This chain's ID
	RemoteChainID   uint32           // Partner chain's ID
	AgreementType   AgreementType    // Type of agreement
	Status          AgreementStatus
	Terms           util.Uint256     // Hash of off-chain terms document
	EffectiveDate   uint32           // Block height when effective
	ExpirationDate  uint32           // Block height when expires (0 = no expiry)
	CreatedAt       uint32           // Block height when created
	UpdatedAt       uint32           // Last update block height
}

// VerificationRequest represents a cross-border verification request.
type VerificationRequest struct {
	ID               uint64             // Unique request ID
	RequestingChain  uint32             // Chain requesting verification
	TargetChain      uint32             // Chain being queried
	Subject          util.Uint160       // Subject of verification
	VerificationType VerificationType
	DataHash         util.Uint256       // Hash of requested data
	Status           VerificationStatus
	ResponseHash     util.Uint256       // Hash of response data (if any)
	Requester        util.Uint160       // Who initiated request
	CreatedAt        uint32             // Block height
	ExpiresAt        uint32             // Request expiry
	RespondedAt      uint32             // When responded (0 = pending)
}

// SettlementRequest represents an international VTS settlement request.
type SettlementRequest struct {
	ID            uint64          // Unique request ID
	FromChain     uint32          // Originating chain
	ToChain       uint32          // Destination chain
	Sender        util.Uint160    // Sender on from chain
	Receiver      util.Uint160    // Receiver on to chain
	Amount        uint64          // VTS amount (in smallest units)
	Reference     string          // Payment reference
	Status        SettlementStatus
	CreatedAt     uint32          // Block height
	SettledAt     uint32          // When settled (0 = pending)
	TxHash        util.Uint256    // Settlement transaction hash
}

// CredentialShare represents a shared credential between chains.
type CredentialShare struct {
	ID             uint64         // Unique share ID
	SourceChain    uint32         // Chain where credential originated
	TargetChain    uint32         // Chain receiving credential
	Owner          util.Uint160   // Credential owner
	CredentialType VerificationType
	CredentialID   uint64         // Original credential ID on source chain
	ContentHash    util.Uint256   // Hash of credential content
	ValidUntil     uint32         // Validity period on target chain
	CreatedAt      uint32         // Block height
	IsRevoked      bool           // Has been revoked
}

// PonsConfig represents configurable parameters for the Pons contract.
type PonsConfig struct {
	LocalChainID          uint32 // This chain's unique identifier
	VerificationTimeout   uint32 // Blocks until verification request expires
	SettlementTimeout     uint32 // Blocks until settlement request expires
	MaxPendingRequests    uint64 // Maximum pending requests per chain
	CredentialShareExpiry uint32 // Default validity period for shared credentials
}
