import java.time.LocalDate;
import java.time.format.DateTimeParseException;
import java.util.ArrayList;
import java.util.List;

/**
 * Validasi bentuk field muatan tugas: panjang judul, isi pemilik, format
 * tanggal, dan karakter yang dilarang format penyimpanan Bagian 3. Seluruh
 * galat dikumpulkan sekaligus agar klien tahu semua kesalahan dalam satu
 * respons, bukan satu per satu. Aturan yang butuh konteks (tenggat lampau,
 * batas tugas aktif) tetap di LayananTugasWeb.
 */
public final class ValidasiWeb {

    private ValidasiWeb() {
        // Kelas utilitas: seluruh anggota static.
    }

    /**
     * Memeriksa muatan permintaan dan mengembalikan daftar galat.
     * Daftar kosong berarti seluruh field lolos pemeriksaan bentuk.
     */
    public static List<String> periksa(PermintaanTugas permintaan) {
        List<String> galat = new ArrayList<>();

        String judul = permintaan.judul() == null ? "" : permintaan.judul().strip();
        if (judul.length() < 3 || judul.length() > 100) {
            galat.add("judul wajib berisi 3-100 karakter");
        }
        if (judul.contains("|")) {
            galat.add("judul tidak boleh memuat karakter '|' (pemisah format penyimpanan)");
        }

        String pemilik = permintaan.pemilik() == null ? "" : permintaan.pemilik().strip();
        if (pemilik.isEmpty() || pemilik.length() > 60) {
            galat.add("pemilik wajib diisi, maksimum 60 karakter");
        }
        if (pemilik.contains("|")) {
            galat.add("pemilik tidak boleh memuat karakter '|'");
        }

        if (permintaan.tenggat() == null) {
            galat.add("tenggat wajib berformat ISO yyyy-MM-dd");
        } else {
            try {
                LocalDate.parse(permintaan.tenggat().strip());
            } catch (DateTimeParseException e) {
                galat.add("tenggat wajib berformat ISO yyyy-MM-dd");
            }
        }
        return galat;
    }
}
