// Copyright 2018 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.

library fuchsia.setui;

/// operations supported by string settings.
enum StringOperation {
    UPDATE = 1;
};

/// Configuration for string mutations.
struct StringMutation {
    StringOperation operation;
    string value;
};

/// Operations supported by account settings.
enum AccountOperation {
    ADD = 1;
    SET_LOGIN_OVERRIDE = 2;
};

/// Configuration for account mutations.
table AccountMutation {
    1: AccountOperation operation;
    2: LoginOverride login_override;
};

/// Operations supported by wireless settings.
enum WirelessOperation {
    CONNECT = 1;
    DISCONNECT = 2;
};

/// Configuration for wireless mutations.
struct WirelessMutation {
    WirelessOperation operation;
    int64 network_id;
    string password;
};

/// Configuration for time zone mutation.
struct TimeZoneMutation {
    TimeZoneInfo value;
};

/// Mutation that replaces the existing list of locales with a new list.
struct LocalesMutation {
  /// See IntlSettings.locales for format.
  vector<string> locales;
};

/// Mutation that changes the |HourCycle|.
struct HourCycleMutation {
    HourCycle hour_cycle;
};

/// Mutation that changes the |TemperatureUnit|.
struct TemperatureUnitMutation {
    TemperatureUnit temperature_unit;
};

/// Container for setting mutations.
union Mutation {
    AccountMutation account_mutation_value;
    StringMutation string_mutation_value;
    WirelessMutation wireless_mutation_value;
    TimeZoneMutation time_zone_mutation_value;
    LocalesMutation locales_mutation_value;
    HourCycleMutation hour_cycle_mutation_value;
    TemperatureUnitMutation temperature_unit_mutation_value;
};

struct AccountMutationHandles {
    handle<eventpair> view_holder_token;
};

union MutationHandles {
    AccountMutationHandles account_handles;
};
