/*
* 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 MarkerModel, { MarkerOption, MarkerStatisticType, MarkerPositionOption } from './MarkerModel';
import GlobalModel from '../../model/Global';
import {
    LineStyleOption,
    SeriesLineLabelOption,
    SymbolOptionMixin,
    ItemStyleOption,
    StatesOptionMixin
} from '../../util/types';

interface MarkLineStateOption {
    lineStyle?: LineStyleOption
    /**
     * itemStyle for symbol
     */
    itemStyle?: ItemStyleOption
    label?: SeriesLineLabelOption
}
interface MarkLineDataItemOptionBase extends MarkLineStateOption, StatesOptionMixin<MarkLineStateOption> {
    name?: string
}

// 1D markLine for horizontal or vertical
export interface MarkLine1DDataItemOption extends MarkLineDataItemOptionBase {

    // On cartesian coordinate system
    xAxis?: number
    yAxis?: number

    // Use statistic method
    type?: MarkerStatisticType
    /**
     * When using statistic method with type.
     * valueIndex and valueDim can be specify which dim the statistic is used on.
     */
    valueIndex?: number
    valueDim?: string

    /**
     * Symbol for both two ends
     */
    symbol?: string[] | string
    symbolSize?: number[] | number
}

// 2D markLine on any direction
interface MarkLine2DDataItemDimOption extends
    MarkLineDataItemOptionBase,
    SymbolOptionMixin,
    MarkerPositionOption {
}

export type MarkLine2DDataItemOption = [
    // Start point
    MarkLine2DDataItemDimOption,
    // End point
    MarkLine2DDataItemDimOption
];

export interface MarkLineOption extends MarkerOption,
    MarkLineStateOption, StatesOptionMixin<MarkLineStateOption> {
    mainType?: 'markLine'

    symbol?: string[] | string
    symbolSize?: number[] | number

    /**
     * Precision used on statistic method
     */
    precision?: number

    data?: (MarkLine1DDataItemOption | MarkLine2DDataItemOption)[]
}

class MarkLineModel extends MarkerModel<MarkLineOption> {

    static type = 'markLine';
    type = MarkLineModel.type;

    createMarkerModelFromSeries(
        markerOpt: MarkLineOption,
        masterMarkerModel: MarkLineModel,
        ecModel: GlobalModel
    ) {
        return new MarkLineModel(markerOpt, masterMarkerModel, ecModel);
    }

    static defaultOption: MarkLineOption = {
        zlevel: 0,
        z: 5,

        symbol: ['circle', 'arrow'],
        symbolSize: [8, 16],

        //symbolRotate: 0,

        precision: 2,
        tooltip: {
            trigger: 'item'
        },
        label: {
            show: true,
            position: 'end',
            distance: 5
        },
        lineStyle: {
            type: 'dashed'
        },
        emphasis: {
            label: {
                show: true
            },
            lineStyle: {
                width: 3
            }
        },
        animationEasing: 'linear'
    };
}

export default MarkLineModel;