// 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::scenic::types::ScreenshotDataDef;
use failure::{Error, ResultExt};
use fidl_fuchsia_ui_app::{ViewConfig, ViewMarker, ViewProviderMarker};
use fidl_fuchsia_ui_policy::PresenterMarker;
use fidl_fuchsia_ui_scenic::ScenicMarker;
use fuchsia_component::{
    self as app,
    client::{launch, launcher},
};
use fuchsia_scenic as scenic;
use serde_json::{to_value, Value};

/// Perform Scenic operations.
///
/// Note this object is shared among all threads created by server.
///
/// This facade does not hold onto a Scenic proxy as the server may be
/// long-running while individual tests set up and tear down Scenic.
#[derive(Debug)]
pub struct ScenicFacade {}

impl ScenicFacade {
    pub fn new() -> ScenicFacade {
        ScenicFacade {}
    }

    pub async fn take_screenshot(&self) -> Result<Value, Error> {
        let scenic =
            app::client::connect_to_service::<ScenicMarker>().expect("failed to connect to Scenic");

        let (screenshot, success) = await!(scenic.take_screenshot())?;
        if success {
            Ok(to_value(ScreenshotDataDef::new(screenshot))?)
        } else {
            bail!("TakeScreenshot failed")
        }
    }

    pub async fn present_view(&self, url: String, config: Option<ViewConfig>) -> Result<(), Error> {
        let presenter = app::client::connect_to_service::<PresenterMarker>()
            .expect("failed to connect to root presenter");

        let launcher = launcher().context("Failed to open launcher service")?;
        let app = launch(&launcher, url, None)?;

        let mut token_pair = scenic::ViewTokenPair::new()?;

        // (for now) gate v1/v2 on the presence of a view config
        match config {
            Some(mut config) => {
                // v2
                let view = app.connect_to_service::<ViewMarker>()?;
                view.set_config(&mut config)?;
                view.attach(token_pair.view_token.value)?;
            }
            None => {
                // v1
                let view_provider = app.connect_to_service::<ViewProviderMarker>()?;
                view_provider.create_view(token_pair.view_token.value, None, None)?;
            }
        }

        presenter.present_view(&mut token_pair.view_holder_token, None)?;

        app.controller().detach()?;
        Ok(())
    }
}
