# yaml-language-server: $schema=https://aka.ms/teams-toolkit/1.0.0/yaml.schema.json
# Visit https://aka.ms/teamsfx-v5.0-guide for details on this file
# Visit https://aka.ms/teamsfx-actions for details on actions
version: 1.0.0

projectId: {{projectId}}

environmentFolderPath: ./ {{~environmentFolder}}

# Triggered when 'teamsfx provision' is executed
provision:
{{#if activePlugins.fx-resource-aad-app-for-teams}}
  # Creates a new Microsoft Entra app to authenticate users if
  # the environment variable that stores clientId is empty
  - uses: aadApp/create
    with:
      # Note: when you run aadApp/update, the Microsoft Entra app name will be updated
      # based on the definition in manifest. If you don't want to change the
      # name, make sure the name in Microsoft Entra manifest is the same with the name
      # defined here.
      name: {{aadAppName}}
      # If the value is false, the action will not generate client secret for you
      generateClientSecret: true
      # Authenticate users with a Microsoft work or school account in your
      # organization's Microsoft Entra tenant (for example, single tenant).
      signInAudience: "AzureADMyOrg"
    # Write the information of created resources into environment file for the
    # specified environment variable(s).
    writeToEnvironmentFile:
      clientId: AAD_APP_CLIENT_ID
      # Environment variable that starts with `SECRET_` will be stored to the
      # .env.{envName}.user environment file
      clientSecret: SECRET_AAD_APP_CLIENT_SECRET
      objectId: AAD_APP_OBJECT_ID
      tenantId: AAD_APP_TENANT_ID
      authority: AAD_APP_OAUTH_AUTHORITY
      authorityHost: AAD_APP_OAUTH_AUTHORITY_HOST
{{/if}}
  # Creates a Teams app
  - uses: teamsApp/create
    with:
      # Teams app name
      name: {{teamsAppName}}
    # Write the information of created resources into environment file for
    # the specified environment variable(s).
    writeToEnvironmentFile:
      teamsAppId: TEAMS_APP_ID
{{#if activePlugins.fx-resource-bot}}
  # Create or reuse an existing Microsoft Entra application for bot.
  - uses: botAadApp/create
    with:
      # The Microsoft Entra application's display name
      name: {{appName}}bt$\{{RESOURCE_SUFFIX}}
    writeToEnvironmentFile:
      # The Microsoft Entra application's client id created for bot.
      botId: BOT_ID
      # The Microsoft Entra application's client secret created for bot.
      botPassword: SECRET_BOT_PASSWORD
{{/if}}
  - uses: arm/deploy  # Deploy given ARM templates parallelly.
    with:
      # AZURE_SUBSCRIPTION_ID is a built-in environment variable,
      # if its value is empty, TeamsFx will prompt you to select a subscription.
      # Referencing other environment variables with empty values
      # will skip the subscription selection prompt.
      subscriptionId: $\{{AZURE_SUBSCRIPTION_ID}}
      # AZURE_RESOURCE_GROUP_NAME is a built-in environment variable,
      # if its value is empty, TeamsFx will prompt you to select or create one
      # resource group.
      # Referencing other environment variables with empty values
      # will skip the resource group selection prompt.
      resourceGroupName: $\{{AZURE_RESOURCE_GROUP_NAME}}
      templates:
        - path: ./templates/azure/main.bicep  # Relative path to this file
          # Relative path to this yaml file.
          # Placeholders will be replaced with corresponding environment
          # variable before ARM deployment.
          parameters: ./templates/azure/azure.parameters.$\{{TEAMSFX_ENV}}.json
          # Required when deploying ARM template
          deploymentName: teams_toolkit_deployment
      # Microsoft 365 Agents Toolkit will download this Bicep CLI version from GitHub. If you remove this config, it will use the Bicep CLI in your system's PATH.
      bicepCliVersion: v0.4.613
{{#if activePlugins.fx-resource-frontend-hosting}}
  - uses: azureStorage/enableStaticWebsite
    with:
      storageResourceId: $\{{ {{~placeholderMappings.[state.fx-resource-frontend-hosting.storageResourceId]~}} }}
      indexPage: index.html
      errorPage: error.html
{{/if}}
{{#if activePlugins.fx-resource-aad-app-for-teams}}
  # Apply the Microsoft Entra manifest to an existing Microsoft Entra app. Will use the object id in
  # manifest file to determine which Microsoft Entra app to update.
  - uses: aadApp/update
    with:
      # Relative path to this file. Environment variables in manifest will
      # be replaced before apply to Microsoft Entra app
      manifestPath: ./aad.manifest.json
      outputFilePath : ./build/aad.manifest.$\{{TEAMSFX_ENV}}.json
{{/if}}
  # Validate using manifest schema
  - uses: teamsApp/validateManifest
    with:
      # Path to manifest template
      manifestPath: ./appPackage/manifest.json
  # Build Teams app package with latest env value
  - uses: teamsApp/zipAppPackage
    with:
      # Path to manifest template
      manifestPath: ./appPackage/manifest.json
      outputZipPath: ./build/appPackage/appPackage.$\{{TEAMSFX_ENV}}.zip
      outputJsonPath: ./build/appPackage/manifest.$\{{TEAMSFX_ENV}}.json
  # Validate app package using validation rules
  - uses: teamsApp/validateAppPackage
    with:
      # Relative path to this file. This is the path for built zip file.
      appPackagePath: ./build/appPackage/appPackage.$\{{TEAMSFX_ENV}}.zip
  # Apply the Teams app manifest to an existing Teams app in
  # Teams Developer Portal.
  # Will use the app id in manifest file to determine which Teams app to update.
  - uses: teamsApp/update
    with:
      # Relative path to this file. This is the path for built zip file.
      appPackagePath: ./build/appPackage/appPackage.$\{{TEAMSFX_ENV}}.zip
{{#if isM365}}
  # Extend your Teams app to Outlook and the Microsoft 365 app
  - uses: teamsApp/extendToM365
    with:
      # Relative path to the build app package.
      appPackagePath: ./build/appPackage/appPackage.$\{{TEAMSFX_ENV}}.zip
    # Write the information of created resources into environment file for
    # the specified environment variable(s).
    writeToEnvironmentFile:
      titleId: M365_TITLE_ID
      appId: M365_APP_ID
{{/if}}

# Triggered when 'teamsfx deploy' is executed
deploy:
{{#if activePlugins.fx-resource-frontend-hosting}}
  # Run npm command
  - uses: cli/runNpmCommand
    name: install tab dependencies
    with:
      workingDirectory: tabs
      args: install
  # Run npm command
  - uses: cli/runNpmCommand
    name: build tab app
    {{#if activePlugins.fx-resource-aad-app-for-teams}}
    env:
      REACT_APP_CLIENT_ID: $\{{AAD_APP_CLIENT_ID}}
      REACT_APP_START_LOGIN_PAGE_URL: $\{{ {{~placeholderMappings.[state.fx-resource-frontend-hosting.endpoint]~}} }}/auth-start.html
      {{#if activePlugins.fx-resource-function}}
      REACT_APP_FUNC_ENDPOINT: $\{{ {{~placeholderMappings.[state.fx-resource-function.functionEndpoint]~}} }}
      REACT_APP_FUNC_NAME: {{defaultFunctionName}}
      {{/if}}
    {{/if}}
    with:
      workingDirectory: tabs
      args: run build --if-present
  # Deploy bits to Azure Storage Static Website
  - uses: azureStorage/deploy
    with:
      workingDirectory: tabs
      # Deploy base folder. This folder includes manifest files for Microsoft Entra app and Teams app that should be ignored using the ignoreFile.
      artifactFolder: build
      # The resource id of the cloud resource to be deployed to. 
      # This key will be generated by arm/deploy action automatically. 
      # You can replace it with your existing Azure Resource id 
      # or add it to your environment variable file.
      resourceId: $\{{ {{~placeholderMappings.[state.fx-resource-frontend-hosting.storageResourceId]~}} }}
{{/if}}
{{#if activePlugins.fx-resource-bot}}
  {{#if isFunctionBot}}
  - uses: cli/runNpmCommand
    name: install bot dependencies
    with:
      workingDirectory: bot
      args: install
    {{#if isTypescript}}
  - uses: cli/runNpmCommand
    name: build bot app
    with:
      workingDirectory: bot
      args: run build --if-present
    {{/if}}
  # Deploy your application to Azure Functions using the zip deploy feature.
  # For additional details, see at https://aka.ms/zip-deploy-to-azure-functions
  - uses: azureFunctions/zipDeploy
    with:
      workingDirectory: bot
      # Deploy base folder
      artifactFolder: .
      # Ignore file location, leave blank will ignore nothing
      ignoreFile: .funcignore
      # The resource id of the cloud resource to be deployed to. 
      # This key will be generated by arm/deploy action automatically. 
      # You can replace it with your existing Azure Resource id 
      # or add it to your environment variable file.
      resourceId: $\{{ {{~botResourceId~}} }}
  {{else}}
  # Run npm command
  - uses: cli/runNpmCommand
    name: install bot dependencies
    with:
      workingDirectory: bot
      args: install
    {{#if isTypescript}}
  # Run npm command
  - uses: cli/runNpmCommand
    name: build bot app
    with:
      workingDirectory: bot
      args: run build --if-present
    {{/if}}
  # Deploy your application to Azure App Service using the zip deploy feature.
  # For additional details, refer to https://aka.ms/zip-deploy-to-app-services.
  - uses: azureAppService/zipDeploy
    with:
      workingDirectory: bot
      # Deploy base folder.
      artifactFolder: .
      # The resource id of the cloud resource to be deployed to. 
      # This key will be generated by arm/deploy action automatically. 
      # You can replace it with your existing Azure Resource id 
      # or add it to your environment variable file.
      resourceId: $\{{ {{~botResourceId~}} }}
  {{/if}}
{{/if}}
{{#if activePlugins.fx-resource-function}}
  # Install development tool(s)
  - uses: devTool/install
    with:      
      dotnet: true
    # Write the information of installed development tool(s) into environment
    # file for the specified environment variable(s).
    writeToEnvironmentFile:
      dotnetPath: DOTNET_PATH
  - uses: cli/runNpmCommand
    name: install api dependencies
    with:
      workingDirectory: api
      args: install
  - uses: cli/runDotnetCommand
    with:
      workingDirectory: api
      args: build extensions.csproj -o bin --ignore-failed-sources
      execPath: $\{{ {{~dotnetPath~}} }} # Use dotnet installed by devTool/install action
    {{#if isTypescript}}
  - uses: cli/runNpmCommand
    name: build api app
    with:
      workingDirectory: api
      args: run build --if-present
    {{/if}}
  # Deploy your application to Azure Functions using the zip deploy feature.
  # For additional details, see at https://aka.ms/zip-deploy-to-azure-functions
  - uses: azureFunctions/zipDeploy
    with:
      workingDirectory: api
      # Deploy base folder
      artifactFolder: .
      # Ignore file location, leave blank will ignore nothing
      ignoreFile: .funcignore
      # The resource id of the cloud resource to be deployed to. 
      # This key will be generated by arm/deploy action automatically. 
      # You can replace it with your existing Azure Resource id 
      # or add it to your environment variable file.
      resourceId: $\{{ {{~placeholderMappings.[state.fx-resource-function.functionAppResourceId]~}} }}
{{/if}}

# Triggered when 'teamsfx publish' is executed
publish:
  # Validate using manifest schema
  - uses: teamsApp/validateManifest
    with:
      # Path to manifest template
      manifestPath: ./appPackage/manifest.json
  # Build Teams app package with latest env value
  - uses: teamsApp/zipAppPackage
    with:
      # Path to manifest template
      manifestPath: ./appPackage/manifest.json
      outputZipPath: ./build/appPackage/appPackage.$\{{TEAMSFX_ENV}}.zip
      outputJsonPath: ./build/appPackage/manifest.$\{{TEAMSFX_ENV}}.json
  # Validate app package using validation rules
  - uses: teamsApp/validateAppPackage
    with:
      # Relative path to this file. This is the path for built zip file.
      appPackagePath: ./build/appPackage/appPackage.$\{{TEAMSFX_ENV}}.zip
  # Apply the Teams app manifest to an existing Teams app in
  # Teams Developer Portal.
  # Will use the app id in manifest file to determine which Teams app to update.
  - uses: teamsApp/update
    with:
      # Relative path to this file. This is the path for built zip file.
      appPackagePath: ./build/appPackage/appPackage.$\{{TEAMSFX_ENV}}.zip
  # Publish the app to
  # Teams Admin Center (https://admin.teams.microsoft.com/policies/manage-apps)
  # for review and approval
  - uses: teamsApp/publishAppPackage
    with:
      appPackagePath: ./build/appPackage/appPackage.$\{{TEAMSFX_ENV}}.zip
    # Write the information of created resources into environment file for
    # the specified environment variable(s).
    writeToEnvironmentFile:
      publishedAppId: TEAMS_APP_PUBLISHED_APP_ID