#![allow(
    clippy::len_without_is_empty,
    clippy::too_many_arguments,
    clippy::new_without_default
)]
use wasm_bindgen::prelude::{wasm_bindgen, JsError, JsValue};
use cml_core_wasm::{impl_wasm_cbor_json_api, impl_wasm_conversions, impl_wasm_json_api};
use cml_chain_wasm::address::Address;
pub mod utils;
#[derive(Clone, Debug)]
#[wasm_bindgen]
pub struct CIP36Delegation(cml_cip36::CIP36Delegation);
impl_wasm_cbor_json_api!(CIP36Delegation);
impl_wasm_conversions!(cml_cip36::CIP36Delegation, CIP36Delegation);
#[wasm_bindgen]
impl CIP36Delegation {
    pub fn voting_pub_key(&self) -> CIP36VotingPubKey {
        self.0.voting_pub_key.clone().into()
    }
    pub fn weight(&self) -> CIP36Weight {
        self.0.weight
    }
    pub fn new(voting_pub_key: &CIP36VotingPubKey, weight: CIP36Weight) -> Self {
        Self(cml_cip36::CIP36Delegation::new(
            voting_pub_key.clone().into(),
            weight,
        ))
    }
}
#[derive(Clone, Debug)]
#[wasm_bindgen]
pub struct CIP36DelegationDistribution(cml_cip36::CIP36DelegationDistribution);
impl_wasm_cbor_json_api!(CIP36DelegationDistribution);
impl_wasm_conversions!(
    cml_cip36::CIP36DelegationDistribution,
    CIP36DelegationDistribution
);
#[wasm_bindgen]
impl CIP36DelegationDistribution {
    pub fn new_weighted(delegations: &CIP36DelegationList) -> Self {
        Self(cml_cip36::CIP36DelegationDistribution::new_weighted(
            delegations.clone().into(),
        ))
    }
    pub fn new_legacy(legacy: &LegacyKeyRegistration) -> Self {
        Self(cml_cip36::CIP36DelegationDistribution::new_legacy(
            legacy.clone().into(),
        ))
    }
    pub fn kind(&self) -> DelegationDistributionKind {
        match &self.0 {
            cml_cip36::CIP36DelegationDistribution::Weighted { .. } => {
                DelegationDistributionKind::Weighted
            }
            cml_cip36::CIP36DelegationDistribution::Legacy { .. } => {
                DelegationDistributionKind::Legacy
            }
        }
    }
    pub fn as_weighted(&self) -> Option<CIP36DelegationList> {
        match &self.0 {
            cml_cip36::CIP36DelegationDistribution::Weighted { delegations, .. } => {
                Some(delegations.clone().into())
            }
            _ => None,
        }
    }
    pub fn as_legacy(&self) -> Option<LegacyKeyRegistration> {
        match &self.0 {
            cml_cip36::CIP36DelegationDistribution::Legacy { legacy, .. } => {
                Some(legacy.clone().into())
            }
            _ => None,
        }
    }
}
#[wasm_bindgen]
pub enum DelegationDistributionKind {
    Weighted,
    Legacy,
}
#[derive(Clone, Debug)]
#[wasm_bindgen]
pub struct CIP36DelegationList(Vec<cml_cip36::CIP36Delegation>);
#[wasm_bindgen]
impl CIP36DelegationList {
    pub fn new() -> Self {
        Self(Vec::new())
    }
    pub fn len(&self) -> usize {
        self.0.len()
    }
    pub fn get(&self, index: usize) -> CIP36Delegation {
        self.0[index].clone().into()
    }
    pub fn add(&mut self, elem: &CIP36Delegation) {
        self.0.push(elem.clone().into());
    }
}
impl From<Vec<cml_cip36::CIP36Delegation>> for CIP36DelegationList {
    fn from(native: Vec<cml_cip36::CIP36Delegation>) -> Self {
        Self(native)
    }
}
impl From<CIP36DelegationList> for Vec<cml_cip36::CIP36Delegation> {
    fn from(wasm: CIP36DelegationList) -> Self {
        wasm.0
    }
}
impl AsRef<Vec<cml_cip36::CIP36Delegation>> for CIP36DelegationList {
    fn as_ref(&self) -> &Vec<cml_cip36::CIP36Delegation> {
        &self.0
    }
}
#[derive(Clone, Debug)]
#[wasm_bindgen]
pub struct CIP36DeregistrationCbor(cml_cip36::CIP36DeregistrationCbor);
impl_wasm_json_api!(CIP36DeregistrationCbor);
impl_wasm_conversions!(cml_cip36::CIP36DeregistrationCbor, CIP36DeregistrationCbor);
#[wasm_bindgen]
impl CIP36DeregistrationCbor {
    pub fn key_deregistration(&self) -> CIP36KeyDeregistration {
        self.0.key_deregistration.clone().into()
    }
    pub fn deregistration_witness(&self) -> CIP36DeregistrationWitness {
        self.0.deregistration_witness.clone().into()
    }
    pub fn new(
        key_deregistration: &CIP36KeyDeregistration,
        deregistration_witness: &CIP36DeregistrationWitness,
    ) -> Self {
        Self(cml_cip36::CIP36DeregistrationCbor::new(
            key_deregistration.clone().into(),
            deregistration_witness.clone().into(),
        ))
    }
}
#[derive(Clone, Debug)]
#[wasm_bindgen]
pub struct CIP36DeregistrationWitness(cml_cip36::CIP36DeregistrationWitness);
impl_wasm_cbor_json_api!(CIP36DeregistrationWitness);
impl_wasm_conversions!(
    cml_cip36::CIP36DeregistrationWitness,
    CIP36DeregistrationWitness
);
#[wasm_bindgen]
impl CIP36DeregistrationWitness {
    pub fn stake_witness(&self) -> CIP36StakeWitness {
        self.0.stake_witness.clone().into()
    }
    pub fn new(stake_witness: &CIP36StakeWitness) -> Self {
        Self(cml_cip36::CIP36DeregistrationWitness::new(
            stake_witness.clone().into(),
        ))
    }
}
#[derive(Clone, Debug)]
#[wasm_bindgen]
pub struct CIP36KeyDeregistration(cml_cip36::CIP36KeyDeregistration);
impl_wasm_cbor_json_api!(CIP36KeyDeregistration);
impl_wasm_conversions!(cml_cip36::CIP36KeyDeregistration, CIP36KeyDeregistration);
#[wasm_bindgen]
impl CIP36KeyDeregistration {
    pub fn stake_credential(&self) -> CIP36StakeCredential {
        self.0.stake_credential.clone().into()
    }
    pub fn nonce(&self) -> CIP36Nonce {
        self.0.nonce
    }
    pub fn set_voting_purpose(&mut self, voting_purpose: CIP36VotingPurpose) {
        self.0.voting_purpose = voting_purpose
    }
    pub fn voting_purpose(&self) -> CIP36VotingPurpose {
        self.0.voting_purpose
    }
}
#[derive(Clone, Debug)]
#[wasm_bindgen]
pub struct CIP36KeyRegistration(cml_cip36::CIP36KeyRegistration);
impl_wasm_cbor_json_api!(CIP36KeyRegistration);
impl_wasm_conversions!(cml_cip36::CIP36KeyRegistration, CIP36KeyRegistration);
#[wasm_bindgen]
impl CIP36KeyRegistration {
    pub fn delegation(&self) -> CIP36DelegationDistribution {
        self.0.delegation.clone().into()
    }
    pub fn stake_credential(&self) -> CIP36StakeCredential {
        self.0.stake_credential.clone().into()
    }
    pub fn payment_address(&self) -> Address {
        self.0.payment_address.clone().into()
    }
    pub fn nonce(&self) -> CIP36Nonce {
        self.0.nonce
    }
    pub fn set_voting_purpose(&mut self, voting_purpose: CIP36VotingPurpose) {
        self.0.voting_purpose = voting_purpose
    }
    pub fn voting_purpose(&self) -> CIP36VotingPurpose {
        self.0.voting_purpose
    }
}
pub type LegacyKeyRegistration = cml_crypto_wasm::PublicKey;
pub type CIP36Nonce = u64;
#[derive(Clone, Debug)]
#[wasm_bindgen]
pub struct CIP36RegistrationCbor(cml_cip36::CIP36RegistrationCbor);
impl_wasm_json_api!(CIP36RegistrationCbor);
impl_wasm_conversions!(cml_cip36::CIP36RegistrationCbor, CIP36RegistrationCbor);
#[wasm_bindgen]
impl CIP36RegistrationCbor {
    pub fn key_registration(&self) -> CIP36KeyRegistration {
        self.0.key_registration.clone().into()
    }
    pub fn registration_witness(&self) -> CIP36RegistrationWitness {
        self.0.registration_witness.clone().into()
    }
    pub fn new(
        key_registration: &CIP36KeyRegistration,
        registration_witness: &CIP36RegistrationWitness,
    ) -> Self {
        Self(cml_cip36::CIP36RegistrationCbor::new(
            key_registration.clone().into(),
            registration_witness.clone().into(),
        ))
    }
}
#[derive(Clone, Debug)]
#[wasm_bindgen]
pub struct CIP36RegistrationWitness(cml_cip36::CIP36RegistrationWitness);
impl_wasm_cbor_json_api!(CIP36RegistrationWitness);
impl_wasm_conversions!(
    cml_cip36::CIP36RegistrationWitness,
    CIP36RegistrationWitness
);
#[wasm_bindgen]
impl CIP36RegistrationWitness {
    pub fn stake_witness(&self) -> CIP36StakeWitness {
        self.0.stake_witness.clone().into()
    }
    pub fn new(stake_witness: &CIP36StakeWitness) -> Self {
        Self(cml_cip36::CIP36RegistrationWitness::new(
            stake_witness.clone().into(),
        ))
    }
}
pub type CIP36StakeCredential = cml_crypto_wasm::PublicKey;
pub type CIP36StakeWitness = cml_crypto_wasm::Ed25519Signature;
pub type CIP36StakingPubKey = cml_crypto_wasm::PublicKey;
pub type CIP36VotingPubKey = cml_crypto_wasm::PublicKey;
pub type CIP36VotingPurpose = u64;
pub type CIP36Weight = u32;