// 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;

@strict_audit(bug="https://fxbug.dev/467128508", state="PENDING_REVIEW")
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;
    });
};
