import {GraphicalMeasure} from "./GraphicalMeasure";
import {StaffLine} from "./StaffLine";
import {MusicSystem} from "./MusicSystem";
import {SystemLinePosition} from "./SystemLinePosition";
import {SystemLinesEnum} from "./SystemLinesEnum";
import {BoundingBox} from "./BoundingBox";
import {GraphicalObject} from "./GraphicalObject";
import {EngravingRules} from "./EngravingRules";

export class SystemLine extends GraphicalObject {

    constructor(lineType: SystemLinesEnum, linePosition: SystemLinePosition, musicSystem: MusicSystem,
                topMeasure: GraphicalMeasure, bottomMeasure: GraphicalMeasure = undefined) {
        super();
        this.lineType = lineType;
        this.linePosition = linePosition;
        this.parentMusicSystem = musicSystem;
        this.topMeasure = topMeasure;
        this.bottomMeasure = bottomMeasure;
        this.parentTopStaffLine = topMeasure?.ParentStaffLine;
        this.boundingBox = new BoundingBox(this, musicSystem.PositionAndShape);
    }

    public lineType: SystemLinesEnum;
    public linePosition: SystemLinePosition;
    public parentMusicSystem: MusicSystem;
    public parentTopStaffLine: StaffLine;
    public topMeasure: GraphicalMeasure;
    public bottomMeasure: GraphicalMeasure;

    /**
     * Return the width of the SystemLinesContainer for the given SystemLineType.
     * @param rules
     * @param systemLineType
     * @returns {number}
     */
    public static getObjectWidthForLineType(rules: EngravingRules, systemLineType: SystemLinesEnum): number {
        switch (systemLineType) {
            case SystemLinesEnum.SingleThin:
                return rules.SystemThinLineWidth;
            case SystemLinesEnum.DoubleThin:
                return rules.SystemThinLineWidth * 2 + rules.DistanceBetweenVerticalSystemLines;
            case SystemLinesEnum.ThinBold:
                return rules.SystemThinLineWidth + rules.SystemBoldLineWidth + rules.DistanceBetweenVerticalSystemLines;
            case SystemLinesEnum.BoldThinDots:
                return rules.SystemThinLineWidth + rules.SystemBoldLineWidth + rules.DistanceBetweenVerticalSystemLines + rules.SystemDotWidth +
                    rules.DistanceBetweenDotAndLine;
            case SystemLinesEnum.DotsThinBold:
                return rules.SystemThinLineWidth + rules.SystemBoldLineWidth + rules.DistanceBetweenVerticalSystemLines + rules.SystemDotWidth +
                    rules.DistanceBetweenDotAndLine;
            case SystemLinesEnum.DotsBoldBoldDots:
                return 2 * rules.SystemBoldLineWidth + 2 * rules.SystemDotWidth + 2 * rules.DistanceBetweenDotAndLine +
                    rules.DistanceBetweenVerticalSystemLines;
            default:
                return 0;
        }
    }

}
