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

import * as zrUtil from 'zrender/src/core/util';
import ComponentModel from '../../model/Component';
import { AxisModelExtendedInCreator } from '../axisModelCreator';
import {AxisModelCommonMixin} from '../axisModelCommonMixin';
import Axis2D from './Axis2D';
import { AxisBaseOption } from '../axisCommonTypes';
import GridModel from './GridModel';
import { AxisBaseModel } from '../AxisBaseModel';
import {OrdinalSortInfo} from '../../util/types';
import { SINGLE_REFERRING } from '../../util/model';


export type CartesianAxisPosition = 'top' | 'bottom' | 'left' | 'right';

export interface CartesianAxisOption extends AxisBaseOption {
    gridIndex?: number;
    gridId?: string;
    position?: CartesianAxisPosition;
    // Offset is for multiple axis on the same position.
    offset?: number;
    categorySortInfo?: OrdinalSortInfo[];
}

export interface XAXisOption extends CartesianAxisOption {
    mainType?: 'xAxis'
}
export interface YAXisOption extends CartesianAxisOption {
    mainType?: 'yAxis'
}

export class CartesianAxisModel extends ComponentModel<CartesianAxisOption>
    implements AxisBaseModel<CartesianAxisOption> {

    static type = 'cartesian2dAxis';

    axis: Axis2D;

    getCoordSysModel(): GridModel {
        return this.getReferringComponents('grid', SINGLE_REFERRING).models[0] as GridModel;
    }
}

export interface CartesianAxisModel extends AxisModelCommonMixin<CartesianAxisOption>,
    AxisModelExtendedInCreator<CartesianAxisOption> {}

zrUtil.mixin(CartesianAxisModel, AxisModelCommonMixin);

export default CartesianAxisModel;
