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

/**
 * Validasi payload tugas yang mengumpulkan seluruh pelanggaran sekaligus,
 * bukan berhenti pada pelanggaran pertama. Hasilnya: satu respons 400
 * yang menyebut semua masalah sehingga klien cukup memperbaiki sekali.
 */
public final class ValidasiTugas {

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

    /** Validasi POST: judul, pemilik, dan tenggat wajib; status tidak dibaca. */
    public static List<String> galatBuat(Map<String, Object> payload) {
        List<String> galat = new ArrayList<>();
        cekJudul(payload, galat);
        cekPemilik(payload, galat);
        cekTenggat(payload, galat);
        return galat;
    }

    /** Validasi PUT: seluruh field wajib, termasuk status. */
    public static List<String> galatUbah(Map<String, Object> payload) {
        List<String> galat = new ArrayList<>(galatBuat(payload));
        String status = teks(payload, "status");
        if (status == null) {
            galat.add("status wajib diisi (TODO/SELESAI)");
        } else {
            try {
                StatusTugas.dariTeks(status);
            } catch (IllegalArgumentException e) {
                galat.add(e.getMessage());
            }
        }
        return galat;
    }

    private static void cekJudul(Map<String, Object> payload, List<String> galat) {
        String judul = teks(payload, "judul");
        if (judul == null) {
            galat.add("judul wajib diisi");
        } else if (judul.isEmpty()) {
            galat.add("judul tidak boleh kosong");
        } else if (judul.length() > Tugas.PANJANG_JUDUL_MAKS) {
            galat.add("judul " + judul.length() + " karakter, maksimal "
                    + Tugas.PANJANG_JUDUL_MAKS);
        }
    }

    private static void cekPemilik(Map<String, Object> payload, List<String> galat) {
        String pemilik = teks(payload, "pemilik");
        if (pemilik == null) {
            galat.add("pemilik wajib diisi");
        } else if (pemilik.isEmpty()) {
            galat.add("pemilik tidak boleh kosong");
        }
    }

    private static void cekTenggat(Map<String, Object> payload, List<String> galat) {
        String tenggat = teks(payload, "tenggat");
        if (tenggat == null) {
            galat.add("tenggat wajib diisi");
        } else {
            try {
                LocalDate.parse(tenggat);
            } catch (DateTimeParseException e) {
                galat.add("tenggat '" + tenggat + "' harus ISO-8601, contoh 2026-01-20");
            }
        }
    }

    /** Nilai field sebagai String yang sudah dipangkas; null bila hilang atau bukan teks. */
    private static String teks(Map<String, Object> payload, String kunci) {
        if (payload.get(kunci) instanceof String s) {
            return s.strip();
        }
        return null;
    }
}
