const m = require('makerjs')
const u = require('./utils')

module.exports = class Point {
    constructor(x=0, y=0, r=0, meta={}) {
        if (Array.isArray(x)) {
            this.x = x[0]
            this.y = x[1]
            this.r = 0
            this.meta = {}
        } else {
            this.x = x
            this.y = y
            this.r = r
            this.meta = meta
        }
    }

    get p() {
        return [this.x, this.y]
    }

    set p(val) {
        [this.x, this.y] = val
    }

    shift(s, relative=true) {
        if (relative) {
            s = m.point.rotate(s, this.r)
        }
        this.x += s[0]
        this.y += s[1]
        return this
    }

    rotate(angle, origin=[0, 0]) {
        this.p = m.point.rotate(this.p, angle, origin)
        this.r += angle
        return this
    }

    mirror(x) {
        this.x = 2 * x - this.x
        this.r = -this.r
        return this
    }

    clone() {
        return new Point(
            this.x,
            this.y,
            this.r,
            u.deepcopy(this.meta)
        )
    }

    position(model) {
        return m.model.moveRelative(m.model.rotate(model, this.r), this.p)
    }

    rect(size=14) {
        let rect = u.rect(size, size, [-size/2, -size/2], this.meta.mirrored)
        return this.position(rect)
    }
}
