import Foundation

public enum ConfigurationError: Error, CustomStringConvertible, Equatable {
    case missing(field: String)
    case invalidType(field: String, expected: String, actual: String)
    case validationFailed(_ issues: [String])
    case unsupportedStage(type: String)
    case parsersMissing(reason: String)
    /// Store underlying as String so the enum remains Equatable.
    case parserFailed(stageType: String, underlying: String)
    case incompatibleConfig(reason: String)
    case unknown

    public var description: String {
        switch self {
        case .missing(let field):
            return "Missing required field: \(field)"
        case .invalidType(let field, let expected, let actual):
            return "Invalid type for \(field). Expected \(expected), got \(actual)"
        case .validationFailed(let issues):
            return "Validation failed: \(issues.joined(separator: "; "))"
        case .unsupportedStage(let type):
            return "Unsupported stage type: \(type)"
        case .parsersMissing(let reason):
            return "Parsers missing: \(reason)"
        case .parserFailed(let stageType, let underlying):
            return "Parser failed for stage '\(stageType)': \(underlying)"
        case .incompatibleConfig(let reason):
            return "Incompatible configuration: \(reason)"
        case .unknown:
            return "Unknown configuration error"
        }
    }
}
