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

include /app/helpers/jade/mixins
include /app/configuration/mixins

-var form = 'atomics'
-var model = '$ctrl.clonedCluster.atomicConfiguration'
-var affModel = model + '.affinity'
-var rendezvousAff = affModel + '.kind === "Rendezvous"'
-var customAff = affModel + '.kind === "Custom"'

panel-collapsible(ng-form=form on-open=`ui.loadPanel('${form}')`)
    panel-title Atomic configuration
    panel-description
        | Configuration for atomic data structures.
        | Atomics are distributed across the cluster, essentially enabling performing atomic operations (such as increment-and-get or compare-and-set) with the same globally-visible value.
        | #[a.link-success(href="https://apacheignite.readme.io/docs/atomic-types" target="_blank") More info]
    panel-content.pca-form-row(ng-if=`ui.isPanelLoaded('${form}')`)
        .pca-form-column-6.pc-form-grid-row
            .pc-form-grid-col-30
                +form-field__dropdown({
                    label: 'Cache mode:',
                    model: `${model}.cacheMode`,
                    name: '"cacheMode"',
                    placeholder: 'PARTITIONED',
                    options: '[\
                                            {value: "LOCAL", label: "LOCAL"},\
                                            {value: "REPLICATED", label: "REPLICATED"},\
                                            {value: "PARTITIONED", label: "PARTITIONED"}\
                                        ]',
                    tip: 'Cache modes:\
                                        <ul>\
                                            <li>Partitioned - in this mode the overall key set will be divided into partitions and all partitions will be split equally between participating nodes</li>\
                                            <li>Replicated - in this mode all the keys are distributed to all participating nodes</li>\
                                            <li>Local - in this mode caches residing on different grid nodes will not know about each other</li>\
                                        </ul>'
                })
            .pc-form-grid-col-30
                +form-field__number({
                    label: 'Sequence reserve:',
                    model: `${model}.atomicSequenceReserveSize`,
                    name: '"atomicSequenceReserveSize"',
                    placeholder: '1000',
                    min: '0',
                    tip: 'Default number of sequence values reserved for IgniteAtomicSequence instances<br/>\
                          After a certain number has been reserved, consequent increments of sequence will happen locally, without communication with other nodes, until the next reservation has to be made'
                })
            .pc-form-grid-col-60(ng-show=`!(${model}.cacheMode && ${model}.cacheMode != "PARTITIONED")`)
                +form-field__number({
                    label: 'Backups:',
                    model: model + '.backups',
                    name: '"backups"',
                    placeholder: '0',
                    min: '0',
                    tip: 'Number of backup nodes'
                })

            .pc-form-grid-col-60(ng-if-start='$ctrl.available("2.1.0")')
                +form-field__dropdown({
                    label: 'Function:',
                    model: `${affModel}.kind`,
                    name: '"AffinityKind"',
                    placeholder: 'Default',
                    options: '$ctrl.Clusters.affinityFunctions',
                    tip: 'Key topology resolver to provide mapping from keys to nodes\
                                        <ul>\
                                            <li>Rendezvous - Based on Highest Random Weight algorithm<br/></li>\
                                            <li>Custom - Custom implementation of key affinity function<br/></li>\
                                            <li>Default - By default rendezvous affinity function  with 1024 partitions is used<br/></li>\
                                        </ul>'
                })
            .pc-form-group(ng-if-end ng-if=rendezvousAff + ' || ' + customAff)
                .pc-form-grid-row
                    .pc-form-grid-col-30(ng-if-start=rendezvousAff)
                        +form-field__number({
                            label: 'Partitions',
                            model: `${affModel}.Rendezvous.partitions`,
                            name: '"RendPartitions"',
                            required: rendPartitionsRequired,
                            placeholder: '1024',
                            min: '1',
                            tip: 'Number of partitions'
                        })
                    .pc-form-grid-col-30
                        +form-field__java-class({
                            label: 'Backup filter',
                            model: `${affModel}.Rendezvous.affinityBackupFilter`,
                            name: '"RendAffinityBackupFilter"',
                            tip: 'Backups will be selected from all nodes that pass this filter'
                        })
                    .pc-form-grid-col-60(ng-if-end)
                        +form-field__checkbox({
                            label: 'Exclude neighbors',
                            model: `${affModel}.Rendezvous.excludeNeighbors`,
                            name: '"RendExcludeNeighbors"',
                            tip: 'Exclude same - host - neighbors from being backups of each other and specified number of backups'
                        })
                    .pc-form-grid-col-60(ng-if=customAff)
                        +form-field__java-class({
                            label: 'Class name:',
                            model: `${affModel}.Custom.className`,
                            name: '"AffCustomClassName"',
                            required: customAff,
                            tip: 'Custom key affinity function implementation class name'
                        })
        .pca-form-column-6
            +preview-xml-java(model, 'clusterAtomics')
