using System;
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;
using System.IO;
namespace Agenda
{
  public partial class MainForm : Form
  {
    private struct tpersona
    {
      public string nombre;
      public string teléfono;
    }

    private static int nElementos = 100;
    private tpersona[] agenda = new tpersona[nElementos];
    private int i = 0;

    public MainForm()
    {
      //
      // The InitializeComponent() call is required for Windows Forms designer support.
      //
      InitializeComponent();
      
      //
      // TODO: Add constructor code after the InitializeComponent() call.
      //
    }
    
    void BtAñadirClick(object sender, EventArgs e)
    {
      if (i == nElementos) return;
      if (ctNombre.Text.Length == 0 ||
          ctTfno.Text.Length == 0)
      {
        MessageBox.Show("Datos no correctos");
        return;
      }
      // Añadir el nombre y el teléfono a la matriz
      agenda[i].nombre = ctNombre.Text;
      agenda[i].teléfono = ctTfno.Text;
      // Añadir el nombre a la lista
      lsNombres.Items.Add(ctNombre.Text);
      i++; // índice del siguiente elemento vacío
    }
    
    void OrdenGuardarClick(object sender, EventArgs e)
    {
      BinaryWriter bw = null; // flujo para escribir
      try
      {
        // Crear un flujo de la clase BinaryWriter para
        // escribir en un fichero.
        // Si el fichero existe se destruye.
        bw = new BinaryWriter(new FileStream("agenda.dat",
                                             FileMode.Create, FileAccess.Write));
        i = 0; // índice de para la matriz agenda
        while (agenda[i].nombre != null)
        {
          // Almacenar un nombre y un teléfono
          // (un registro) en el fichero
          bw.Write(agenda[i].nombre);
          bw.Write(agenda[i].teléfono);
          i++;
        }
      }
      finally
      {
        // Cerrar el flujo
        if (! (bw == null)) bw.Close();
      }
    }
    
    void OrdenSalirClick(object sender, EventArgs e)
    {
      Close();
    }
    
    void MainFormLoad(object sender, EventArgs e)
    {
      BinaryReader br = null;
      try
      {
        // Abrir un flujo de la clase BinaryReader para
        // leer del fichero.
        br = new BinaryReader(new FileStream("agenda.dat",
                                             FileMode.Open, FileAccess.Read));
        i = 0; // índice para la matriz agenda
        do
        {
          // Leer un nombre y un teléfono (un registro)
          // desde el fichero. Cuando se alcance el final
          // del fichero el método utilizado para leer
          // lanzará una excepción que será atrapada
          // por el bloque catch escrito a continuación.
          agenda[i].nombre = br.ReadString();
          agenda[i].teléfono = br.ReadString();
          // Añadir el nombre a la lista
          lsNombres.Items.Add(agenda[i].nombre);
          i++;
        }
        while (true);
      }
      catch (Exception ex)
      {
        Console.WriteLine("Proceso de carga de la agenda.");
      }
      finally
      {
        // Cerrar el flujo
        if (! (br == null)) br.Close();
      }
    }
    
    void LsNombresSelectedIndexChanged(object sender, EventArgs e)
    {
      int indSelec = lsNombres.SelectedIndex;
      if (indSelec < 0) return;
      // Mostrar en las cajas de texto los datos
      // correspondientes al elemento seleccionado
      ctNombre.Text = agenda[indSelec].nombre;
      ctTfno.Text = agenda[indSelec].teléfono;
    }
    
    void BtModificarClick(object sender, EventArgs e)
    {
      int indSelec = lsNombres.SelectedIndex;
      if (indSelec < 0) return;
      // Modificar los datos correspondientes
      // al elemento seleccionado
      agenda[indSelec].nombre = ctNombre.Text;
      agenda[indSelec].teléfono = ctTfno.Text;
      // Modificar el nombre en la lista
      lsNombres.Items[indSelec] = ctNombre.Text;
    }
    
    void MainFormFormClosing(object sender, FormClosingEventArgs e)
    {
      DialogResult respuesta = 0;
      respuesta = MessageBox.Show(
        "¿Quiere guardar la agenda?",
        "Seleccione una opción",
        MessageBoxButtons.YesNo,
        MessageBoxIcon.Question);
      if (respuesta == DialogResult.Yes)
      {
        ordenGuardar.PerformClick();
        MessageBox.Show("La agenda actual se guardó");
      }
    }
    
    void OrdenAcercaDeClick(object sender, EventArgs e)
    {
      MessageBox.Show("Aplicación Agenda. Versión 1.0",
                      "Acerca de Agenda",
                      MessageBoxButtons.OK,
                      MessageBoxIcon.Information);
    }
  }
}
