#[cfg(not(feature = "tanssi"))]
use openzeppelin_pezpallet_abstractions::ConsensusWeight;
#[cfg(feature = "tanssi")]
use openzeppelin_pezpallet_abstractions::TanssiWeight;
use openzeppelin_pezpallet_abstractions::{AssetsWeight, GovernanceWeight, SystemWeight, XcmWeight};

use crate::{
    configs::OpenZeppelinRuntime,
    weights::{self, RocksDbWeight},
    Runtime,
};

impl SystemWeight for OpenZeppelinRuntime {
    type Balances = weights::pezpallet_balances::WeightInfo<Runtime>;
    type DbWeight = RocksDbWeight;
    type Multisig = weights::pezpallet_multisig::WeightInfo<Runtime>;
    type ParachainSystem = weights::pezcumulus_pezpallet_teyrchain_system::WeightInfo<Runtime>;
    type Preimage = weights::pezpallet_preimage::WeightInfo<Runtime>;
    type Proxy = weights::pezpallet_proxy::WeightInfo<Runtime>;
    type Scheduler = weights::pezpallet_scheduler::WeightInfo<Runtime>;
    type Timestamp = weights::pezpallet_timestamp::WeightInfo<Runtime>;
    type Utility = weights::pezpallet_utility::WeightInfo<Runtime>;
}

#[cfg(not(feature = "tanssi"))]
impl ConsensusWeight for OpenZeppelinRuntime {
    type CollatorSelection = weights::pezpallet_collator_selection::WeightInfo<Runtime>;
    type Session = weights::pezpallet_session::WeightInfo<Runtime>;
}

impl AssetsWeight for OpenZeppelinRuntime {
    type AssetManager = weights::pezpallet_asset_manager::WeightInfo<Runtime>;
    //TODO: fix weight
    type AssetTxPayment = ();
    type Assets = weights::pezpallet_assets::WeightInfo<Runtime>;
    // TODO: fix weight on release
    type OracleMembership = ();
    type OrmlOracle = ();
    // TODO: fix weight
    type TransactionPayment = weights::pezpallet_transaction_payment::WeightInfo<Runtime>;
}

impl GovernanceWeight for OpenZeppelinRuntime {
    type ConvictionVoting = weights::pezpallet_conviction_voting::WeightInfo<Runtime>;
    type Referenda = weights::pezpallet_referenda::WeightInfo<Runtime>;
    type Sudo = weights::pezpallet_sudo::WeightInfo<Runtime>;
    type Treasury = weights::pezpallet_treasury::WeightInfo<Runtime>;
    type Whitelist = weights::pezpallet_whitelist::WeightInfo<Runtime>;
}

impl XcmWeight for OpenZeppelinRuntime {
    type MessageQueue = weights::pezpallet_message_queue::WeightInfo<Runtime>;
    type Xcm = weights::pezpallet_xcm::WeightInfo<Runtime>;
    type XcmTransactor = weights::pezpallet_xcm_transactor::WeightInfo<Runtime>;
    type XcmWeightTrader = weights::pezpallet_xcm_weight_trader::WeightInfo<Runtime>;
    type XcmpQueue = weights::pezcumulus_pezpallet_xcmp_queue::WeightInfo<Runtime>;
}

#[cfg(feature = "tanssi")]
impl TanssiWeight for OpenZeppelinRuntime {
    type AuthorInherent = pezpallet_author_inherent::weights::BizinikiwiWeight<Runtime>;
    type AuthoritiesNoting = pezpallet_cc_authorities_noting::weights::BizinikiwiWeight<Runtime>;
}
