// Copyright 2020 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

use {
    anyhow::{format_err, Error},
    fidl_fuchsia_wlan_product_deprecatedconfiguration as fidl_deprecated,
    fuchsia_component::client::connect_to_protocol,
    fuchsia_sync::RwLock,
    std::fmt::Debug,
};

#[derive(Debug)]
struct InnerWlanDeprecatedConfigurationFacade {
    controller: fidl_deprecated::DeprecatedConfiguratorProxy,
}

#[derive(Debug)]
pub struct WlanDeprecatedConfigurationFacade {
    inner: RwLock<InnerWlanDeprecatedConfigurationFacade>,
}

impl WlanDeprecatedConfigurationFacade {
    /// Connects to the DeprecatedConfigurator service and returns a
    /// WlanDeprecatedConfigurationFacade instance to enable setting suggested MAC addresses for
    /// soft APs.
    pub fn new() -> Result<WlanDeprecatedConfigurationFacade, Error> {
        let controller = connect_to_protocol::<fidl_deprecated::DeprecatedConfiguratorMarker>()?;
        Ok(Self {
            inner: RwLock::new(InnerWlanDeprecatedConfigurationFacade { controller: controller }),
        })
    }

    /// Communicates with the DeprecatedConfigurator service to set a preferred MAC address to be
    /// used for new soft APs.  This API waits for an acknowledgement from the
    /// DeprecatedConfigurator service indicating that the suggested MAC address has been set.
    ///
    /// # Arguments
    ///
    /// `mac` - A MAC address in the form of an eui48::MacAddress.
    pub async fn suggest_access_point_mac_address(
        &self,
        mac: eui48::MacAddress,
    ) -> Result<(), Error> {
        let inner_guard = self.inner.read();
        let controller = &inner_guard.controller;

        let mac = fidl_fuchsia_net::MacAddress { octets: mac.to_array() };
        let result = controller.suggest_access_point_mac_address(&mac).await?;
        result.map_err(|e| format_err!("could not set preferred MAC: {:?}", e))
    }

    /// Consumes the arguments from an ACTS test, looks for a "mac" key, and attempts to convert
    /// the associated value to a MAC address.
    ///
    /// # Arguments
    ///
    /// * `args` - A JSON blob represented as a serde_json::Value containing a "mac" key.
    pub fn parse_mac_argument(&self, args: serde_json::Value) -> Result<eui48::MacAddress, Error> {
        let mac = match args.get("mac") {
            Some(mac) => match mac.as_str() {
                Some(mac) => eui48::MacAddress::parse_str(mac)?,
                None => {
                    return Err(format_err!(
                        "MAC address could not be interpreted as a string: {:?}",
                        mac
                    ))
                }
            },
            None => return Err(format_err!("Please provide a preferred MAC")),
        };
        Ok(mac)
    }
}
