use borsh::{BorshDeserialize, BorshSerialize};
use solana_program::{account_info::AccountInfo, entrypoint::ProgramResult, pubkey::Pubkey};

use crate::instruction::transfer_sol_with_cpi;
use crate::instruction::transfer_sol_with_program;

#[derive(BorshSerialize, BorshDeserialize, Debug)]
pub enum TransferInstruction {
    CpiTransfer(u64),
    ProgramTransfer(u64),
}

pub fn process_instruction(
    program_id: &Pubkey,
    accounts: &[AccountInfo],
    input: &[u8],
) -> ProgramResult {
    let instruction = TransferInstruction::try_from_slice(input)?;
    match instruction {
        TransferInstruction::CpiTransfer(args) => transfer_sol_with_cpi(accounts, args),
        TransferInstruction::ProgramTransfer(args) => {
            transfer_sol_with_program(program_id, accounts, args)
        }
    }
}
