{#
 Licensed to the Apache Software Foundation (ASF) under one
 or more contributor license agreements.  See the NOTICE file
 distributed with this work for additional information
 regarding copyright ownership.  The ASF licenses this file
 to you under the Apache License, Version 2.0 (the
 "License"); you may not use this file except in compliance
 with the License.  You may obtain a copy of the License at

   http://www.apache.org/licenses/LICENSE-2.0

 Unless required by applicable law or agreed to in writing,
 software distributed under the License is distributed on an
 "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 KIND, either express or implied.  See the License for the
 specific language governing permissions and limitations
 under the License.
#}

{% extends base_template %}
{% from 'airflow/dataset_next_run_modal.html' import dataset_next_run_modal %}
{% from 'appbuilder/dag_docs.html' import dag_docs %}

{% block page_title %}{{ dag.dag_id }} - {{ appbuilder.app_name }}{% endblock %}

{% block head_css %}
  {{ super() }}
  <link rel="stylesheet" type="text/css" href="{{ url_for_asset('switch.css') }}">
{% endblock %}

{% set dag_is_paused = dag.get_is_paused() %}
{% set base_date_arg = request.args.get('base_date') %}
{% set num_runs_arg = request.args.get('num_runs') %}
{% if execution_date is defined %}
  {% set execution_date_arg = execution_date %}
{% else %}
  {% set execution_date_arg = request.args.get('execution_date') %}
{% endif %}

{% block head_meta %}
  {{ super() }}
  <meta name="dag_id" content="{{ dag.dag_id }}">
  <meta name="dag_timezone" content="{{ dag.timezone.name }}">
  <!-- Urls -->
  <meta name="logs_with_metadata_url" content="{{ url_for('Airflow.get_logs_with_metadata') }}">
  <meta name="external_log_url" content="{{ url_for('Airflow.redirect_to_external_log') }}">
  <meta name="extra_links_url" content="{{ url_for('Airflow.extra_links') }}">
  <meta name="paused_url" content="{{ url_for('Airflow.paused') }}">
  <meta name="dagrun_clear_url" content="{{ url_for('Airflow.dagrun_clear') }}">
  <meta name="dagrun_failed_url" content="{{ url_for('Airflow.dagrun_failed') }}">
  <meta name="dagrun_success_url" content="{{ url_for('Airflow.dagrun_success') }}">
  <meta name="dagrun_queued_url" content="{{ url_for('Airflow.dagrun_queued') }}">
  <meta name="clear_url" content="{{ url_for('Airflow.clear') }}">
  <meta name="failed_url" content="{{ url_for('Airflow.failed') }}">
  <meta name="success_url" content="{{ url_for('Airflow.success') }}">
  <meta name="confirm_url" content="{{ url_for('Airflow.confirm') }}">
  <meta name="grid_data_url" content="{{ url_for('Airflow.grid_data') }}">
  <meta name="graph_data_url" content="{{ url_for('Airflow.graph_data') }}">
  <meta name="next_run_datasets_url" content="{{ url_for('Airflow.next_run_datasets', dag_id=dag.dag_id) }}">
  <meta name="grid_url" content="{{ url_for('Airflow.grid', dag_id=dag.dag_id) }}">
  <meta name="datasets_url" content="{{ url_for('Airflow.datasets') }}">
  <meta name="grid_url_no_root" content="{{ url_for('Airflow.grid', dag_id=dag.dag_id, num_runs=num_runs_arg, base_date=base_date_arg) }}">
  <meta name="graph_url" content="{{ url_for('Airflow.graph', dag_id=dag.dag_id, root=root) }}">
  <meta name="task_url" content="{{ url_for('Airflow.task', dag_id=dag.dag_id) }}">
  <meta name="log_url" content="{{ url_for('Airflow.log', dag_id=dag.dag_id) }}">
  <meta name="rendered_templates_url" content="{{ url_for('Airflow.rendered_templates', dag_id=dag.dag_id) }}">
  <meta name="rendered_k8s_url" content="{{ url_for('Airflow.rendered_k8s', dag_id=dag.dag_id) }}">
  <meta name="task_instances_list_url" content="{{ url_for('TaskInstanceModelView.list') }}">
  <meta name="tag_index_url" content="{{ url_for('Airflow.index', tags='_TAG_NAME_') }}">
  <meta name="mapped_instances_api" content="{{ url_for('/api/v1.airflow_api_connexion_endpoints_task_instance_endpoint_get_mapped_task_instances', dag_id=dag.dag_id, dag_run_id='_DAG_RUN_ID_', task_id='_TASK_ID_') }}">
  <meta name="task_log_api" content="{{ url_for('/api/v1.airflow_api_connexion_endpoints_log_endpoint_get_log', dag_id=dag.dag_id, dag_run_id='_DAG_RUN_ID_', task_id='_TASK_ID_', task_try_number='-1') }}">
  <meta name="task_xcom_entries_api" content="{{ url_for('/api/v1.airflow_api_connexion_endpoints_xcom_endpoint_get_xcom_entries', dag_id=dag.dag_id, dag_run_id='_DAG_RUN_ID_', task_id='_TASK_ID_') }}">
  <meta name="task_xcom_entry_api" content="{{ url_for('/api/v1.airflow_api_connexion_endpoints_xcom_endpoint_get_xcom_entry', dag_id=dag.dag_id, dag_run_id='_DAG_RUN_ID_', task_id='_TASK_ID_', xcom_key='_XCOM_KEY_') }}">
  <meta name="upstream_dataset_events_api" content="{{ url_for('/api/v1.airflow_api_connexion_endpoints_dag_run_endpoint_get_upstream_dataset_events', dag_id=dag.dag_id, dag_run_id='_DAG_RUN_ID_') }}">
  <meta name="task_instance_api" content="{{ url_for('/api/v1.airflow_api_connexion_endpoints_task_instance_endpoint_get_task_instance', dag_id=dag.dag_id, dag_run_id='_DAG_RUN_ID_', task_id='_TASK_ID_') }}">
  <meta name="set_task_instance_note" content="{{ url_for('/api/v1.airflow_api_connexion_endpoints_task_instance_endpoint_set_task_instance_note', dag_id=dag.dag_id, dag_run_id='_DAG_RUN_ID_', task_id='_TASK_ID_' ) }}">
  <meta name="set_mapped_task_instance_note" content="{{ url_for('/api/v1.airflow_api_connexion_endpoints_task_instance_endpoint_set_mapped_task_instance_note', dag_id=dag.dag_id, dag_run_id='_DAG_RUN_ID_', task_id='_TASK_ID_', map_index=0 ) }}">
  <meta name="set_dag_run_note" content="{{ url_for('/api/v1.airflow_api_connexion_endpoints_dag_run_endpoint_set_dag_run_note', dag_id=dag.dag_id, dag_run_id='_DAG_RUN_ID_') }}">
  <meta name="dag_api" content="{{ url_for('/api/v1.airflow_api_connexion_endpoints_dag_endpoint_get_dag', dag_id=dag.dag_id) }}">
  <meta name="dag_source_api" content="{{ url_for('/api/v1.airflow_api_connexion_endpoints_dag_source_endpoint_get_dag_source', file_token='_FILE_TOKEN_') }}">
  <meta name="dag_details_api" content="{{ url_for('/api/v1.airflow_api_connexion_endpoints_dag_endpoint_get_dag_details', dag_id=dag.dag_id) }}">

  <!-- End Urls -->
  <meta name="is_paused" content="{{ dag_is_paused }}">
  <meta name="csrf_token" content="{{ csrf_token() }}">
  <meta name="k8s_or_k8scelery_executor" content="{{ k8s_or_k8scelery_executor }}">
  {% if dag_model is defined and dag_model.next_dagrun_create_after is defined and dag_model.next_dagrun_create_after is not none %}
    <meta name="next_dagrun_create_after" content="{{ dag_model.next_dagrun_create_after }}">
    <meta name="next_dagrun_data_interval_start" content="{{ dag_model.next_dagrun_data_interval_start }}">
    <meta name="next_dagrun_data_interval_end" content="{{ dag_model.next_dagrun_data_interval_end }}">
  {% endif %}
  {% if show_external_log_redirect is defined %}
    <meta name="show_external_log_redirect" content="{{ show_external_log_redirect }}">
  {% endif %}
  {% if external_log_name is defined %}
  <meta name="external_log_name" content="{{ external_log_name }}">
  {% endif %}
  <meta name="can_edit" content="{{ dag.can_edit }}">
{% endblock %}

{% block content %}
  {% if dag.parent_dag is defined and dag.parent_dag %}
    <a href="{{ url_for('Airflow.' + dag.default_view, dag_id=dag.parent_dag.dag_id, base_date=base_date_arg, execution_date=execution_date_arg) }}" title="Go to parent DAG">
      <span class="material-icons" aria-hidden="true">keyboard_arrow_up</span>
      DAG: {{ dag.parent_dag.dag_id }}</a>
  {% endif %}

  <div>
    <div>
      <h3 class="pull-left">
        {% if dag.parent_dag is defined and dag.parent_dag %}
          <span class="text-muted">SUBDAG:</span> {{ dag.dag_id }}
        {% else %}
          {% if can_edit_dag %}
            {% set switch_tooltip = 'Pause/Unpause DAG' %}
          {% else %}
            {% set switch_tooltip = 'DAG is Paused' if dag_is_paused else 'DAG is Active' %}
          {% endif %}
          <label class="switch-label{{' disabled' if not can_edit_dag else ''  }} js-tooltip" title="{{ switch_tooltip }}">
            <input class="switch-input" id="pause_resume" data-dag-id="{{ dag.dag_id }}"
                   type="checkbox"{{ " checked" if not dag_is_paused else "" }}
                   {{ " disabled" if not can_edit_dag else "" }}>
            <span class="switch" aria-hidden="true"></span>
          </label>
          <span class="text-muted">DAG:</span> {{ dag.dag_id }}
          <small class="text-muted">{{ dag.description[0:150] + '…' if dag.description and dag.description|length > 150 else dag.description|default('', true) }}</small>
        {% endif %}
        {% if root %}
          <span class="text-muted">ROOT:</span> {{ root }}
        {% endif %}
      </h3>
    </div>
    <div>
      <h4 class="pull-right js-dataset-triggered" style="user-select: none;-moz-user-select: auto;">
        {% if state_token is defined and state_token %}
          {{ state_token }}
        {% endif %}
        <a class="label label-default" href="{{ url_for('DagRunModelView.list') }}?_flt_3_dag_id={{ dag.dag_id }}">
          Schedule: {{ dag_model is defined and dag_model and dag_model.schedule_interval }}
        </a>
        {% if dag_model is defined and dag_model and dag_model.timetable_description %}
            <span class="material-icons text-muted js-tooltip" aria-hidden="true" data-original-title="Schedule: {{ dag_model.timetable_description|string }}">info</span>
        {% endif %}
        {% if dag_model is defined and dag_model.next_dagrun is defined and dag_model.schedule_interval != 'Dataset' %}
          <p class="label label-default js-tooltip" style="margin-left: 5px" id="next-run" data-html="true" data-placement="bottom">
            Next Run: <time datetime="{{ dag_model.next_dagrun }}">{{ dag_model.next_dagrun }}</time>
          </p>
        {% endif %}
        {% if dag_model is defined and dag_model.schedule_interval is defined and dag_model.schedule_interval == 'Dataset' %}
          {%- with ds_info = dag_model.get_dataset_triggered_next_run_info() -%}
            <span
              id="next-dataset-tooltip"
              class="js-tooltip"
              title="Click to see dataset details."
              data-html="true"
              data-placement="bottom"
              data-uri="{{ ds_info.uri }}"
            >
                <p
                  class="label label-default next-dataset-triggered"
                  style="margin-left: 5px;"
                  data-summary="
                    {%- if ds_info.total == 1 -%}
                    On {{ ds_info.uri }}
                    {%- else -%}
                    {{ ds_info.ready }} of {{ ds_info.total }} datasets updated
                    {%- endif -%}"
                  >
                  {% if ds_info.total == 1 -%}
                    On {{ ds_info.uri }}
                  {%- else -%}
                  {{ ds_info.ready }} of {{ ds_info.total }} datasets updated
                  {%- endif %}
                </p>
            </span>
          {%- endwith -%}
        {% endif %}
      </h4>
    </div>
  </div>
  <div class="clearfix"></div>
  <br>
  <div>
    <div class="row">
      <div class="col-md-10">
        <ul class="nav nav-pills">
          <li id="grid-nav"><a href="{{ url_for('Airflow.grid', dag_id=dag.dag_id, num_runs=num_runs_arg, root=root, base_date=base_date_arg) }}">
            <span class="material-icons" aria-hidden="true">grid_on</span>
            Grid
          </a></li>
          <li id="graph-nav"><a href="{{ url_for('Airflow.graph', dag_id=dag.dag_id, root=root, num_runs=num_runs_arg, base_date=base_date_arg, execution_date=execution_date_arg) }}">
            <span class="material-icons" aria-hidden="true">account_tree</span>
            Graph</a></li>
          <li><a href="{{ url_for('Airflow.calendar', dag_id=dag.dag_id) }}">
            <span class="material-icons" aria-hidden="true">event</span>
            Calendar
          </a></li>
          <li><a href="{{ url_for('Airflow.duration', dag_id=dag.dag_id, days=30, root=root, num_runs=num_runs_arg, base_date=base_date_arg) }}">
            <span class="material-icons" aria-hidden="true">hourglass_bottom</span>
            Task Duration</a></li>
          <li><a href="{{ url_for('Airflow.tries', dag_id=dag.dag_id, days=30, root=root, num_runs=num_runs_arg, base_date=base_date_arg) }}">
            <span class="material-icons" aria-hidden="true">repeat</span>
            Task Tries</a></li>
          <li><a href="{{ url_for('Airflow.landing_times', dag_id=dag.dag_id, days=30, root=root, num_runs=num_runs_arg, base_date=base_date_arg) }}">
            <span class="material-icons" aria-hidden="true">flight_land</span>
            Landing Times</a></li>
          <li id="gantt-nav"><a href="{{ url_for('Airflow.gantt', dag_id=dag.dag_id, root=root, num_runs=num_runs_arg, base_date=base_date_arg, execution_date=execution_date_arg) }}">
            <span class="material-icons" aria-hidden="true">vertical_distribute</span>
            Gantt</a></li>
          <li><a href="{{ url_for('Airflow.dag_details', dag_id=dag.dag_id) }}">
            <span class="material-icons" aria-hidden="true">details</span>
            Details</a></li>
          <li id="code-nav"><a href="{{ url_for('Airflow.code', dag_id=dag.dag_id, root=root) }}">
            <span class="material-icons" aria-hidden="true">code</span>
            Code</a></li>
          <li><a href="{{ url_for('Airflow.audit_log', dag_id=dag.dag_id, root=root) }}">
            <span class="material-icons" aria-hidden="true">plagiarism</span>
            Audit Log</a></li>
        </ul>
      </div>
      <div class="col-md-2">
        <div class="btn-group pull-right">
          {% if show_trigger_form_if_no_params %}
          <div class="dropdown">
            <a aria-label="Trigger DAG" class="btn btn-default btn-icon-only{{ ' disabled' if not dag.can_trigger }} trigger-dropdown-btn" data-toggle="dropdown">
              <span class="material-icons" aria-hidden="true">play_arrow</span>
              </a>
            <ul class="dropdown-menu trigger-dropdown-menu">
              <li>
                <form method="POST" action="{{ url_for('Airflow.trigger', dag_id=dag.dag_id) }}">
                  <input type="hidden" name="csrf_token" value="{{ csrf_token() }}">
                  <input type="hidden" name="dag_id" value="{{ dag.dag_id }}">
                  <input type="hidden" name="unpause" value="True">
                  <!-- for task instance detail pages, dag_id is still a query param -->
                  {% if 'dag_id' in request.args %}
                    <input type="hidden" name="origin" value="{{ url_for(request.endpoint, **request.args) }}">
                  {% else %}
                    <input type="hidden" name="origin" value="{{ url_for(request.endpoint, dag_id=dag.dag_id, **request.args) }}">
                  {% endif %}
                  <button type="submit" class="dropdown-form-btn">Trigger DAG</button>
                </form>
              </li>
              <li>
                {% if 'dag_id' in request.args %}
                  <a href="{{ url_for('Airflow.trigger', dag_id=dag.dag_id, origin=url_for(request.endpoint, **request.args)) }}">
                {% else %}
                  <a href="{{ url_for('Airflow.trigger', dag_id=dag.dag_id, origin=url_for(request.endpoint, dag_id=dag.dag_id, **request.args)) }}">
                {% endif %}
                Trigger DAG w/ config</a></li>
            </ul>
          </div>
          {% else %}
          {% if 'dag_id' in request.args %}
            <a href="{{ url_for('Airflow.trigger', dag_id=dag.dag_id, origin=url_for(request.endpoint, **request.args)) }}"
          {% else %}
            <a href="{{ url_for('Airflow.trigger', dag_id=dag.dag_id, origin=url_for(request.endpoint, dag_id=dag.dag_id, **request.args)) }}"
          {% endif %}
              onclick="return triggerDag(this, '{{ dag.dag_id }}')" title="Trigger&nbsp;DAG"
              aria-label="Trigger DAG"
              class="btn btn-default btn-icon-only{{ ' disabled' if not dag.can_trigger }} trigger-dropdown-btn">
              <span class="material-icons" aria-hidden="true">play_arrow</span>
          </a>
          {% endif %}
          <a href="{{ url_for('Airflow.delete', dag_id=dag.dag_id, redirect_url=url_for(request.endpoint, dag_id=dag.dag_id)) }}"
            title="Delete&nbsp;DAG"
            aria-label="Delete DAG"
            class="btn btn-default btn-icon-only{{ ' disabled' if not dag.can_delete }}"
            onclick="return confirmDeleteDag(this, '{{ dag.safe_dag_id }}')">
            <span class="material-icons text-danger" aria-hidden="true">delete_outline</span>
          </a>
        </div>
      </div>
    </div>
  </div>
  {{ dag_docs(doc_md) }}
  <!-- Modal for dataset-triggered next run -->
  {{ dataset_next_run_modal(id='dataset-next-run-modal') }}
{% endblock %}
{% block tail %}
  {{ super() }}
  <script src="{{ url_for_asset('dag.js') }}"></script>
  <script>
    // Tests rely on confirmDeleteDag to be in the html
    function confirmDeleteDag(link, id) {
      if (confirm(`Are you sure you want to delete '${id}' now?\n\
        This option will delete ALL metadata, DAG runs, etc.\n\
        EXCEPT Log.\n\
        This cannot be undone.`)) {
        postAsForm(link.href, {});
      }
      return false;
    }

    function triggerDag(link, dagId) {
      postAsForm(link.href, {});
      return false;
    }
  </script>
{% endblock %}
