namespace Areas;

// Clase parcial que representa la ventana principal de la aplicación.
// Es el punto de entrada donde el usuario selecciona qué figura geométrica calcular.
public partial class Principal : Form
{
  // Constructor de la ventana principal.
  public Principal()
  {
    // Inicializa los componentes visuales definidos en el diseñador.
    this.InitializeComponent();
    // Carga la lista de figuras geométricas disponibles en el ComboBox.
    this.CargarFiguras();
  }

  // Método privado que carga todas las figuras geométricas disponibles.
  private void CargarFiguras()
  {
    // Agrega cada figura geométrica al ComboBox de selección.
    this.areasComboBox.Items.Add("Círculo");
    this.areasComboBox.Items.Add("Cuadrado");
    this.areasComboBox.Items.Add("Elipse");
    this.areasComboBox.Items.Add("Hexágono");
    this.areasComboBox.Items.Add("Paralelogramo");
    this.areasComboBox.Items.Add("Pentágono");
    this.areasComboBox.Items.Add("Rectángulo");
    this.areasComboBox.Items.Add("Rombo");
    this.areasComboBox.Items.Add("Trapecio");
    this.areasComboBox.Items.Add("Triángulo");
    // Establece el primer elemento como seleccionado por defecto.
    this.areasComboBox.SelectedIndex = 0;
  }

  // Evento que se ejecuta al hacer clic en el botón "Calcular".
  // Parámetros:
  //   - sender: El objeto que disparó el evento (en este caso, el botón Calcular).
  //   - e: Contiene los datos del evento (para Click, no tiene información adicional).
  private void CalcularButton_Click(object sender, EventArgs e)
  {
    // Verifica si hay una figura seleccionada en el ComboBox.
    if (this.areasComboBox.SelectedItem == null)
    {
      // Muestra mensaje de advertencia si no hay selección.
      MessageBox.Show("Por favor, seleccione una figura geométrica.", "Aviso",
        MessageBoxButtons.OK, MessageBoxIcon.Warning);
      return;
    }

    // Obtiene el nombre de la figura seleccionada como texto.
    string figuraSeleccionada = this.areasComboBox.SelectedItem.ToString()!;

    // Según la figura seleccionada, crea y abre la ventana correspondiente.
    // El "switch" es como un "si esto, entonces aquello" para múltiples opciones.
    Form ventanaFigura = figuraSeleccionada switch
    {
      "Cuadrado"      => new Cuadrado(), // Abre la ventana del cuadrado.
      "Círculo"       => new Circulo(), // Abre la ventana del círculo.
      "Elipse"        => new Elipse(), // Abre la ventana de la elipse.
      "Hexágono"      => new Hexagono(), // Abre la ventana del hexágono.
      "Paralelogramo" => new Paralelogramo(), // Abre la ventana del paralelogramo.
      "Pentágono"     => new Pentagono(), // Abre la ventana del pentágono.1
      "Rectángulo"    => new Rectangulo(), // Abre la ventana del rectángulo.
      "Rombo"         => new Rombo(), // Abre la ventana del rombo.
      "Trapecio"      => new Trapecio(), // Abre la ventana del trapecio.
      "Triángulo"     => new Triangulo(), // Abre la ventana del triángulo.
      // Si la figura no es reconocida, muestra un error.
      // Porque las expresiones Switch necesitan tener un valor final predeterminado
      // en caso de que no se cumpla ninguna de las opciones de arriba, representado
      // por el símbolo de guion bajo.
      _ => throw new InvalidOperationException("Figura no reconocida")
    };

    // Oculta la ventana principal mientras se muestra la de la figura.
    this.Hide();
    // Cuando se cierre la ventana de la figura, vuelve a mostrar la ventana principal.
    // Una "función anónima" es código que se ejecuta después, en lugar de crear un método separado,
    // escribimos el código directamente aquí entre paréntesis.
    // Es como decir: "cuando pase esto (FormClosed), haz esto (this.Show())".
    // El símbolo "=>" significa "entonces haz esto".
    // Parámetros:
    //   - s (no se usa en este caso): La ventana que se cerró (la ventana de la figura).
    //   - args (no se usa en este caso): Información sobre por qué se cerró la ventana.
    ventanaFigura.FormClosed += (s, args) => this.Show();
    // Muestra la ventana de la figura seleccionada.
    ventanaFigura.Show();
  }
}
