Date.java

package no.ntnu.idatt1002.demo.data;

import java.time.LocalDate;
import java.util.List;

/**
 * This class represents a date that can be stored in the database.
 * 
 * <p>
 * The date is stored as a {@link LocalDate} object, and can be extraced as an
 * 8-digit integer via the {@link #getDateInt()} method.
 * 
 * The 8-digit integer is formatted as follows: YYYYMMDD
 * </p>
 */
public class Date implements Storable {
  private LocalDate date;

  public Date() {
    this.date = LocalDate.now();
  }

  /**
   * Constructs a date object with a given date number.
   *
   * @param date the date number
   */
  public Date(int date) {
    String dateStr = Integer.toString(date);
    this.date = LocalDate.of(
        Integer.parseInt(dateStr.substring(0, 2) + 2000),
        Integer.parseInt(dateStr.substring(2, 4)),
        Integer.parseInt(dateStr.substring(4, 6)));
  }

  /**
   * Constructs a date object with a given date.
   *
   * @param date the {@link LocalDate} object
   */
  public Date(LocalDate date) {
    this.date = date;
  }

  /**
   * Returns the date.
   *
   * @return the date
   */
  public LocalDate getDate() {
    return date;
  }

  /**
   * Gets the date as an 8-digit integer.
   *
   * @return the date as an 8-digit integer
   */
  public int getDateInt() {
    return Integer.parseInt(Integer.toString(date.getYear())
        + (date.getMonthValue() < 10 ? "0" + date.getMonthValue() : date.getMonthValue())
        + (date.getDayOfMonth() < 10 ? "0" + date.getDayOfMonth() : date.getDayOfMonth()));
  }

  /**
   * Sets the date.
   *
   * @param date the date
   */
  public void setDate(LocalDate date) {
    this.date = date;
  }

  @Override
  public List<String> getAttributeNames() {
    return List.of("date");
  }

  @Override
  public List<String> getAttributes() {
    return List.of(Integer.toString(date.getYear())
        + (date.getMonthValue() < 10 ? "0" + date.getMonthValue() : date.getMonthValue())
        + (date.getDayOfMonth() < 10 ? "0" + date.getDayOfMonth() : date.getDayOfMonth()));
  }

  @Override
  public String getIdName() {
    return "date";
  }

  @Override
  public int getId() {
    return this.getDateInt();
  }

  @Override
  public String toString() {
    int day = date.getDayOfMonth();
    String dayName = date.getDayOfWeek().toString().substring(0, 3);

    return dayName + " " + day;
  }
}