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

<div class="box box-info">
	<div class="box-header with-border">
		<h3 class="box-title">
			{{policy.tags.policyId}}
			<small>{{policy.tags.site}}</small>
		</h3>
	</div>

	<div class="box-body">
		<div class="row">
			<div class="col-xs-8">
				<div class="inline-group">
					<dl><dt>Data Source</dt><dd>{{policy.tags.dataSource}}</dd></dl>
					<dl><dt>Status</dt><dd>
						<span ng-show="policy.enabled" class="text-muted"><i class="fa fa-square text-green"></i> Enabled</span>
						<span ng-show="!policy.enabled" class="text-muted"><i class="fa fa-square text-muted"></i> Disabled</span>
					</dd></dl>
				</div>
				<div class="inline-group">
					<dl><dt>Description</dt><dd>{{policy.desc}}</dd></dl>
				</div>
				<div class="inline-group">
					<dl><dt>Alert</dt><dd>
						<a href="mailto:{{mail}}" ng-repeat="mail in policy.__mailList track by $index" style="margin-right: 10px;">{{mail}}</a>
					</dd></dl>
				</div>
			</div>
			<div class="col-xs-4 text-right" ng-show="Auth.isRole('ROLE_ADMIN')">
				<a class="btn btn-primary" href="#/common/policyEdit/{{policy.encodedRowkey}}">Edit</a>
				<button class="btn btn-warning" ng-show="!policy.enabled" ng-click="updatePolicyStatus(policy, true)">Enable</button>
				<button class="btn btn-warning" ng-show="policy.enabled" ng-click="updatePolicyStatus(policy, false)">Disable</button>
				<button class="btn btn-danger" ng-click="deletePolicy(policy)">Delete</button>
			</div>
		</div>
	</div>

	<div class="overlay" ng-hide="policyList._promise.$$state.status === 1;">
		<i class="fa fa-refresh fa-spin"></i>
	</div>

	<div class="box-footer clearfix">
		<a data-toggle="collapse" href="[data-id='query']">
			View Query
		</a>
		<div data-id="query" class="collapse in">
			<pre>{{policy.__expression}}</pre>
		</div>
	</div>
</div>

<div class="nav-tabs-custom">
	<ul class="nav nav-tabs">
		<li class="active">
			<a href="[data-id='visualization']" data-toggle="tab">Visualization</a>
		</li>
		<li>
			<a href="[data-id='statistics']" data-toggle="tab">Statistics</a>
		</li>
		<li>
			<a href="[data-id='alerts']" data-toggle="tab">Alerts</a>
		</li>
	</ul>
	<div class="tab-content">
		<div class="tab-pane active" data-id="visualization">
			<div class="row">
				<div class="col-xs-6">
					<div nvd3="policyEvalSeries" data-title="Policy Eval Count" data-config="chartConfig" class="nvd3-chart-cntr"></div>
				</div>
				<div class="col-xs-6">
					<div nvd3="policyEvalFailSeries" data-title="Policy Eval Fail Count" data-config="chartConfig" class="nvd3-chart-cntr"></div>
				</div>
				<div class="col-xs-6">
					<div nvd3="alertSeries" data-title="Alert Count" data-config="chartConfig" class="nvd3-chart-cntr"></div>
				</div>
				<div class="col-xs-6">
					<div nvd3="alertFailSeries" data-title="Alert Fail Count" data-config="chartConfig" class="nvd3-chart-cntr"></div>
				</div>
			</div>
		</div>

		<div class="tab-pane" data-id="statistics">
			<div class="row">
				<div class="col-xs-3">
					<div class="info-box bg-aqua">
						<span class="info-box-icon"><i class="fa fa-bookmark-o"></i></span>
						<div class="info-box-content">
							<span class="info-box-text">Policy Eval Count</span>
							<span class="info-box-number">{{common.array.sum(policyEvalSeries, "1")}} <small>(Monthly)</small></span>
							<span class="info-box-number">{{policyEvalSeries[policyEvalSeries.length - 1][1]}} <small>(Daily)</small></span>
						</div>
					</div>
				</div>
				<div class="col-xs-3">
					<div class="info-box bg-red">
						<span class="info-box-icon"><i class="fa fa-bookmark-o"></i></span>
						<div class="info-box-content">
							<span class="info-box-text">Policy Eval Fail Count</span>
							<span class="info-box-number">{{common.array.sum(policyEvalFailSeries, "1")}} <small>(Monthly)</small></span>
							<span class="info-box-number">{{policyEvalFailSeries[policyEvalFailSeries.length - 1][1]}} <small>(Daily)</small></span>
						</div>
					</div>
				</div>
				<div class="col-xs-3">
					<div class="info-box bg-aqua">
						<span class="info-box-icon"><i class="fa fa-bookmark-o"></i></span>
						<div class="info-box-content">
							<span class="info-box-text">Alert Count</span>
							<span class="info-box-number">{{common.array.sum(alertSeries, "1")}} <small>(Monthly)</small></span>
							<span class="info-box-number">{{alertSeries[alertSeries.length - 1][1]}} <small>(Daily)</small></span>
						</div>
					</div>
				</div>
				<div class="col-xs-3">
					<div class="info-box bg-red">
						<span class="info-box-icon"><i class="fa fa-bookmark-o"></i></span>
						<div class="info-box-content">
							<span class="info-box-text">Alert Fail Count</span>
							<span class="info-box-number">{{common.array.sum(alertFailSeries, "1")}} <small>(Monthly)</small></span>
							<span class="info-box-number">{{alertFailSeries[alertFailSeries.length - 1][1]}} <small>(Daily)</small></span>
						</div>
					</div>
				</div>
			</div>
		</div>

		<div class="tab-pane" data-id="alerts">
			<div sorttable source="alertList" sort="-timestamp">
				<table class="table table-bordered" ng-non-bindable>
					<thead>
						<tr>
							<th width="170" sortpath="timestamp">Alert Time</th>
							<th width="170" sortpath="alertContext.properties.timestamp">Message Time</th>
							<th width="60" sortpath="alertContext.properties.user">User</th>
							<th width="150" sortpath="alertContext.properties.host">Host</th>
							<th sortpath="alertContext.properties.emailMessage">Description</th>
							<th width="50"> </th>
						</tr>
					</thead>
					<tbody>
						<tr ng-class="{info : item.__new}">
							<td>{{common.format.date(item.timestamp)}}</td>
							<td>{{common.format.date(item.alertContext.properties.timestamp)}}</td>
							<td>{{item.alertContext.properties.user}}</td>
							<td>{{item.alertContext.properties.host}}</td>
							<td>{{item.alertContext.properties.alertMessage}}</td>
							<td><a href="#/common/alertDetail/{{item.encodedRowkey}}">Detail</a></td>
						</tr>
					</tbody>
				</table>
			</div>
		</div>

	</div>
</div>