// fecha.cpp - Definición de los métodos de la clase CFecha
#include <iostream>
#include "ctime"
#include "fecha.h"
using namespace std;

CFecha::CFecha(int dd, int mm, int aaaa) : /* constructor */
dia(dd), mes(mm), anyo(aaaa)
{
  if (!fechaCorrecta())
  {
    cout << "Fecha incorrecta. Se asigna una fecha por omisión.\n";
    dia = 1; mes = 1; anyo = 2001;
  }
}

bool CFecha::bisiesto() const
{
  return ((anyo % 4 == 0) && (anyo % 100 != 0) || (anyo % 400 == 0));
}

void CFecha::asignarFecha(int dd, int mm, int aaaa)
{
  // Asignar, por omisión, la fecha actual.
  struct tm *fh;
  time_t segundos;

  time(&segundos);
  fh = localtime(&segundos);

  if (dd) dia = dd; else dia = fh->tm_mday;
  if (mm) mes = mm; else mes = fh->tm_mon;
  if (aaaa) anyo = aaaa; else anyo = fh->tm_year+1900;
}

void CFecha::obtenerFecha(int& dd, int& mm, int& aaaa) const
{
  dd = dia; mm = mes; aaaa = anyo;
}

bool CFecha::fechaCorrecta() const
{
  bool diaCorrecto, mesCorrecto, anyoCorrecto;

  anyoCorrecto = (anyo >= 1582); // ¿año correcto?
  mesCorrecto = (mes >= 1) && (mes <= 12); // ¿mes correcto?
  switch (mes)
  // ¿día correcto?
  {
    case 2:
      if (bisiesto())
        diaCorrecto = (dia >= 1 && dia <= 29);
      else
        diaCorrecto = (dia >= 1 && dia <= 28);
      break;
    case 4: case 6: case 9: case 11:
      diaCorrecto = (dia >= 1 && dia <= 30);
      break;
    default:
      diaCorrecto = (dia >= 1 && dia <= 31);
  }
  return diaCorrecto && mesCorrecto && anyoCorrecto;
}

const int& CFecha::obtenerDia() const
{
  return dia;
}

const int& CFecha::obtenerMes() const
{
  return mes;
}

const int& CFecha::obtenerAnyo() const
{
  return anyo;
}

