Documentation
use cmpb::common::{EndorsementEntry, Payload, TxRequest};
use uuid::Uuid;

use crate::crypto::Signer;

pub const DEFAULT_SEQUENCE: u64 = 0;

pub fn get_normal_tx_id() -> String {
    let mut u1 = Uuid::new_v4().to_string();
    u1.push_str(&Uuid::new_v4().to_string());

    let tx_id = u1.replace("-", "");
    return tx_id;
}

//
pub fn get_tx_id() -> String {
    //获取当前时间纳秒
    let now = std::time::SystemTime::now()
        .duration_since(std::time::SystemTime::UNIX_EPOCH)
        .expect("Time went backwards");

    let secs = now.as_secs();

    // 生成一个16位UUID
    let uuid = Uuid::new_v4();

    // 创建一个32字节的可变数组
    let mut data: [u8; 32] = [0; 32];

    // 将当前时间纳秒写入前8位
    data[0..8].copy_from_slice(&secs.to_be_bytes());

    // 将第9位设置为202
    data[8] = 202;

    // 将UUID的字节表示写入[16,32)区间
    data[16..32].copy_from_slice(uuid.as_bytes());

    hex::encode(&data)
}

pub fn generate_tx_request_by_signer<S: Signer>(
    payload: Payload,
    endorsements: Vec<EndorsementEntry>,
    signer: S,
) -> Result<TxRequest, String> {
    let data = match signer.sign(&payload) {
        Err(e) => return Err(e),
        Ok(data) => data,
    };

    let sender = EndorsementEntry {
        signer: Some(signer.new_member()),
        signature: data,
    };

    Ok(TxRequest {
        payload: Some(payload),
        sender: Some(sender),
        endorsers: endorsements,
        payer: None,
    })
}

pub fn get_timestamp() -> u64 {
    let now = std::time::SystemTime::now()
        .duration_since(std::time::SystemTime::UNIX_EPOCH)
        .expect("Time went backwards");
    now.as_secs()
}