# Copyright 2016 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/package.gni")

declare_args() {
  # A path to the Armadillo contextual config file. This path will be
  # interpretted as relative to this package's directory unless it starts with
  # a "//" in which case it will be considered relative to the Fuchsia source
  # directory. If the path starts with a single slash it will be treated as an
  # absolute path
  armadillo_path_context_config =
      "../bin/session_shell/armadillo_session_shell/assets/contextual_config.json"
}

assert(armadillo_path_context_config != "")

package("sysui") {
  deprecated_system_image = true

  resources = [
    {
      path = rebase_path(
              "agents/home_work_agent/assets/contextual_location_proposals.json")
      dest = "sysui/contextual_location_proposals.json"
    },

    {
      path = rebase_path("../bin/session_shell/armadillo_session_shell/assets/AgentIcon.png")
      dest = "sysui/AgentIcon.png"
    },

    {
      path = rebase_path("../bin/session_shell/armadillo_session_shell/assets/aparna-home.jpg")
      dest = "sysui/aparna-home.jpg"
    },

    {
      path = rebase_path("../bin/session_shell/armadillo_session_shell/assets/aparna-sf.jpg")
      dest = "sysui/aparna-sf.jpg"
    },

    {
      path = rebase_path("../bin/session_shell/armadillo_session_shell/assets/aparna-work.jpg")
      dest = "sysui/aparna-work.jpg"
    },

    {
      path = rebase_path("../bin/session_shell/armadillo_session_shell/assets/danielle-home.jpg")
      dest = "sysui/danielle-home.jpg"
    },

    {
      path = rebase_path("agents/home_work_agent/assets/ask_proposals.json")
      dest = "sysui/ask_proposals.json"
    },

    {
      path = rebase_path("agents/home_work_agent/assets/google_photos.png")
      dest = "sysui/google_photos.png"
    },

    {
      path = rebase_path("agents/home_work_agent/assets/panda.png.jpg")
      dest = "sysui/panda.png.jpg"
    },

    {
      path = rebase_path("agents/home_work_agent/assets/pavlova.jpg")
      dest = "sysui/pavlova.jpg"
    },

    {
      path = rebase_path("agents/home_work_agent/assets/shamra.jpg")
      dest = "sysui/shamra.jpg"
    },

    {
      path = rebase_path("agents/home_work_agent/assets/slides.png")
      dest = "sysui/slides.png"
    },

    {
      path = rebase_path("agents/home_work_agent/assets/story_fluxMemories.png")
      dest = "sysui/story_fluxMemories.png"
    },

    {
      path = rebase_path("agents/home_work_agent/assets/story_googleIO.png")
      dest = "sysui/story_googleIO.png"
    },

    {
      path = rebase_path("agents/home_work_agent/assets/story_hype.png")
      dest = "sysui/story_hype.png"
    },

    {
      path = rebase_path("agents/home_work_agent/assets/story_natureSense.png")
      dest = "sysui/story_natureSense.png"
    },

    {
      path = rebase_path("agents/home_work_agent/assets/story_topcook.png")
      dest = "sysui/story_topcook.png"
    },

    {
      path =
          rebase_path("agents/home_work_agent/assets/1-portugal-the-man.jpeg")
      dest = "sysui/1-portugal-the-man.jpeg"
    },

    {
      path = rebase_path("agents/home_work_agent/assets/9-hotel.jpg")
      dest = "sysui/9-hotel.jpg"
    },

    {
      path = rebase_path("agents/home_work_agent/assets/9-nonch-harpin.png")
      dest = "sysui/9-nonch-harpin.png"
    },

    {
      path = rebase_path("agents/home_work_agent/assets/danielle_cc0.jpg")
      dest = "sysui/danielle_cc0.jpg"
    },

    {
      path = rebase_path(
              "agents/home_work_agent/assets/ic_stat_3_googblue_2x_web_24dp.png")
      dest = "sysui/ic_stat_3_googblue_2x_web_24dp.png"
    },

    {
      path = rebase_path("agents/home_work_agent/assets/calendar.png")
      dest = "sysui/calendar.png"
    },

    {
      path = rebase_path("agents/home_work_agent/assets/docs.png")
      dest = "sysui/docs.png"
    },

    {
      path = rebase_path("agents/home_work_agent/assets/drawing.jpeg")
      dest = "sysui/drawing.jpeg"
    },

    {
      path = rebase_path(
              "agents/home_work_agent/assets/logo_mostly_sunny_light_color_96dp.png")
      dest = "sysui/logo_mostly_sunny_light_color_96dp.png"
    },

    {
      path = rebase_path("agents/home_work_agent/assets/miguel_cc0.png")
      dest = "sysui/miguel_cc0.png"
    },

    {
      path = rebase_path("agents/home_work_agent/assets/sophie_cc0.jpg")
      dest = "sysui/sophie_cc0.jpg"
    },

    {
      path = rebase_path("agents/home_work_agent/assets/threepeaks.png")
      dest = "sysui/threepeaks.png"
    },

    {
      path = rebase_path("agents/home_work_agent/assets/truefood.png")
      dest = "sysui/truefood.png"
    },

    {
      path = rebase_path("agents/home_work_agent/assets/cinefilm_96.png")
      dest = "sysui/cinefilm_96.png"
    },

    {
      path = rebase_path("agents/home_work_agent/assets/expenses_96.png")
      dest = "sysui/expenses_96.png"
    },

    {
      path = rebase_path(
              "agents/home_work_agent/assets/logo_fitness_color_2x_web_96.png")
      dest = "sysui/logo_fitness_color_2x_web_96.png"
    },

    {
      path = rebase_path("agents/home_work_agent/assets/simon_96.jpg")
      dest = "sysui/simon_96.jpg"
    },

    {
      path = rebase_path("agents/home_work_agent/assets/story_calendar.png")
      dest = "sysui/story_calendar.png"
    },

    {
      path = rebase_path("agents/home_work_agent/assets/story_cinefilm.png")
      dest = "sysui/story_cinefilm.png"
    },

    {
      path = rebase_path("agents/home_work_agent/assets/story_expense.png")
      dest = "sysui/story_expense.png"
    },

    {
      path = rebase_path("agents/home_work_agent/assets/story_marketing.png")
      dest = "sysui/story_marketing.png"
    },

    {
      path = rebase_path("agents/home_work_agent/assets/story_overthrough.png")
      dest = "sysui/story_overthrough.png"
    },

    {
      path = rebase_path("agents/home_work_agent/assets/story_phonecall.png")
      dest = "sysui/story_phonecall.png"
    },

    {
      path = rebase_path("agents/home_work_agent/assets/story_steps.png")
      dest = "sysui/story_steps.png"
    },

    {
      path = rebase_path("agents/home_work_agent/assets/story_threepeaks.png")
      dest = "sysui/story_threepeaks.png"
    },

    {
      path = rebase_path("agents/home_work_agent/assets/story_toetheline.png")
      dest = "sysui/story_toetheline.png"
    },

    {
      path = rebase_path("agents/home_work_agent/assets/story_truefoods.png")
      dest = "sysui/story_truefoods.png"
    },

    {
      path = rebase_path("agents/home_work_agent/assets/tahiti_240.png")
      dest = "sysui/tahiti_240.png"
    },

    {
      path = rebase_path("agents/home_work_agent/assets/inbox_96dp.png")
      dest = "sysui/inbox_96dp.png"
    },

    {
      path = rebase_path("agents/home_work_agent/assets/music_96dp.png")
      dest = "sysui/music_96dp.png"
    },

    {
      path = rebase_path("agents/home_work_agent/assets/chat_96dp.png")
      dest = "sysui/chat_96dp.png"
    },

    {
      path = rebase_path("agents/home_work_agent/assets/youtube_96dp.png")
      dest = "sysui/youtube_96dp.png"
    },

    {
      path = rebase_path("agents/home_work_agent/assets/cc0_calafia.jpg")
      dest = "sysui/cc0_calafia.jpg"
    },

    {
      path = rebase_path("agents/home_work_agent/assets/cc0_music.jpg")
      dest = "sysui/cc0_music.jpg"
    },

    {
      path = rebase_path(armadillo_path_context_config)
      dest = "sysui/contextual_config.json"
    },
  ]
}

group("tests") {
  testonly = true

  deps = [
    # "armadillo:armadillo_tests",
    # "../bin/session_shell/capybara_session_shell:capybara_session_shell_tests",
    # "keyboard:keyboard_tests",
    "mondrian_story_shell:mondrian_story_shell_tests",
  ]
}
