// 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::{
    common::{ProtocolState, UpdateCheckSchedule},
    installer::ProgressObserver,
    protocol::response::Response,
    state_machine::{update_check, State, UpdateCheckError},
};
use futures::{channel::mpsc, future::BoxFuture, prelude::*};

/// Events emitted by the state machine.
#[derive(Debug)]
pub enum StateMachineEvent {
    StateChange(State),
    ScheduleChange(UpdateCheckSchedule),
    ProtocolStateChange(ProtocolState),
    UpdateCheckResult(Result<update_check::Response, UpdateCheckError>),
    InstallProgressChange(InstallProgress),
    OmahaServerResponse(Response),
    InstallerError(Option<Box<dyn std::error::Error + Send + 'static>>),
}

#[derive(Debug)]
pub struct InstallProgress {
    pub progress: f32,
}

pub(super) struct StateMachineProgressObserver(pub(super) mpsc::Sender<InstallProgress>);

impl ProgressObserver for StateMachineProgressObserver {
    fn receive_progress(
        &self,
        _operation: Option<&str>,
        progress: f32,
        _total_size: Option<u64>,
        _size_so_far: Option<u64>,
    ) -> BoxFuture<'_, ()> {
        async move {
            let _ = self.0.clone().send(InstallProgress { progress }).await;
        }
        .boxed()
    }
}
