/*
THIS INFRAGISTICS ULTIMATE SOFTWARE LICENSE  AGREEMENT ("AGREEMENT") LOCATED HERE:
https://www.infragistics.com/legal/license/igultimate-la
https://www.infragistics.com/legal/license/igultimate-eula
GOVERNS THE LICENSING, INSTALLATION AND USE OF INFRAGISTICS SOFTWARE. BY DOWNLOADING AND/OR INSTALLING AND USING INFRAGISTICS SOFTWARE:  you are indicating that you have read and understand this Agreement, and agree to be legally bound by it on behalf of the yourself and your company.
*/
import { Component, Input } from '@angular/core';
import { IgxAxisComponent } from './igx-axis-component';
import { toPoint, fromRect, ensureBool, NamePatcher } from "igniteui-angular-core";
import * as i0 from "@angular/core";
/**
 * Represents the base class for all IgxDataChartComponent category-based axes.
*
* ```html
* <igx-data-chart
*     [dataSource]="data">
*
*     <igx-category-x-axis
*         label="label"
*         #xAxis>
*     </igx-category-x-axis>
*     <igx-numeric-y-axis
*         #yAxis>
*     </igx-numeric-y-axis>
*
*     <igx-column-series
*         [xAxis]="xAxis"
*         [yAxis]="yAxis"
*         valueMemberPath="value">
*     </igx-column-series>
*     <igx-column-series
*         [xAxis]="xAxis"
*         [yAxis]="yAxis"
*         valueMemberPath="value">
*       </igx-column-series>
* </igx-data-chart>
* ```
*
* ```ts
* let series = new IgxColumnSeriesComponent();
* series.xAxis = this.xAxis;
* series.yAxis = this.yAxis;
* series.valueMemberPath="value";
* this.chart.series.add(series);
* ```
*/
export let IgxCategoryAxisBaseComponent = /*@__PURE__*/ (() => {
    class IgxCategoryAxisBaseComponent extends IgxAxisComponent {
        constructor() {
            super();
            this._chartLevelData = null;
            this._dataSource = null;
            if (this._styling) {
                NamePatcher.ensureStylablePatched(Object.getPrototypeOf(this));
            }
        }
        provideData(data) {
            this._chartLevelData = data;
            this.updateDataSource();
        }
        updateDataSource() {
            if (this._dataSource == null) {
                this.i.itemsSource = this._chartLevelData;
            }
            else {
                this.i.itemsSource = this._dataSource;
            }
        }
        set dataSource(value) {
            this._dataSource = value;
            this.updateDataSource();
            //console.log("setting axis data source: " + value)
        }
        get dataSource() {
            if (this._dataSource != null) {
                return this._dataSource;
            }
            return this.i.itemsSource;
        }
        /**
                                 * @hidden
                                 */
        get i() {
            return this._implementation;
        }
        /**
     * Gets if the current axis is a continuous rather than a discrete scale
    */
        get isContinuous() {
            return this.i.cc;
        }
        /**
         * Checks if the axis is of category axis type
        */
        get isCategory() {
            return this.i.ca;
        }
        /**
         * Gets the number of items in the current category axis items source.
        */
        get itemsCount() {
            return this.i.lf;
        }
        set itemsCount(v) {
            this.i.lf = +v;
        }
        /**
         * Gets or sets the amount of space between adjacent categories for the current axis object.
         * The gap is silently clamped to the range [0, 1] when used.
        *
        * Use the `gap` property to configure the spacing between items on a category axis with item spacing.
        *
        * A `gap` of 0 allocates no space between items.  A `gap` of 1 allocates a space between items equal to the width of one item.
        *
        * To set the item spacing to 75% the width of one item, set the `gap` to 0.75, as in this code:
        *
        * ```html
        * <igx-data-chart
        *     [dataSource]="data">
        *     <igx-category-x-axis
        *         label="label"
        *         gap="0.75"
        *         #xAxis>
        *     </igx-category-x-axis>
        *     <igx-numeric-y-axis
        *         #yAxis>
        *     </igx-numeric-y-axis>
        *     <igx-column-series
        *         [xAxis]="xAxis"
        *         [yAxis]="yAxis"
        *         valueMemberPath="value">
        *     </igx-column-series>
        * </igx-data-chart>
        * ```
        */
        get gap() {
            return this.i.k0;
        }
        set gap(v) {
            this.i.k0 = +v;
        }
        /**
         * Gets or sets the maximum gap value to allow. This defaults to 1.0.
        */
        get maximumGap() {
            return this.i.k7;
        }
        set maximumGap(v) {
            this.i.k7 = +v;
        }
        /**
         * Gets or sets the minimum amount of pixels to use for the gap between categories, if possible.
        */
        get minimumGapSize() {
            return this.i.k8;
        }
        set minimumGapSize(v) {
            this.i.k8 = +v;
        }
        /**
         * Gets or sets the amount of overlap between adjacent categories for the current axis object.
         * The overlap is silently clamped to the range [-1, 1] when used.
        *
        * Use the `overlap` property to configure the spacing between items on a category axis with item spacing and more than one series.
        *
        * An `overlap` of 0 places grouped items adjacent to each other.  An `overlap` of 1 places grouped items in the same axis space, completely overlapping.  An `overlap` of -1 places a space between grouped items equal to the width of one item.
        *
        * To place grouped items with 75% overlap, set the `overlap` to 0.75, as in this code:
        *
        * ```html
        * <igx-data-chart
        *     [dataSource]="data">
        *
        *     <igx-category-x-axis
        *         label="label"
        *         overlap="0.75"
        *         #xAxis>
        *     </igx-category-x-axis>
        *     <igx-numeric-y-axis
        *         #yAxis>
        *     </igx-numeric-y-axis>
        *
        *     <igx-column-series
        *         [xAxis]="xAxis"
        *         [yAxis]="yAxis"
        *         valueMemberPath="value">
        *     </igx-column-series>
        *     <igx-column-series
        *         [xAxis]="xAxis"
        *         [yAxis]="yAxis"
        *         valueMemberPath="value">
        *       </igx-column-series>
        * </igx-data-chart>
        * ```
        */
        get overlap() {
            return this.i.k9;
        }
        set overlap(v) {
            this.i.k9 = +v;
        }
        /**
         * Gets or sets whether the category axis should use clustering display mode even if no series are present that would force clustering mode.
        *
        * `useClusteringMode` applies grouping and spacing to a category axis equivalent to the grouping that occurs when grouping series, such as ColumnSeries, are used.
        *
        * Try setting it on an axis displaying financial series to adjust the spacing on the left and right sides of the axis:
        *
        * ```html
        * <igx-data-chart
        *     [dataSource]="financialData">
        *     <igx-category-x-axis
        *     label="time"
        *     useClusteringMode="true"
        *     #xAxis>
        *     </igx-category-x-axis>
        *     <igx-numeric-y-axis
        *     #yAxis>
        *     </igx-numeric-y-axis>
        *
        *     <igx-column-series
        *     [xAxis]="xAxis"
        *     [yAxis]="yAxis"
        *     valueMemberPath="value">
        *     </igx-column-series>
        *     <igx-financial-price-series
        *     [xAxis]="xAxis"
        *     [yAxis]="yAxis"
        *     openMemberPath="open"
        *     highMemberPath="high"
        *     lowMemberPath="low"
        *     closeMemberPath="close"
        *     volumeMemberPath="volume">
        *     </igx-financial-price-series>
        * </igx-data-chart>
        * ```
        */
        get useClusteringMode() {
            return this.i.ku;
        }
        set useClusteringMode(v) {
            this.i.ku = ensureBool(v);
        }
        getCategoryBoundingBox(point, useInterpolation, singularWidth) {
            let iv = this.i.md(toPoint(point), useInterpolation, singularWidth);
            return fromRect(iv);
        }
        getCategoryBoundingBoxHelper(point, useInterpolation, singularWidth, isVertical) {
            let iv = this.i.me(toPoint(point), useInterpolation, singularWidth, isVertical);
            return fromRect(iv);
        }
        /**
         * Unscales a value from screen space into axis space.
        
        * @param unscaledValue  * The scaled value in screen coordinates to unscale into axis space.
        */
        unscaleValue(unscaledValue) {
            let iv = this.i.lb(unscaledValue);
            return (iv);
        }
        notifySetItem(index, oldItem, newItem) {
            this.i.ly(index, oldItem, newItem);
        }
        /**
         * Used to manually notify the axis that the data source has reset or cleared its items.
        
        */
        notifyClearItems() {
            this.i.lv();
        }
        notifyInsertItem(index, newItem) {
            this.i.lw(index, newItem);
        }
        notifyRemoveItem(index, oldItem) {
            this.i.lx(index, oldItem);
        }
    }
    IgxCategoryAxisBaseComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.14", ngImport: i0, type: IgxCategoryAxisBaseComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
    IgxCategoryAxisBaseComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.14", type: IgxCategoryAxisBaseComponent, selector: "ng-component", inputs: { dataSource: "dataSource", itemsCount: "itemsCount", gap: "gap", maximumGap: "maximumGap", minimumGapSize: "minimumGapSize", overlap: "overlap", useClusteringMode: "useClusteringMode" }, usesInheritance: true, ngImport: i0, template: ``, isInline: true });
    return IgxCategoryAxisBaseComponent;
})();
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.14", ngImport: i0, type: IgxCategoryAxisBaseComponent, decorators: [{
            type: Component,
            args: [{
                    template: ``,
                }]
        }], ctorParameters: function () { return []; }, propDecorators: { dataSource: [{
                type: Input
            }], itemsCount: [{
                type: Input
            }], gap: [{
                type: Input
            }], maximumGap: [{
                type: Input
            }], minimumGapSize: [{
                type: Input
            }], overlap: [{
                type: Input
            }], useClusteringMode: [{
                type: Input
            }] } });
