import Foundation
import JSONUtilities

public struct TargetReference: Hashable {
    public var name: String
    public var location: Location

    public enum Location: Hashable {
        case local
        case project(String)
    }

    public init(name: String, location: Location) {
        self.name = name
        self.location = location
    }
}

extension TargetReference {
    public init(_ string: String) throws {
        let paths = string.split(separator: "/")
        switch paths.count {
        case 2:
            location = .project(String(paths[0]))
            name = String(paths[1])
        case 1:
            location = .local
            name = String(paths[0])
        default:
            throw SpecParsingError.invalidTargetReference(string)
        }
    }

    public static func local(_ name: String) -> TargetReference {
        TargetReference(name: name, location: .local)
    }
}

extension TargetReference: ExpressibleByStringLiteral {
    public init(stringLiteral value: String) {
        try! self.init(value)
    }
}

extension TargetReference: CustomStringConvertible {
    public var reference: String {
        switch location {
        case .local: return name
        case .project(let root):
            return "\(root)/\(name)"
        }
    }

    public var description: String {
        reference
    }
}
