//  Copyright (C) 2017-2019  The AXIOM TEAM Association.
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as
// published by the Free Software Foundation, either version 3 of the
// License, or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program.  If not, see <https://www.gnu.org/licenses/>.

//! Sub module define WS2P controller meta datas

use crate::connection_state::WS2PConnectionState;
use crate::MySelfWs2pNode;
use dubp_currency_params::CurrencyName;
use dubp_documents::Blockstamp;
use dup_crypto::hashs::Hash;
use durs_network_documents::network_peer::PeerCardV11;
use durs_network_documents::NodeFullId;
use durs_ws2p_messages::v2::api_features::WS2PFeatures;
use durs_ws2p_messages::v2::connect::WS2Pv2ConnectType;
use std::time::SystemTime;

#[derive(Debug, Clone)]
/// WS2p Connection meta datas
pub struct WS2PControllerMetaDatas {
    /// Local challenge
    pub challenge: Hash,
    /// connect type
    pub connect_type: WS2Pv2ConnectType,
    /// Count invalid messages
    pub count_invalid_msgs: usize,
    /// Currency name
    pub currency: CurrencyName,
    /// Controller creation time
    pub creation_time: SystemTime,
    /// Connection features
    pub features: Option<WS2PFeatures>,
    /// Timestamp of last received message
    pub last_mess_time: SystemTime,
    /// Local node properties
    pub local_node: MySelfWs2pNode,
    /// Remote connect type
    pub remote_connect_type: Option<WS2Pv2ConnectType>,
    /// Remote node datas
    pub remote_node: Option<Ws2pRemoteNodeDatas>,
    /// Indicator required for the anti-spam mechanism
    pub spam_interval: bool,
    /// Indicator required for the anti-spam mechanism
    pub spam_counter: usize,
    /// Connection state
    pub state: WS2PConnectionState,
}

impl WS2PControllerMetaDatas {
    /// Instanciate new WS2PControllerMetaDatas
    pub fn new(
        challenge: Hash,
        connect_type: WS2Pv2ConnectType,
        currency: CurrencyName,
        local_node: MySelfWs2pNode,
    ) -> Self {
        WS2PControllerMetaDatas {
            challenge,
            connect_type,
            count_invalid_msgs: 0,
            currency,
            creation_time: SystemTime::now(),
            features: None,
            last_mess_time: SystemTime::now(),
            local_node,
            remote_connect_type: None,
            remote_node: None,
            spam_interval: false,
            spam_counter: 0,
            state: WS2PConnectionState::TryToOpenWS,
        }
    }
}

#[derive(Debug, Clone)]
/// WS2P remote node datas
pub struct Ws2pRemoteNodeDatas {
    /// Remote challenge
    pub challenge: Hash,
    /// Remote current blockstamp
    pub current_blockstamp: Option<Blockstamp>,
    /// Remote peer card
    pub peer_card: Option<PeerCardV11>,
    /// Remote full id
    pub remote_full_id: NodeFullId,
}