import java.util.ArrayList;
import java.util.List;

/**
 * Kumpulan tugas beserta seluruh aturan validasinya.
 * Class ini menjadi satu-satunya pihak yang boleh mengubah isi daftar.
 */
public class DaftarTugas {

    private final List<Tugas> daftar = new ArrayList<>();

    /**
     * Menambah tugas baru setelah memvalidasi judul.
     * Id ditetapkan otomatis mengikuti urutan penambahan.
     */
    public Tugas tambah(String judul) throws MasukanInvalidException {
        if (judul == null) {
            throw new MasukanInvalidException("Judul tidak boleh kosong.");
        }
        String judulBersih = judul.strip();
        if (judulBersih.isEmpty()) {
            throw new MasukanInvalidException("Judul tidak boleh kosong.");
        }
        if (judulBersih.length() > 100) {
            throw new MasukanInvalidException(
                    "Judul " + judulBersih.length() + " karakter; maksimal 100.");
        }
        Tugas tugas = new Tugas(daftar.size() + 1, judulBersih);
        daftar.add(tugas);
        return tugas;
    }

    /**
     * Menandai tugas dengan id pada teksId sebagai selesai.
     * Masukan " 1 " tetap diterima karena spasi dipangkas lebih dulu.
     */
    public Tugas tandaiSelesai(String teksId)
            throws MasukanInvalidException, TugasTidakDitemukanException {
        Tugas tugas = cari(teksId);
        tugas.tandaiSelesai();
        return tugas;
    }

    /** Salinan daftar saat ini; urutan mengikuti urutan penambahan. */
    public List<Tugas> semua() {
        return List.copyOf(daftar);
    }

    public boolean kosong() {
        return daftar.isEmpty();
    }

    private Tugas cari(String teksId)
            throws MasukanInvalidException, TugasTidakDitemukanException {
        int id;
        try {
            id = Integer.parseInt(teksId.strip());
        } catch (NumberFormatException e) {
            throw new MasukanInvalidException(
                    "Id harus berupa angka, diterima: \"" + teksId.strip() + "\".");
        }
        for (Tugas tugas : daftar) {
            if (tugas.id() == id) {
                return tugas;
            }
        }
        throw new TugasTidakDitemukanException(id);
    }
}
