//
//  Block.swift
//  Privyet
//
//  Created by Amy Bowersox on 5/23/20.
//  Copyright © 2020 Erbosoft Metaverse Design Solutions. All rights reserved.
//

import Foundation
import SpriteKit

// Colors that may be applied to blocks (whcih controls the sprite image they use)
enum BlockColor: Int, CustomStringConvertible, CaseIterable {
    case Blue = 0, Orange, Purple, Red, Teal, Yellow, Green
    
    var spriteName: String {
        switch self {
        case .Blue:
            return "blue"
        case .Orange:
            return "orange"
        case .Purple:
            return "purple"
        case .Red:
            return "red"
        case .Teal:
            return "teal"
        case .Yellow:
            return "yellow"
        case .Green:
            return "green"
        }
    }
    
    var description: String {
        return self.spriteName
    }
}

// Rectangles in block coordinates
class BlockRect {
    var left: Int
    var top: Int
    var right: Int
    var bottom: Int
    
    init(left: Int, top: Int, right: Int, bottom: Int) {
        self.left = left
        self.top = top
        self.right = right
        self.bottom = bottom
    }
    
    convenience init(x: Int, y: Int) {
        self.init(left: x, top: y, right: x, bottom: y)
    }
    
    var width: Int {
        return right - left + 1
    }
    
    var height: Int {
        return bottom - top + 1
    }
    
    static func +(lhs: BlockRect, rhs: BlockRect) -> BlockRect {
        return BlockRect(left: min(lhs.left, rhs.left), top: min(lhs.top, rhs.top), right: max(lhs.right, rhs.right), bottom: max(lhs.bottom, rhs.bottom))
    }
    
    static func +=(lhs: BlockRect, rhs: BlockRect) -> BlockRect {
        lhs.left = min(lhs.left, rhs.left)
        lhs.top = min(lhs.top, rhs.top)
        lhs.right = max(lhs.right, rhs.right)
        lhs.bottom = max(lhs.bottom, rhs.bottom)
        return lhs
    }
}

// Represents a single block in the game.
class Block: Hashable, CustomStringConvertible {
    // Constants
    let color: BlockColor
    
    // Properties
    var column: Int
    var row: Int
    var sprite: SKSpriteNode?
    
    var spriteName: String {
        return color.spriteName
    }
    
    static func == (lhs: Block, rhs: Block) -> Bool {
        return lhs.column == rhs.column && lhs.row == rhs.row
            && lhs.color.rawValue == rhs.color.rawValue
    }
    
    func hash(into hasher: inout Hasher) {
        hasher.combine(column)
        hasher.combine(row)
    }
    
    var description: String {
        return "\(color): [\(column), \(row)]"
    }
    
    init(column: Int, row: Int, color: BlockColor) {
        self.column = column
        self.row = row
        self.color = color
    }
}
