/*
* 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 { AxisBaseOption } from '../axisCommonTypes';
import AngleAxis from './AngleAxis';
import RadiusAxis from './RadiusAxis';
import { AxisBaseModel } from '../AxisBaseModel';
import { SINGLE_REFERRING } from '../../util/model';

export type AngleAxisOption = AxisBaseOption & {
    mainType?: 'angleAxis';
    /**
     * Index of host polar component
     */
    polarIndex?: number;
    /**
     * Id of host polar component
     */
    polarId?: string;

    startAngle?: number;
    clockwise?: boolean;

    axisLabel?: AxisBaseOption['axisLabel']
};

export type RadiusAxisOption = AxisBaseOption & {
    mainType?: 'radiusAxis';
    /**
     * Index of host polar component
     */
    polarIndex?: number;
    /**
     * Id of host polar component
     */
    polarId?: string;
};

type PolarAxisOption = AngleAxisOption | RadiusAxisOption;

class PolarAxisModel<T extends PolarAxisOption = PolarAxisOption> extends ComponentModel<T>
    implements AxisBaseModel<T> {
    static type = 'polarAxis';

    axis: AngleAxis | RadiusAxis;

    getCoordSysModel(): ComponentModel {
        return this.getReferringComponents('polar', SINGLE_REFERRING).models[0];
    }
}

interface PolarAxisModel<T extends PolarAxisOption = PolarAxisOption>
    extends AxisModelCommonMixin<T>, AxisModelExtendedInCreator {}

zrUtil.mixin(PolarAxisModel, AxisModelCommonMixin);

export {PolarAxisModel};

export class AngleAxisModel extends PolarAxisModel<AngleAxisOption> {
    static type = 'angleAxis';
    type = AngleAxisModel.type;
    axis: AngleAxis;
}
export class RadiusAxisModel extends PolarAxisModel<RadiusAxisOption> {
    static type = 'radiusAxis';
    type = RadiusAxisModel.type;
    axis: RadiusAxis;
}