import Foundation
import PathKit
import ProjectSpec
import Rainbow
import SwiftCLI

enum GenerationError: Error, CustomStringConvertible, ProcessError {
    case missingProjectSpec(Path)
    case projectSpecParsingError(Error)
    case cacheGenerationError(Error)
    case validationError(SpecValidationError)
    case generationError(Error)
    case missingUsername
    case writingError(Error)

    var description: String {
        switch self {
        case let .missingProjectSpec(path):
            return "No project spec found at \(path.absolute())"
        case let .projectSpecParsingError(error):
            return "Parsing project spec failed: \(error)"
        case let .cacheGenerationError(error):
            return "Couldn't generate cache file: \(error)"
        case let .validationError(error):
            return error.description
        case let .generationError(error):
            return String(describing: error)
        case .missingUsername:
            return "Couldn't find current username"
        case let .writingError(error):
            return String(describing: error)
        }
    }

    var message: String? {
        description.red
    }

    var exitStatus: Int32 {
        1
    }
}
