import java.time.LocalDate;

/**
 * Satu tugas sebagai entitas domain: judul, pemilik, status, dan tenggat.
 * Record dipilih karena tugas adalah nilai yang tidak berubah di tempat;
 * perubahan dilakukan lewat method salinan di bawah, persis pola wither.
 */
public record TugasWeb(int id, String judul, String pemilik, StatusTugasWeb status,
        LocalDate tenggat) {

    public TugasWeb {
        if (judul == null || judul.isBlank()) {
            throw new IllegalArgumentException("judul tugas wajib diisi");
        }
        if (pemilik == null || pemilik.isBlank()) {
            throw new IllegalArgumentException("pemilik tugas wajib diisi");
        }
        if (status == null) {
            throw new IllegalArgumentException("status tugas wajib diisi");
        }
        if (tenggat == null) {
            throw new IllegalArgumentException("tenggat tugas wajib diisi");
        }
        judul = judul.strip();
        pemilik = pemilik.strip();
    }

    /** Salinan tugas dengan id berbeda; dipakai repository saat menetapkan id. */
    public TugasWeb denganId(int idBaru) {
        return new TugasWeb(idBaru, judul, pemilik, status, tenggat);
    }

    /** Salinan tugas dengan status berbeda; dipakai layanan saat transisi status. */
    public TugasWeb denganStatus(StatusTugasWeb statusBaru) {
        return new TugasWeb(id, judul, pemilik, statusBaru, tenggat);
    }

    /** Ringkasan satu baris untuk pencatatan di terminal. */
    public String formatRingkas() {
        return "#" + id + " [" + status + "] " + judul
                + " (pemilik " + pemilik + ", tenggat " + tenggat + ")";
    }
}
