# 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.

import("//build/config.gni")
import("//build/fidl/fidl.gni")
import("//build/package.gni")
import("//peridot/build/modular_config/modular_config.gni")
import("//topaz/runtime/flutter_runner/flutter_app.gni")

flutter_app("ermine") {
  main_dart = "lib/main.dart"

  package_name = "ermine"

  meta = [
    {
      path = rebase_path("meta/ermine.cmx")
      dest = "ermine.cmx"
    },
  ]

  manifest = "pubspec.yaml"

  deps = [
    ":ermine_library",
  ]
}

dart_library("ermine_library") {
  package_name = "ermine_library"

  sources = [
    "main.dart",
    "src/models/app_model.dart",
    "src/models/default_proposer.dart",
    "src/models/ermine_service_provider.dart",
    "src/models/package_proposer.dart",
    "src/models/story_manager.dart",
    "src/models/story_model.dart",
    "src/models/web_proposer.dart",
    "src/modules/ask_model.dart",
    "src/modules/ask_module.dart",
    "src/modules/ask_sheet.dart",
    "src/modules/ask_suggestion_list.dart",
    "src/modules/ask_text_field.dart",
    "src/utils/elevations.dart",
    "src/utils/key_chord_listener.dart",
    "src/utils/session_shell_services.dart",
    "src/widgets/app.dart",
    "src/widgets/stories.dart",
  ]

  deps = [
    ":shell.ermine",
    "//sdk/fidl/fuchsia.modular",
    "//sdk/fidl/fuchsia.ui.app",
    "//sdk/fidl/fuchsia.ui.input",
    "//sdk/fidl/fuchsia.ui.policy",
    "//sdk/fidl/fuchsia.ui.views",
    "//sdk/fidl/fuchsia.ui.viewsv1token",
    "//third_party/dart-pkg/git/flutter/packages/flutter",
    "//third_party/dart-pkg/pub/flutter_svg",
    "//third_party/dart-pkg/pub/uuid",
    "//topaz/public/dart/fuchsia_logger",
    "//topaz/public/dart/fuchsia_modular",
    "//topaz/public/dart/fuchsia_scenic_flutter",
    "//topaz/public/dart/fuchsia_services",
    "//topaz/public/dart/widgets:lib.widgets",
  ]
}

flutter_app("ermine_ask_module") {
  main_dart = "lib/src/modules/ask_module.dart"

  package_name = "ermine_ask_module"

  meta = [
    {
      path = rebase_path("meta/ermine_ask_module.cmx")
      dest = "ermine_ask_module.cmx"
    },
  ]

  manifest = "ermine_ask_module_pubspec.yaml"

  deps = [
    ":shell.ermine",
    "//sdk/fidl/fuchsia.modular",
    "//third_party/dart-pkg/git/flutter/packages/flutter",
    "//topaz/public/dart/widgets:lib.widgets",
    "//topaz/public/lib/widgets/dart",
  ]
}

fidl("shell.ermine") {
  name = "fuchsia.shell.ermine"

  sources = [
    "lib/src/modules/ask.fidl",
  ]
}

modular_config("ermine_modular_config") {
  config = "config/modular_config.json"
}

config_data("ermine_fonts") {
  for_pkg = "fonts"

  sources = [
    "fonts/manifest.json",
  ]

  sources += rebase_path([
                           "RobotoMono-Light.ttf",
                           "RobotoMono-Medium.ttf",
                           "RobotoMono-Regular.ttf",
                         ],
                         "",
                         "//garnet/bin/fonts/third_party/robotomono/")

  outputs = [
    "fonts/{{source_file_part}}",
  ]
}
