pub mod cli;
use {
    anchor_lang::{
        InstructionData,
        ToAccountMetas,
    },
    clap::Parser,
    cli::Cli,
    solana_client::rpc_client::RpcClient,
    solana_sdk::{
        commitment_config::CommitmentConfig,
        instruction::Instruction,
        signer::Signer,
        transaction::Transaction,
    },
    stake_caps_parameters::{
        Parameters,
        PARAMETERS_ADDRESS,
    },
};


fn main() {
    let Cli {
        keypair,
        rpc_url,
        m,
        z,
        authority,
    } = Cli::parse();
    let accs = stake_caps_parameters::accounts::SetParameters {
        signer:         keypair.pubkey(),
        parameters:     PARAMETERS_ADDRESS,
        system_program: solana_sdk::system_program::id(),
    };
    let rpc_client = RpcClient::new_with_commitment(rpc_url, CommitmentConfig::confirmed());

    let instruction = Instruction {
        program_id: stake_caps_parameters::id(),
        accounts:   accs.to_account_metas(None),
        data:       stake_caps_parameters::instruction::SetParameters {
            parameters: Parameters {
                m,
                z,
                current_authority: authority,
            },
        }
        .data(),
    };


    let mut transaction = Transaction::new_with_payer(&[instruction], Some(&keypair.pubkey()));
    transaction.sign(&[&keypair], rpc_client.get_latest_blockhash().unwrap());
    let transaction_signature = rpc_client
        .send_and_confirm_transaction_with_spinner(&transaction)
        .unwrap();
    println!("Transaction successful : {transaction_signature:?}");
}
