// 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.
@available(added=7)
library fuchsia.migration;
using fuchsia.io;

type MigrationStatus = strict enum {
    UNKNOWN = 1;
    IN_PROGRESS = 2;
    COMPLETE = 3;
    ENCOUNTERED_ERROR = 4;
};

/// Table for state of migration operations.
type MigrationState = table {
    1: status MigrationStatus;
    2: progress_percentage uint8;
};

closed protocol Provider {
    strict Get(resource struct {
        dir server_end:fuchsia.io.Directory;
    });
    strict Processed();
};

@discoverable
closed protocol CastProvider {
    compose Provider;
};

@discoverable
closed protocol DisplayProvider {
    compose Provider;
};

@discoverable
closed protocol KronkProvider {
    compose Provider;
};

@discoverable
closed protocol UltrasoundProvider {
    compose Provider;
};

@discoverable
closed protocol ProductPolicyProvider {
    compose Provider;
};

/// Protocol to watch for changes when a migration of system data is started.
@discoverable
closed protocol State {
    /// Hanging get. Will return immediatedly on first call per connection
    /// and then on change after that.
    strict Watch() -> (struct {
        state MigrationState;
    });
};
