module.exports =
class Point
  @fromObject: (object) ->
    if object instanceof Point
      object
    else
      if object instanceof Array
        [row, column] = object
      else
        { row, column } = object

      new Point(row, column)

  @min: (point1, point2) ->
    point1 = @fromObject(point1)
    point2 = @fromObject(point2)
    if point1.isLessThanOrEqual(point2)
      point1
    else
      point2

  constructor: (@row=0, @column=0) ->

  copy: ->
    new Point(@row, @column)

  add: (other) ->
    other = Point.fromObject(other)
    row = @row + other.row
    if other.row == 0
      column = @column + other.column
    else
      column = other.column

    new Point(row, column)

  translate: (other) ->
    other = Point.fromObject(other)
    new Point(@row + other.row, @column + other.column)

  splitAt: (column) ->
    if @row == 0
      rightColumn = @column - column
    else
      rightColumn = @column

    [new Point(0, column), new Point(@row, rightColumn)]

  compare: (other) ->
    if @row > other.row
      1
    else if @row < other.row
      -1
    else
      if @column > other.column
        1
      else if @column < other.column
        -1
      else
        0

  isEqual: (other) ->
    return false unless other
    other = Point.fromObject(other)
    @row == other.row and @column == other.column

  isLessThan: (other) ->
    @compare(other) < 0

  isLessThanOrEqual: (other) ->
    @compare(other) <= 0

  isGreaterThan: (other) ->
    @compare(other) > 0

  isGreaterThanOrEqual: (other) ->
    @compare(other) >= 0

  inspect: ->
    "(#{@row}, #{@column})"

  toString: ->
    "#{@row},#{@column}"

  toArray: ->
    [@row, @column]

  serialize: ->
    @toArray()
