use std::collections::HashMap;
use serde::{Deserialize, Serialize};
use serde_json::Value;
#[derive(Debug, Default, Deserialize, Serialize, Clone)]
pub struct IpDetails {
        pub ip: String,
        pub hostname: Option<String>,
        pub city: String,
        pub region: String,
        pub country: String,
        pub country_name: Option<String>,
        pub is_eu: Option<bool>,
        pub country_flag: Option<CountryFlag>,
        pub country_flag_url: Option<String>,
        pub country_currency: Option<CountryCurrency>,
        pub continent: Option<Continent>,
        pub loc: String,
        pub org: Option<String>,
        pub postal: Option<String>,
        pub timezone: Option<String>,
        pub asn: Option<AsnDetails>,
        pub company: Option<CompanyDetails>,
        pub carrier: Option<CarrierDetails>,
        pub privacy: Option<PrivacyDetails>,
        pub abuse: Option<AbuseDetails>,
        pub domains: Option<DomainsDetails>,
        pub bogon: Option<bool>,
    #[serde(flatten)]
    pub extra: HashMap<String, Value>,
}
#[derive(Debug, Deserialize, Serialize, Clone)]
pub struct AsnDetails {
        pub asn: String,
        pub name: String,
        pub domain: String,
        pub route: String,
        #[serde(rename = "type")]
    pub asn_type: String,
}
#[derive(Debug, Deserialize, Serialize, Clone)]
pub struct CompanyDetails {
        pub name: String,
        pub domain: String,
        #[serde(rename = "type")]
    pub company_type: String,
}
#[derive(Debug, Deserialize, Serialize, Clone)]
pub struct CarrierDetails {
        pub name: String,
        pub mcc: String,
        pub mnc: String,
}
#[derive(Debug, Deserialize, Serialize, Clone)]
pub struct PrivacyDetails {
        pub vpn: bool,
        pub proxy: bool,
        pub tor: bool,
        pub relay: bool,
        pub hosting: bool,
        pub service: String,
}
#[derive(Debug, Deserialize, Serialize, Clone)]
pub struct AbuseDetails {
        pub address: String,
        pub country: String,
        pub email: String,
        pub name: String,
        pub network: String,
        pub phone: String,
}
#[derive(Debug, Deserialize, Serialize, Clone)]
pub struct DomainsDetails {
        pub ip: Option<String>,
        pub total: u64,
        pub domains: Vec<String>,
}
#[derive(Debug, Deserialize, Serialize, Clone, PartialEq)]
pub struct CountryFlag {
    pub emoji: String,
    pub unicode: String,
}
#[derive(Debug, Deserialize, Serialize, Clone, PartialEq)]
pub struct CountryCurrency {
    pub code: String,
    pub symbol: String,
}
#[derive(Debug, Deserialize, Serialize, Clone, PartialEq)]
pub struct Continent {
    pub code: String,
    pub name: String,
}