import java.lang.reflect.*;

interface BisaTerbang {
    void terbang();
}

abstract class Hewan {
    protected String nama;

    public abstract void bersuara();
}

class Burung extends Hewan implements BisaTerbang {
    @Override
    public void bersuara() {
        System.out.println("Cipok!");
    }

    @Override
    public void terbang() {
        System.out.println("Terbang!");
    }
}

record Titik(int x, int y) {}

enum Musim { KEMARAU, HUJAN }

public class InspeksiStruktur {
    public static void main(String[] args) {
        periksa("interface", BisaTerbang.class);
        periksa("class abstrak", Hewan.class);
        periksa("class konkret", Burung.class);
        periksa("record", Titik.class);
        periksa("enum", Musim.class);
        periksa("array", int[].class);
    }

    static void periksa(String label, Class<?> c) {
        System.out.println("== " + label + " : " + c.getName());
        System.out.println("   sederhana : " + c.getSimpleName());
        System.out.println("   package   : '" + c.getPackageName() + "'");
        String mod = Modifier.toString(c.getModifiers());
        System.out.println("   modifier  : " + (mod.isEmpty() ? "(package-private)" : mod));
        Class<?> induk = c.getSuperclass();
        System.out.println("   superclass: " + (induk == null ? "(tidak ada)" : induk.getSimpleName()));
        System.out.println("   interfaces: " + ringkas(c.getInterfaces()));
        System.out.println("   record? " + c.isRecord() + ", enum? " + c.isEnum()
                + ", array? " + c.isArray() + ", interface? " + c.isInterface());
    }

    static String ringkas(Class<?>[] daftar) {
        if (daftar.length == 0) {
            return "(tidak ada)";
        }
        StringBuilder hasil = new StringBuilder();
        for (Class<?> i : daftar) {
            if (hasil.length() > 0) {
                hasil.append(", ");
            }
            hasil.append(i.getSimpleName());
        }
        return hasil.toString();
    }
}
