// test.cpp - Alumnos matriculados en una determinada carrera
#include <iostream>
#include <string>
#include <iomanip>
#include "estudios.h"
using namespace std;

int menu()
{
  cout << '\n';
  cout << "1. Matricular\n";
  cout << "2. Poner notas\n";
  cout << "3. Mostrar expediente\n";
  cout << "4. Salir\n";
  cout << endl;
  cout << "   Opción: ";
  int op;
  do
    cin >> op;
  while (op < 1 || op > 4);
  cin.ignore();
  return op;
}

CAsignatura *leerDatosAsig()
{
  CAsignatura *asig;
  int id;
  string nombre_as;
  char sID[8];
  do
  {
    cout << "ID:          "; cin >> id; cin.ignore();
    // Simular que el nombre de la asignatura procede de una base
    // de datos
    sprintf(sID, "%.2d", id);
    nombre_as = string("asignatura") + string(sID);
    if (nombre_as.empty()) cout << "ID no válido\n";
  }
  while (nombre_as.empty());
  cout << "Nombre:      " << nombre_as;
  // Añadir una asignatura
  asig = new CAsignatura(id, nombre_as);
    // la fecha por omisión es la actual
  return asig;
}

void matricular(CEstudios& v)
{
  // Datos personales del alumno
  int dni;
  string nombre, direc;
  cout << "DNI:         "; cin >> dni; cin.ignore();
  cout << "Nombre:      "; getline(cin, nombre);
  cout << "Dirección:   "; getline(cin, direc);
  CAlumno al(dni, nombre, direc);

  // Asignaturas de las que se va a matricular
  cout << endl;
  cout << "Asignaturas:\n";
  char respuesta;
  do
  {
    CAsignatura *asig = leerDatosAsig();
    al.anyadirAsignatura(asig);
    delete asig;
    cout << endl;
    do
    {
      cout << "¿Otra asignatura? s/n: ";
      cin >> respuesta;
      cin.ignore();
    }
    while(respuesta != 's' && respuesta != 'n');
  }
  while(respuesta == 's');
  // Añadir el alumno que se acaba de matricular
  v.anyadirAlumno(al);
} 

void poner_notas(CEstudios& v, int id)
{
  if (v.numeroAlumnos() == 0)
  {
    cerr << "No hay alumnos matriculados\n";
    return;
  }
  // Poner la nota de la asignatura id, a todos los alumnos
  // matriculados en ella
  for (unsigned int al = 0; al < v.numeroAlumnos(); al++)
  {
    int pos; // posición de la asignatura id en la lista
    if (v.alumno(al).estaEnActa(id, pos)) // está en actas
    {
      CConvocatoria conv; // convocatoria a añadir
      cout << v.alumno(al).obtenerNombre() << ", nota: ";
      float nota; // nota obtenida en esta convocatoria
      cin >> nota; cin.ignore();
      conv.asignarConvocatoria(
        v.alumno(al).obtenerAsignatura(pos)->convocatoriasConsumidas()+1);
      conv.asignarFecha(); // por omisión, fecha actual
      conv.asignarNota(nota);
      v.alumno(al).obtenerAsignatura(pos)->anyadirConvocatoria(conv);
    }
  }
}

void mostrar_expediente(CEstudios& v, int dni)
{
  if (v.numeroAlumnos() == 0)
  {
    cerr << "No hay alumnos matriculados\n";
    return;
  }
  CConvocatoria c;
  unsigned int al, i = 0;

  for (al = 0; al < v.numeroAlumnos(); al++)
    if (v.alumno(al).obtenerDNI() == dni) break;
  if (al == v.numeroAlumnos())
  {
    cerr << "error: no existe un alumno con ese DNI\n";
    return;
  }
  // Mostrar el expediente del alumno "dni"
  cout << "Alumno " << v.alumno(al).obtenerNombre() << ": " << endl;
  cout << left << setw(25) << "Asignatura"
        << right << setw(15) << "Convocatoria"
        << setw(15) << "Nota" << endl;
  for (unsigned int as = 0; as < v.alumno(al).numeroAsignaturas(); as++)
  {
    CAsignatura *asig = v.alumno(al).obtenerAsignatura(as);
    cout << left << setw(25) << asig->obtenerNombre();
    for (i = 1; i <= asig->convocatoriasConsumidas(); i++)
    {
      c = asig->obtenerConvocatoria(i);
      cout << right << setw(15) << c.obtenerConvocatoria()
            << setw(15) << c.obtenerNota() << endl
            << left << setw(25) << "";
    }
    if (asig->convocatoriasConsumidas() == 0)
      cout << right << setw(30) << "NP" << endl;
    cout << endl;
  }
}

int main()
{
  // Crear un objeto estudio (carrera a cursar)
  CEstudios estudio;
  int opcion = 0, id, dni;

  do
  {
    opcion = menu();
    switch (opcion)
    {
      case 1:
        matricular(estudio);
        break;
      case 2:
        cout << "ID asignatura: "; cin >> id;
        poner_notas(estudio, id);
        break;
      case 3:
        cout << "DNI: "; cin >> dni;
        mostrar_expediente(estudio, dni);
        break;
    }
  }
  while(opcion != 4);
}

