// 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 {
    crate::config::ConfigMapValue,
    fidl_fuchsia_boot::{FactoryItemsRequest, FactoryItemsRequestStream},
    fuchsia_async as fasync, fuchsia_zircon as zx,
    futures::prelude::*,
    std::sync::{Arc, RwLock},
};

type ConfigMap = Arc<RwLock<ConfigMapValue>>;

/// A fake meant for tests which rely on FactoryItems.
pub struct FakeFactoryItemsServer {
    factory_items: ConfigMap,
}
impl FakeFactoryItemsServer {
    /// Creates new fake factory store.
    pub fn new(factory_items: ConfigMap) -> Self {
        Self { factory_items }
    }

    /// Asynchronously handles the supplied stream of `FactoryItemsRequest` messages.
    pub async fn handle_requests_from_stream(
        &self,
        mut stream: FactoryItemsRequestStream,
    ) -> Result<(), fidl::Error> {
        while let Some(req) = stream.try_next().await? {
            self.handle_request(req).await?;
        }
        Ok(())
    }

    /// Asynchronously handles a single `FactoryItemsRequest`.
    async fn handle_request(&self, req: FactoryItemsRequest) -> Result<(), fidl::Error> {
        let FactoryItemsRequest::Get { extra, responder } = req;

        let (payload, length) = match self.factory_items.read().unwrap().get(&extra) {
            Some(item) => {
                let size = item.0.get_size().unwrap();

                (
                    Some(item.0.create_child(zx::VmoChildOptions::COPY_ON_WRITE, 0, size).unwrap()),
                    item.1,
                )
            }
            None => (None, 0),
        };

        responder.send(payload, length)
    }
}

pub fn spawn_fake_factory_items_server(
    server: FakeFactoryItemsServer,
    stream: FactoryItemsRequestStream,
) {
    fasync::Task::spawn(async move {
        server
            .handle_requests_from_stream(stream)
            .await
            .expect("Failed to run fake_factory_store service")
    })
    .detach();
}
