/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *    http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.apache.spark.sql.connect.common

import scala.jdk.CollectionConverters._

import org.apache.spark.{SparkThrowable, SparkThrowableHelper}

/**
 * Error thrown when a connect plan is not valid.
 */
final case class InvalidPlanInput(
    private val errorCondition: String,
    private val messageParameters: Map[String, String],
    private val causeOpt: Option[Throwable])
    extends Exception(
      SparkThrowableHelper.getMessage(errorCondition, messageParameters),
      causeOpt.orNull)
    with SparkThrowable {

  override def getCondition: String = errorCondition

  override def getMessageParameters: java.util.Map[String, String] = messageParameters.asJava
}

object InvalidPlanInput {

  def apply(message: String): InvalidPlanInput =
    InvalidPlanInput(
      errorCondition = "INTERNAL_ERROR",
      messageParameters = Map("message" -> message),
      causeOpt = None)

  def apply(errorCondition: String, messageParameters: Map[String, String]): InvalidPlanInput =
    InvalidPlanInput(
      errorCondition = errorCondition,
      messageParameters = messageParameters,
      causeOpt = None)
}
