use solana_program::{pubkey, pubkey::Pubkey};

/// The authority allowed to invoke [`Initialize`](crate::instruction::Initialize). Replace with your deploy multisig / key before mainnet.
pub const ADMIN_ADDRESS: Pubkey = pubkey!("6asgn8Vq8KKSQx4wm5zVfEfB76wqGVpEpWxajGkbQ8yr");

/// Must sign executor-gated instructions: [`InitMarket`](crate::instruction::InitMarket), [`AdminInstantSettlement`](crate::instruction::AdminInstantSettlement), [`ExecutorTreasury`](crate::instruction::ExecutorTreasury), [`ClaimPositionFee`](crate::instruction::ClaimPositionFee). Replace before production.
pub const EXECUTOR_ADDRESS: Pubkey =
    pubkey!("3B1WXgrV68V6ayymC7C8eVoCMeqeJLR7HWXkxfQxLUeF");

/// Meteora DAMM **cp\_amm** program ID (CPI `claim_position_fee`; local tree `damm-v2/programs/cp-amm`).
pub const CP_AMM_PROGRAM_ID: Pubkey =
    pubkey!("cpamdpZCGKUy5JxQXB4dcpGPiikHawvSWAd6mEn1sGG");

/// Basis points denominator (100%).
pub const MAX_BPS: u16 = 10_000;

/// Smallest SPL USDC increment: 10^-6 USD per base unit; ticket purchases and market stakes use whole multiples (1 whole USDC = `TICKET_MICROS` units).
pub const TICKET_MICROS: u64 = 1_000_000;

/// The seed of the ledger account PDA.
pub const LEDGER: &[u8] = b"ledger";

/// Maximum supported concurrent **market series** (**`series_id`** ∈ **`0..MAX_MARKET_SERIES`**).
/// **`Treasury::next_period`** is a **monotonic floor cursor** (`max(period+1)` bookkeeping); **`InitMarket`** and **`PlaceBet`** do **not** require matching it.
pub const MAX_MARKET_SERIES: usize = 64;

/// PDA seed for **[`crate::state::Market`]**.
pub const MARKET: &[u8] = b"market";

/// PDA seed for **[`crate::state::Position`]**.
pub const POSITION: &[u8] = b"position";

/// The seed of the program treasury PDA (owns the protocol USDC ATA).
pub const TREASURY: &[u8] = b"treasury";

/// **`ExecutorTreasury`** (**`JACKPOT_PAY`** **`pool`**): debit [`crate::state::Treasury::daily_jackpot`].
pub const EXECUTOR_PAY_DAILY_JACKPOT: u8 = 0;

/// **`ExecutorTreasury`** (**`JACKPOT_PAY`** **`pool`**): debit [`crate::state::Treasury::weekly_jackpot`].
pub const EXECUTOR_PAY_WEEKLY_JACKPOT: u8 = 1;

/// Ticket revenue split to daily pool (`MAX_BPS` scale).
pub const TICKET_DAILY_BPS: u16 = 7000;

/// Ticket revenue split to weekly pool (`MAX_BPS` scale).
pub const TICKET_WEEKLY_BPS: u16 = 1500;

/// Ticket revenue split to buyback reserve (`MAX_BPS` scale).
pub const TICKET_BUYBACK_BPS: u16 = 1000;

/// Ticket revenue split to team (`MAX_BPS` scale).
pub const TICKET_TEAM_BPS: u16 = 500;

/// Hook fee routed to weekly pool (`MAX_BPS` scale).
pub const HOOK_WEEKLY_BPS: u16 = 4000;

/// Hook fee accrued to treasury reserve (`MAX_BPS` scale).
pub const HOOK_RESERVE_BPS: u16 = 3000;

/// Hook fee to buyback (`MAX_BPS` scale).
pub const HOOK_BUYBACK_BPS: u16 = 1000;

/// Hook fee to team (`MAX_BPS` scale).
pub const HOOK_TEAM_BPS: u16 = 2000;

/// Prize-side routing to daily (`MAX_BPS` scale).
pub const PRIZE_DAILY_BPS: u16 = 7000;

/// Prize-side reserve routed into treasury weekly (`MAX_BPS` scale).
pub const PRIZE_RESERVE_BPS: u16 = 2000;

/// Prize-side weekly share (`MAX_BPS` scale).
pub const PRIZE_WEEKLY_BPS: u16 = 1000;

/// SPL USDC mint on Solana **mainnet-beta** (Circle). Token accounts in ix must use this mint (`Initialize` is implicit via consts).
/// EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v - mainnet
pub const USDC_MAINNET_MINT: Pubkey = pubkey!("GAmHPNMcgh9BTpe3DWirqMwvYCeDskE2im6fUhZyukJp");

/// Pyth **Receiver** program (Hermes pull feeds) — same address on mainnet-beta and devnet.
///
/// Accepts pull-feed `PriceUpdateV2` accounts written by this program.
pub const PYTH_RECEIVER_PROGRAM: Pubkey = pubkey!("rec5EKMGg6MxZYaMdyBfgwp4d5rB9T1VQH5pJv5LtFJ");

/// Pyth **Push Oracle** program — continuously updates price feed accounts on-chain.
///
/// The Pyth Data Association sponsors push updates for major feeds (BTC/USD, ETH/USD, …) at a
/// ~400 ms heartbeat on both mainnet-beta and devnet. Price feed accounts written by this program
/// have the same `PriceUpdateV2` borsh layout as pull-feed accounts; the only difference is the
/// account owner. Oracle-gated instructions (`InitMarket` anchor, `AdminInstantSettlement`)
/// accept accounts owned by **either** this program or `PYTH_RECEIVER_PROGRAM`.
pub const PYTH_PUSH_ORACLE_PROGRAM: Pubkey =
    pubkey!("pythWSnswVUd12oZpeFP8e9CVaEqJg25g1Vtc2biRsT");

/// BTC/USD canonical Pyth price feed ID (Hermes / Pythnet).
///
/// Stored in `Market::pyth_price_feed` (reusing the 32-byte `Pubkey` field).
/// Callers must pass a price account whose `price_message.feed_id` matches this.
pub const PYTH_BTC_USD_FEED_ID: [u8; 32] = [
    0xe6, 0x2d, 0xf6, 0xc8, 0xb4, 0xa8, 0x5f, 0xe1,
    0xa6, 0x7d, 0xb4, 0x4d, 0xc1, 0x2d, 0xe5, 0xdb,
    0x33, 0x0f, 0x7a, 0xc6, 0x6b, 0x72, 0xdc, 0x65,
    0x8a, 0xfe, 0xdf, 0x0f, 0x4a, 0x41, 0x5b, 0x43,
];

/// BTC/USD **push feed account** — shard 0, maintained by the Pyth Data Association.
///
/// PDA of [`PYTH_PUSH_ORACLE_PROGRAM`] derived from `[shard_id_le_u16, feed_id]` with
/// `shard_id = 0` and `feed_id = PYTH_BTC_USD_FEED_ID`.
/// The address is deterministic and **identical on mainnet-beta and devnet**.
///
/// Pass this account to oracle-gated instructions instead of a manually posted `PriceUpdateV2`.
/// No `post_update_atomic` call is required — the Pyth Data Association keeps this account fresh.
pub const PYTH_BTC_USD_PRICE_FEED_ACCOUNT: Pubkey =
    pubkey!("4cSM2e6rvbGQUFiJbqytoVMi5GgghSMr8LwVrT9VPSPo");

/// Maximum age in seconds (vs `Clock::unix_timestamp`) that a Pyth Hermes `PriceUpdateV2`
/// publish_time may lag behind the on-chain clock before it is rejected as stale.
pub const PYTH_MAX_PRICE_AGE_SECS: u64 = 60;

/// Void threshold in basis points of absolute price move (1 bp = 0.01%).
///
/// If `|close – open| / open < 1 bp`, the executor should call `AdminVoidMarket` instead of
/// `AdminInstantSettlement`. Checked off-chain by the bot; recorded here for documentation.
pub const BTC_VOID_THRESHOLD_BPS: u64 = 1;

/// **`InitMarket`** (**open-anchor** crank / tail of **`create`**): **`Clock::unix_timestamp`** must satisfy **`∈ [open_ts, min(open_ts + this constant, close_ts))`** so the open tick aligns with bucket start (fixed-bucket oracle anchor).
pub const MARKET_OPEN_ANCHOR_GRACE_SECS: i64 = 60;

/// SPL USDC recipient for team-fee legs: **`ticket_team_bps`** (`BuyTickets`), **`hook_team_bps`** (`ClaimPositionFee`).
pub const FEE_COLLECTOR: Pubkey = pubkey!("FEeB92JDVmVuuoaoTjKyfDPPrLTWPGg2EJTrY3TmTx3T");
