// Copyright 2019 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::{Context as _, Error},
    fidl_fuchsia_test_hub as fhub,
    fuchsia_component::client::connect_to_service,
};

macro_rules! get_names_from_listing {
    ($dir_listing:ident) => {
        &mut $dir_listing.iter().map(|entry| &entry.name as &str)
    };
}

/// Connects to HubReport service and provides convenience methods.
pub struct HubReport {
    hub_report: fhub::HubReportProxy,
}

impl HubReport {
    pub fn new() -> Result<Self, Error> {
        let hub_report = connect_to_service::<fhub::HubReportMarker>()
            .context("error connecting to HubReport")?;
        Ok(Self { hub_report })
    }

    /// Report the contents of a directory to the integration test.
    /// This method blocks until the integration test is ready to accept the contents.
    pub async fn report_directory_contents(&self, dir_path: &str) -> Result<(), Error> {
        let dir_proxy =
            io_util::open_directory_in_namespace(dir_path, io_util::OPEN_RIGHT_READABLE)
                .expect("Unable to open directory in namespace");
        let dir_listing = files_async::readdir(&dir_proxy).await.expect("readdir failed");
        self.hub_report
            .list_directory(dir_path, get_names_from_listing!(dir_listing))
            .await
            .context("list directory failed")?;
        Ok(())
    }

    /// Report the contents of a file to the integration test.
    /// This method blocks until the integration test is ready to accept the contents.
    pub async fn report_file_content(&self, path: &str) -> Result<(), Error> {
        let resolved_url_proxy =
            io_util::open_file_in_namespace(path, io_util::OPEN_RIGHT_READABLE)
                .expect("Unable to open the file.");
        let resolved_url_file_content = io_util::read_file(&resolved_url_proxy).await?;
        self.hub_report
            .report_file_content(path, &resolved_url_file_content)
            .await
            .context("report file content failed")?;
        Ok(())
    }
}
