import PathBase from "./PathBase";

/**
 * Polyline path geometry.
 */
export default class Lines extends PathBase {
    /**
     * Set iteration count.
     * @param iterations - Iteration count.
     * @returns This instance.
     */
    setIterations(iterations: number): this;
    /**
     * Iteration count.
     */
    iterations: number;

    /**
     * First point x.
     */
    firstPointX: number;
    /**
     * First point y.
     */
    firstPointY: number;
    /**
     * Last point x.
     */
    lastPointX: number;
    /**
     * Last point y.
     */
    lastPointY: number;

    /**
     * Start a new path at a point.
     * @param x - Start x.
     * @param y - Start y.
     * @returns This instance.
     */
    startAt(
        x: number,
        y: number
    ): this;

    /**
     * Add a line segment.
     * @param x - Target x.
     * @param y - Target y.
     * @param relative - True for relative.
     * @returns This instance.
     */
    lineTo(
        x: number,
        y: number,
        relative?: boolean
    ): this;
    /**
     * Add a vertical line.
     * @param x - Target x.
     * @param relative - True for relative.
     * @returns This instance.
     */
    verticalLineTo(
        x: number,
        relative?: boolean
    ): this;
    /**
     * Add a horizontal line.
     * @param y - Target y.
     * @param relative - True for relative.
     * @returns This instance.
     */
    horizontalLineTo(
        y: number,
        relative?: boolean
    ): this;

    /**
     * Add an elliptical arc segment.
     * @param centerX - Center x.
     * @param centerY - Center y.
     * @param radiusX - Radius x.
     * @param radiusY - Radius y.
     * @param startAngle - Start angle in radians.
     * @param endAngle - End angle in radians.
     * @param anticlockwise - True to draw anticlockwise.
     * @returns This instance.
     */
    ellipticalArc(
        centerX: number,
        centerY: number,
        radiusX: number,
        radiusY: number,
        startAngle: number,
        endAngle: number,
        anticlockwise?: boolean
    ): this;
    /**
     * Add an arc segment.
     * @param centerX - Center x.
     * @param centerY - Center y.
     * @param radius - Radius value.
     * @param startAngle - Start angle in radians.
     * @param endAngle - End angle in radians.
     * @param anticlockwise - True to draw anticlockwise.
     * @returns This instance.
     */
    arc(
        centerX: number,
        centerY: number,
        radius: number,
        startAngle: number,
        endAngle: number,
        anticlockwise?: boolean
    ): this;

    /**
     * Add a quadratic bezier segment.
     * @param cx - Control point x.
     * @param cy - Control point y.
     * @param x - End x.
     * @param y - End y.
     * @returns This instance.
     */
    quadraticBezierTo(
        cx: number,
        cy: number,
        x: number,
        y: number
    ): this;

    /**
     * Add a cubic bezier segment.
     * @param cx0 - First control x.
     * @param cy0 - First control y.
     * @param cx1 - Second control x.
     * @param cy1 - Second control y.
     * @param x - End x.
     * @param y - End y.
     * @returns This instance.
     */
    cubicBezierTo(
        cx0: number,
        cy0: number,
        cx1: number,
        cy1: number,
        x: number,
        y: number
    ): this;

    /**
     * Add a catmull-rom segment.
     * @param points - Control points.
     * @returns This instance.
     */
    catmullRomTo(...points: number[]): this;

    /**
     * Close the path.
     * @returns This instance.
     */
    close(): this;

    /**
     * End the path.
     * @returns This instance.
     */
    end(): this;

    /**
     * Rotate around a point.
     * @param centerX - Center x.
     * @param centerY - Center y.
     * @param angle - Angle in radians.
     * @returns This instance.
     */
    rotateAround(
        centerX: number,
        centerY: number,
        angle: number
    ): this;

    /**
     * Scale around a point.
     * @param centerX - Center x.
     * @param centerY - Center y.
     * @param scaleX - Scale x.
     * @param scaleY - Scale y.
     * @returns This instance.
     */
    scale(
        centerX: number,
        centerY: number,
        scaleX: number,
        scaleY: number
    ): this;

    /**
     * Offset all points.
     * @param x - Offset x.
     * @param y - Offset y.
     * @returns This instance.
     */
    offset(
        x: number,
        y: number
    ): this;

    /**
     * Save current path data.
     * @returns This instance.
     */
    savePathData(): this;
    /**
     * Restore saved path data.
     * @returns This instance.
     */
    restorePathData(): this;

    /**
     * Append path from another.
     * @param src - Source path.
     * @returns This instance.
     */
    appendPathFrom(src: Lines): this;
    /**
     * Append path from another to endT.
     * @param src - Source path.
     * @param endT - End t.
     * @returns This instance.
     */
    appendPathFrom(
        src: Lines,
        endT: number
    ): this;
    /**
     * Append path from another between t range.
     * @param src - Source path.
     * @param startT - Start t.
     * @param endT - End t.
     * @returns This instance.
     */
    appendPathFrom(
        src: Lines,
        startT: number,
        endT: number
    ): this;

    /**
     * Copy path from another.
     * @param src - Source path.
     * @returns This instance.
     */
    copyPathFrom(src: Lines): this;
    /**
     * Copy path from another to endT.
     * @param src - Source path.
     * @param endT - End t.
     * @returns This instance.
     */
    copyPathFrom(
        src: Lines,
        endT: number
    ): this;
    /**
     * Copy path from another between t range.
     * @param src - Source path.
     * @param startT - Start t.
     * @param endT - End t.
     * @returns This instance.
     */
    copyPathFrom(
        src: Lines,
        startT: number,
        endT: number
    ): this;

    /**
     * Set display path segment.
     * @param endT - End t.
     * @returns This instance.
     */
    setDisplayPathSegment(endT: number): this;
    /**
     * Set display path segment by range.
     * @param startT - Start t.
     * @param endT - End t.
     * @returns This instance.
     */
    setDisplayPathSegment(
        startT: number,
        endT: number
    ): this;
}
