///|
pub enum QuestionType {
  Input
  Confirm
  List
  RawList
  Expand
  Checkbox
  Password
  Editor
} derive(Debug, Eq)

///|
pub enum AnswerValue {
  StringValue(String)
  BoolValue(Bool)
  ArrayValue(Array[String])
  IntValue(Int)
} derive(Debug, Eq)

///|
test {
  let _ = AnswerValue::IntValue(1)
}

///|
pub type Answer = Map[String, AnswerValue]

///|
pub struct Question {
  question_type : QuestionType
  question_name : String
  question_message : String
  question_default : AnswerValue?
  question_choices : Array[String]?
}

///|
pub fn input(
  question_name~ : String,
  question_message~ : String,
  question_default? : AnswerValue? = None,
) -> Question {
  {
    question_type: QuestionType::Input,
    question_name,
    question_message,
    question_default,
    question_choices: None,
  }
}

///|
pub fn confirm(
  question_name~ : String,
  question_message~ : String,
  question_default? : AnswerValue? = None,
) -> Question {
  {
    question_type: QuestionType::Confirm,
    question_name,
    question_message,
    question_default,
    question_choices: None,
  }
}

///|
pub fn list(
  question_name~ : String,
  question_message~ : String,
  question_choices~ : Array[String],
  question_default? : AnswerValue? = None,
) -> Question {
  {
    question_type: QuestionType::List,
    question_name,
    question_message,
    question_default,
    question_choices: Some(question_choices),
  }
}

///|
pub fn rawlist(
  question_name~ : String,
  question_message~ : String,
  question_choices~ : Array[String],
  question_default? : AnswerValue? = None,
) -> Question {
  {
    question_type: QuestionType::RawList,
    question_name,
    question_message,
    question_default,
    question_choices: Some(question_choices),
  }
}

///|
pub fn expand(
  question_name~ : String,
  question_message~ : String,
  question_choices~ : Array[String],
  question_default? : AnswerValue? = None,
) -> Question {
  {
    question_type: QuestionType::Expand,
    question_name,
    question_message,
    question_default,
    question_choices: Some(question_choices),
  }
}

///|
pub fn checkbox(
  question_name~ : String,
  question_message~ : String,
  question_choices~ : Array[String],
  question_default? : AnswerValue? = None,
) -> Question {
  {
    question_type: QuestionType::Checkbox,
    question_name,
    question_message,
    question_default,
    question_choices: Some(question_choices),
  }
}

///|
pub fn password(
  question_name~ : String,
  question_message~ : String,
  question_default? : AnswerValue? = None,
) -> Question {
  {
    question_type: QuestionType::Password,
    question_name,
    question_message,
    question_default,
    question_choices: None,
  }
}

///|
pub fn editor(
  question_name~ : String,
  question_message~ : String,
  question_default? : AnswerValue? = None,
) -> Question {
  {
    question_type: QuestionType::Editor,
    question_name,
    question_message,
    question_default,
    question_choices: None,
  }
}