<!--
  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.
-->
<ui-view>
    <section class="container bundle">
        <header class="row">
            <div class="col-md-12">
                <div class="media">
                    <div class="media-left">
                        <img ng-src="{{bundle | iconGeneratorPipe:'symbolicName'}}" class="media-object" alt="{{::bundle.symbolicName}}'s logo" />
                    </div>
                    <div class="media-body">
                        <div class="pull-right highlights" ng-bind-html="bundle | bundleHighlights"></div>
                        <h4 class="media-heading">
                            {{bundle | bundleName}}
                            <div class="btn-group" uib-dropdown dropdown-append-to-body="true">
                                <button uib-dropdown-toggle id="versions-dropdown" type="button" class="btn btn-sm btn-default"><span><i class="fa fa-code-fork"></i> {{::bundle.version}}</span> 
                                    <span class="caret" ng-if="bundleVersions && bundleVersions.length > 1"></span></button>
                                <ul class="dropdown-menu dropdown-menu-right versions-dropdown-list" uib-dropdown-menu role="menu" aria-labelledby="versions-dropdown">
                                    <li role="menuitem" ng-repeat="version in bundleVersions track by version">
                                        <a ui-sref="{bundleVersion: version}"><span><i class="fa fa-code-fork"></i> {{::version}}</span></a>
                                    </li>
                                </ul>
                            </div>
                            <a class="btn btn-sm btn-default" ng-href="{{downloadBundle()}}">
                                <i class="fa fa-fw fa-download"></i> Download
                            </a>
                        </h4>
                        <p class="media-auto-wrap text-muted" ng-if="bundle.symbolicName.startsWith('brooklyn-catalog-bom')"><small>
                            <i class="fa fa-fw fa-info-circle"></i> Bundle auto-generated from an uploaded BOM file
                        </small></p>
                        <p class="media-description">{{bundle | bundleDescription}}</p>
                    </div>
                </div>
            </div>
        </header>

        <div class="row">
            <div class="col-sm-9 col-xs-6">
                <input ng-model="state.search.$" type="text" placeholder="Search for types" class="form-control" />
            </div>
            <div class="col-sm-3 col-xs-6 text-right" ng-init="isDeleteOpened = false">
                <button class="btn btn-danger" ng-disabled="state.deleting" uib-popover-template="'deletePopoverTemplate.html'" popover-placement="bottom-right" popover-trigger="'outsideClick'" popover-append-to-body="true">
                    <i class="fa fa-fw fa-trash"></i> Delete bundle
                </button>
            </div>
        </div>
        <div class="row" ng-if="isNonEmpty(state.search)">
            <div class="col-md-12 clear-search" ng-click="clearSearchFilters()">
                <i class="fa fa-fw fa-window-close"></i> Clear current search query, filters, and sorts
            </div>
        </div>

        <div class="row">
            <div class="col-md-12">
                <header class="row filters">
                    <div class="col-sm-6">
                        <button class="btn btn-default btn-sm" ng-click="state.search.disabled = state.search.disabled ? undefined : true" ng-class="{'active': state.search.disabled}">
                            <i class="fa fa-fw fa-ban"></i> {{(bundle.types | filter:{disabled: true}).length}} Disabled
                        </button>
                        <button class="btn btn-default btn-sm" ng-click="state.search.deprecated = state.search.deprecated ? undefined : true" ng-class="{'active': state.search.deprecated}">
                            <i class="fa fa-fw fa-chain-broken"></i> {{(bundle.types | filter:{deprecated: true}).length}} Deprecated
                        </button>
                    </div>
                    <div class="col-sm-6 text-right">
                        <div class="btn-group" uib-dropdown>
                            <button type="button" class="btn btn-link" uib-dropdown-toggle>
                                Version <span class="caret"></span>
                            </button>
                            <ul class="dropdown-menu dropdown-menu-right" uib-dropdown-menu>
                                <li ng-repeat="version in typeVersions | orderBy:'-' track by version" ng-class="{'active': state.search.version === version}">
                                    <a ng-click="state.search.version = version">{{version}}</a>
                                </li>
                            </ul>
                        </div>
                        <div class="btn-group" uib-dropdown>
                            <button type="button" class="btn btn-link" uib-dropdown-toggle>
                                Sort <span class="caret"></span>
                            </button>
                            <ul class="dropdown-menu dropdown-menu-right" uib-dropdown-menu>
                                <li ng-repeat="orderBy in config.orderBy track by orderBy.id" ng-class="{'active': state.orderBy === orderBy}">
                                    <a ng-click="state.orderBy = orderBy">{{orderBy.label}}</a>
                                </li>
                            </ul>
                        </div>
                    </div>
                </header>
            </div>

            <div class="col-md-12">
                <ul class="list-group list-group-types">
                    <li ng-repeat="type in bundle.types | filter:state.search | orderBy:state.orderBy.id as filteredTypes track by (type.containingBundle + type.symbolicName + type.version)"
                        ng-class="{'deprecated': type.deprecated, 'disabled': type.disabled}"
                        class="list-group-item">
                        <type-item bundle="bundle" type="type" show-type="true"></type-item>
                    </li>

                    <li ng-show="!bundle.types" class="list-group-item loading">
                        <h4>Loading types</h4>
                    </li>
                    <li ng-show="bundle.types.length === 0" class="list-group-item empty">
                        <h4>There is no types associated to this bundle</h4>
                    </li>
                    <li ng-show="bundle.types.length > 0 && filteredTypes.length === 0" class="list-group-item no-results">
                        <h4>No results matching current filters</h4>
                    </li>
                </ul>
            </div>
        </div>
    </section>

    <script type="text/ng-template" id="deletePopoverTemplate.html">
        <h4>Are you sure you wish to delete this bundle?</h4>
        <p><small>All types contained within it <strong>will be deleted</strong></small></p>
        <button class="btn btn-danger text-right" ng-click="deleteBundle()" ng-disabled="state.deleting">{{state.deleting ? 'Deleting...' : "Yes, I'm sure"}}</button>
    </script>
</ui-view>
