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

import 'package:fidl_fuchsia_modular/fidl_async.dart';

/// Inherent properties of a surface
class SurfaceProperties {
  /// Const constructor
  SurfaceProperties({this.containerLabel, this.source});

  SurfaceProperties.fromJson(Map<String, dynamic> json) {
    containerLabel = json['containerLabel'];
    containerMembership = json['containerMembership'];
    source = moduleSourceFromString(json['source']);
  }

  /// Belongs to a container with label containerLabel
  String containerLabel;

  /// List of the containers this Surface is a member of
  /// (To be able to support container-to-container transitions)
  /// The container this Surface is currently participating in is
  /// end of list. If this Surface is focused, that is the container that
  /// will be laid out.
  List<String> containerMembership;

  /// Was the module producing this surface launched from inside the current
  /// story - e.g. by a parent module in the story, or externally e.g. via a
  /// suggestion
  ModuleSource source;

  Map<String, dynamic> toJson() => {
        'containerLabel': containerLabel,
        'containerMembership': containerMembership,
        'source': source.toString(),
      };

  ModuleSource moduleSourceFromString(String str) {
    if (str == ModuleSource.internal.toString()) {
      return ModuleSource.internal;
    } else if (str == ModuleSource.external$.toString()) {
      return ModuleSource.external$;
    } else if (str == 'null') {
      return null;
    } else {
      throw ArgumentError.value(str);
    }
  }
}
