import os, datetime, math, threading
import customtkinter as ctk
from tkinter import messagebox
import ephem

# =========================================================================
# ---> PENTING: SILAKAN COPAS HIJRI_DB LENGKAP DARI KODE MASTER ANDA <---
# Di bawah ini hanya sampel struktur agar script bisa berjalan.
# Pastikan indeks 8 (Bulan ke-9 / Ramadhan) valid formatnya: ["Ramadan", "Hari", "DD-MMM-YYYY", 30]
# =========================================================================
HIJRI_DB = {
    1446: [["Muharam", "Ahad Kliwon", "07-Jul-2024", 29], ["Safar", "Senin", "05-Aug-2024", 30], ["Rabiulawal", "Rabu", "04-Sep-2024", 30], ["Rabiulakhir", "Jumat", "04-Oct-2024", 30], ["Jumadilawal", "Ahad", "03-Nov-2024", 29], ["Jumadilakhir", "Senin", "02-Dec-2024", 30], ["Rajab", "Rabu", "01-Jan-2025", 30], ["Syakban", "Jumat", "31-Jan-2025", 29], ["Ramadan", "Sabtu", "01-Mar-2025", 30], ["Syawal", "Ahad", "31-Mar-2025", 30], ["Zulkaidah", "Selasa", "29-Apr-2025", 29], ["Zulhijah", "Rabu", "28-May-2025", 29]],
    1447: [["Muharam", "Kamis Wage", "26-Jun-2025", 30], ["Safar", "Sabtu Wage", "26-Jul-2025", 29], ["Rabiulawal", "Ahad Pon", "24-Aug-2025", 30], ["Rabiulakhir", "Selasa Pon", "23-Sep-2025", 30], ["Jumadilawal", "Kamis Pon", "23-Oct-2025", 29], ["Jumadilakhir", "Jumat Pahing", "21-Nov-2025", 30], ["Rajab", "Ahad Pahing", "21-Dec-2025", 30], ["Syakban", "Selasa Pahing", "20-Jan-2026", 29], ["Ramadan", "Rabu Legi", "18-Feb-2026", 30], ["Syawal", "Jumat Legi", "20-Mar-2026", 29], ["Zulkaidah", "Sabtu Kliwon", "18-Apr-2026", 30], ["Zulhijah", "Senin Kliwon", "18-May-2026", 29]],
    1448: [["Muharam", "Selasa Wage", "16-Jun-2026", 29], ["Safar", "Rabu", "15-Jul-2026", 29], ["Rabiulawal", "Kamis", "13-Aug-2026", 30], ["Rabiulakhir", "Sabtu", "12-Sep-2026", 30], ["Jumadilawal", "Senin", "12-Oct-2026", 29], ["Jumadilakhir", "Selasa", "10-Nov-2026", 30], ["Rajab", "Kamis", "10-Dec-2026", 30], ["Syakban", "Sabtu", "09-Jan-2027", 30], ["Ramadan", "Senin", "08-Feb-2027", 29], ["Syawal", "Selasa", "09-Mar-2027", 30], ["Zulkaidah", "Kamis", "08-Apr-2027", 29], ["Zulhijah", "Jumat Wage", "07-May-2027", 30]],
    1449: [["Muharam", "Ahad Wage", "06-Jun-2027", 29], ["Safar", "Senin", "05-Jul-2027", 29], ["Rabiulawal", "Selasa", "03-Aug-2027", 30], ["Rabiulakhir", "Kamis", "02-Sep-2027", 29], ["Jumadilawal", "Jumat", "01-Oct-2027", 30], ["Jumadilakhir", "Ahad", "31-Oct-2027", 29], ["Rajab", "Senin", "29-Nov-2027", 30], ["Syakban", "Rabu", "29-Dec-2027", 29], ["Ramadan", "Jumat", "28-Jan-2028", 30], ["Syawal", "Sabtu", "26-Feb-2028", 30], ["Zulkaidah", "Senin", "27-Mar-2028", 30], ["Zulhijah", "Rabu", "26-Apr-2028", 29]],
    1450: [["Muharam", "Kamis", "25-May-2028", 30], ["Safar", "Sabtu", "24-Jun-2028", 29], ["Rabiulawal", "Ahad", "23-Jul-2028", 29], ["Rabiulakhir", "Senin", "21-Aug-2028", 30], ["Jumadilawal", "Rabu", "20-Sep-2028", 29], ["Jumadilakhir", "Kamis", "19-Oct-2028", 30], ["Rajab", "Sabtu", "18-Nov-2028", 29], ["Syakban", "Ahad", "17-Dec-2028", 30], ["Ramadan", "Selasa", "16-Jan-2029", 29], ["Syawal", "Rabu", "14-Feb-2029", 30], ["Zulkaidah", "Jumat", "16-Mar-2029", 30], ["Zulhijah", "Ahad", "15-Apr-2029", 29]],
    1451: [["Muharam", "Senin", "14-May-2029", 30], ["Safar", "Rabu", "13-Jun-2029", 29], ["Rabiulawal", "Kamis", "12-Jul-2029", 30], ["Rabiulakhir", "Sabtu", "11-Aug-2029", 29], ["Jumadilawal", "Ahad", "09-Sep-2029", 30], ["Jumadilakhir", "Selasa", "09-Oct-2029", 29], ["Rajab", "Rabu", "07-Nov-2029", 30], ["Syakban", "Jumat", "07-Dec-2029", 29], ["Ramadan", "Sabtu", "05-Jan-2030", 30], ["Syawal", "Senin", "04-Feb-2030", 29], ["Zulkaidah", "Selasa", "05-Mar-2030", 30], ["Zulhijah", "Kamis", "04-Apr-2030", 29]],
    1452: [["Muharam", "Jumat", "03-May-2030", 30], ["Safar", "Ahad", "02-Jun-2030", 30], ["Rabiulawal", "Selasa", "02-Jul-2030", 30], ["Rabiulakhir", "Kamis", "01-Aug-2030", 29], ["Jumadilawal", "Jumat", "30-Aug-2030", 29], ["Jumadilakhir", "Sabtu", "28-Sep-2030", 30], ["Rajab", "Senin", "28-Oct-2030", 29], ["Syakban", "Selasa", "26-Nov-2030", 30], ["Ramadan", "Kamis", "26-Dec-2030", 29], ["Syawal", "Jumat", "24-Jan-2031", 29], ["Zulkaidah", "Sabtu", "22-Feb-2031", 30], ["Zulhijah", "Senin", "24-Mar-2031", 30]],
    1453: [["Muharam", "Rabu", "23-Apr-2031", 29], ["Safar", "Kamis", "22-May-2031", 30], ["Rabiulawal", "Sabtu", "21-Jun-2031", 30], ["Rabiulakhir", "Senin", "21-Jul-2031", 29], ["Jumadilawal", "Selasa", "19-Aug-2031", 30], ["Jumadilakhir", "Kamis", "18-Sep-2031", 29], ["Rajab", "Jumat", "17-Oct-2031", 30], ["Syakban", "Ahad", "16-Nov-2031", 30], ["Ramadan", "Senin", "15-Dec-2031", 29], ["Syawal", "Rabu", "14-Jan-2032", 29], ["Zulkaidah", "Kamis", "12-Feb-2032", 29], ["Zulhijah", "Jumat", "12-Mar-2032", 30]],
    1454: [["Muharam", "Ahad", "11-Apr-2032", 30], ["Safar", "Selasa", "11-May-2032", 29], ["Rabiulawal", "Rabu", "09-Jun-2032", 30], ["Rabiulakhir", "Jumat", "09-Jul-2032", 29], ["Jumadilawal", "Sabtu", "07-Aug-2032", 30], ["Jumadilakhir", "Senin", "06-Sep-2032", 29], ["Rajab", "Selasa", "05-Oct-2032", 30], ["Syakban", "Kamis", "04-Nov-2032", 30], ["Ramadan", "Sabtu", "04-Dec-2032", 30], ["Syawal", "Ahad", "02-Jan-2033", 29], ["Zulkaidah", "Selasa", "01-Feb-2033", 29], ["Zulhijah", "Rabu", "02-Mar-2033", 30]],
    1455: [["Muharam", "Jumat", "01-Apr-2033", 29], ["Safar", "Sabtu", "30-Apr-2033", 29], ["Rabiulawal", "Ahad", "29-May-2033", 30], ["Rabiulakhir", "Selasa", "28-Jun-2033", 29], ["Jumadilawal", "Rabu", "27-Jul-2033", 30], ["Jumadilakhir", "Jumat", "26-Aug-2033", 29], ["Rajab", "Sabtu", "24-Sep-2033", 30], ["Syakban", "Senin", "24-Oct-2033", 30], ["Ramadan", "Rabu", "23-Nov-2033", 30], ["Syawal", "Jumat", "23-Dec-2033", 29], ["Zulkaidah", "Sabtu", "21-Jan-2034", 30], ["Zulhijah", "Senin", "20-Feb-2034", 29]],
    1456: [["Muharam", "Selasa", "21-Mar-2034", 30], ["Safar", "Kamis", "20-Apr-2034", 29], ["Rabiulawal", "Jumat", "19-May-2034", 29], ["Rabiulakhir", "Sabtu", "17-Jun-2034", 30], ["Jumadilawal", "Senin", "17-Jul-2034", 29], ["Jumadilakhir", "Selasa", "15-Aug-2034", 29], ["Rajab", "Rabu", "13-Sep-2034", 30], ["Syakban", "Jumat", "13-Oct-2034", 30], ["Ramadan", "Ahad", "12-Nov-2034", 30], ["Syawal", "Selasa", "12-Dec-2034", 30], ["Zulkaidah", "Kamis", "11-Jan-2035", 29], ["Zulhijah", "Jumat", "09-Feb-2035", 30]],
    1457: [["Muharam", "Ahad", "11-Mar-2035", 29], ["Safar", "Senin", "09-Apr-2035", 30], ["Rabiulawal", "Rabu", "09-May-2035", 29], ["Rabiulakhir", "Kamis", "07-Jun-2035", 29], ["Jumadilawal", "Jumat", "06-Jul-2035", 29], ["Jumadilakhir", "Sabtu", "04-Aug-2035", 30], ["Rajab", "Senin", "03-Sep-2035", 30], ["Syakban", "Rabu", "03-Oct-2035", 29], ["Ramadan", "Kamis", "01-Nov-2035", 30], ["Syawal", "Sabtu", "01-Dec-2035", 30], ["Zulkaidah", "Senin", "31-Dec-2035", 30], ["Zulhijah", "Rabu", "30-Jan-2036", 29]],
    1458: [["Muharam", "Kamis", "28-Feb-2036", 30], ["Safar", "Sabtu", "29-Mar-2036", 29], ["Rabiulawal", "Ahad", "27-Apr-2036", 30], ["Rabiulakhir", "Selasa", "27-May-2036", 29], ["Jumadilawal", "Rabu", "25-Jun-2036", 29], ["Jumadilakhir", "Kamis", "24-Jul-2036", 30], ["Rajab", "Sabtu", "23-Aug-2036", 29], ["Syakban", "Ahad", "21-Sep-2036", 29], ["Ramadan", "Senin", "20-Oct-2036", 30], ["Syawal", "Rabu", "19-Nov-2036", 30], ["Zulkaidah", "Jumat", "19-Dec-2036", 30], ["Zulhijah", "Ahad", "18-Jan-2037", 29]],
    1459: [["Muharam", "Senin", "16-Feb-2037", 30], ["Safar", "Rabu", "18-Mar-2037", 30], ["Rabiulawal", "Jumat", "17-Apr-2037", 29], ["Rabiulakhir", "Sabtu", "16-May-2037", 29], ["Jumadilawal", "Ahad", "14-Jun-2037", 30], ["Jumadilakhir", "Selasa", "14-Jul-2037", 29], ["Rajab", "Rabu", "12-Aug-2037", 30], ["Syakban", "Jumat", "11-Sep-2037", 29], ["Ramadan", "Sabtu", "10-Oct-2037", 30], ["Syawal", "Ahad", "08-Nov-2037", 30], ["Zulkaidah", "Selasa", "08-Dec-2037", 30], ["Zulhijah", "Kamis", "07-Jan-2038", 29]],
    1460: [["Muharam", "Jumat", "05-Feb-2038", 30], ["Safar", "Ahad", "07-Mar-2038", 30], ["Rabiulawal", "Senin", "05-Apr-2038", 29], ["Rabiulakhir", "Rabu", "05-May-2038", 30], ["Jumadilawal", "Jumat", "04-Jun-2038", 29], ["Jumadilakhir", "Sabtu", "03-Jul-2038", 30], ["Rajab", "Senin", "02-Aug-2038", 29], ["Syakban", "Selasa", "31-Aug-2038", 30], ["Ramadan", "Kamis", "30-Sep-2038", 29], ["Syawal", "Jumat", "29-Oct-2038", 29], ["Zulkaidah", "Sabtu", "27-Nov-2038", 30], ["Zulhijah", "Senin", "27-Dec-2038", 30]],
    1461: [["Muharam", "Rabu", "26-Jan-2039", 29], ["Safar", "Kamis", "24-Feb-2039", 30], ["Rabiulawal", "Sabtu", "26-Mar-2039", 29], ["Rabiulakhir", "Ahad", "24-Apr-2039", 30], ["Jumadilawal", "Selasa", "24-May-2039", 29], ["Jumadilakhir", "Rabu", "22-Jun-2039", 30], ["Rajab", "Jumat", "22-Jul-2039", 30], ["Syakban", "Ahad", "21-Aug-2039", 29], ["Ramadan", "Senin", "19-Sep-2039", 30], ["Syawal", "Rabu", "19-Oct-2039", 29], ["Zulkaidah", "Kamis", "17-Nov-2039", 30], ["Zulhijah", "Sabtu", "17-Dec-2039", 29]],
    1462: [["Muharam", "Ahad", "15-Jan-2040", 29], ["Safar", "Senin", "13-Feb-2040", 30], ["Rabiulawal", "Rabu", "14-Mar-2040", 29], ["Rabiulakhir", "Kamis", "12-Apr-2040", 30], ["Jumadilawal", "Sabtu", "12-May-2040", 29], ["Jumadilakhir", "Ahad", "10-Jun-2040", 30], ["Rajab", "Selasa", "10-Jul-2040", 30], ["Syakban", "Kamis", "09-Aug-2040", 30], ["Ramadan", "Jumat", "08-Sep-2040", 30], ["Syawal", "Ahad", "07-Oct-2040", 30], ["Zulkaidah", "Selasa", "06-Nov-2040", 29], ["Zulhijah", "Rabu", "05-Dec-2040", 30]],
    1463: [["Muharam", "Jumat", "04-Jan-2041", 29], ["Safar", "Sabtu", "02-Feb-2041", 29], ["Rabiulawal", "Ahad", "03-Mar-2041", 30], ["Rabiulakhir", "Selasa", "02-Apr-2041", 29], ["Jumadilawal", "Rabu", "01-May-2041", 30], ["Jumadilakhir", "Jumat", "31-May-2041", 29], ["Rajab", "Sabtu", "29-Jun-2041", 30], ["Syakban", "Senin", "29-Jul-2041", 29], ["Ramadan", "Selasa", "27-Aug-2041", 30], ["Syawal", "Kamis", "26-Sep-2041", 30], ["Zulkaidah", "Sabtu", "26-Oct-2041", 30], ["Zulhijah", "Senin", "25-Nov-2041", 29]],
    1464: [["Muharam", "Selasa", "24-Dec-2041", 30], ["Safar", "Kamis", "23-Jan-2042", 29], ["Rabiulawal", "Jumat", "21-Feb-2042", 30], ["Rabiulakhir", "Ahad", "23-Mar-2042", 29], ["Jumadilawal", "Senin", "21-Apr-2042", 29], ["Jumadilakhir", "Selasa", "20-May-2042", 30], ["Rajab", "Kamis", "19-Jun-2042", 29], ["Syakban", "Jumat", "18-Jul-2042", 30], ["Ramadan", "Ahad", "17-Aug-2042", 29], ["Syawal", "Senin", "16-Sep-2042", 30], ["Zulkaidah", "Rabu", "15-Oct-2042", 30], ["Zulhijah", "Jumat", "14-Nov-2042", 30]],
    1465: [["Muharam", "Ahad", "14-Dec-2042", 29], ["Safar", "Senin", "12-Jan-2043", 30], ["Rabiulawal", "Rabu", "11-Feb-2043", 29], ["Rabiulakhir", "Kamis", "12-Mar-2043", 30], ["Jumadilawal", "Sabtu", "11-Apr-2043", 29], ["Jumadilakhir", "Ahad", "10-May-2043", 30], ["Rajab", "Senin", "08-Jun-2043", 29], ["Syakban", "Selasa", "07-Jul-2043", 30], ["Ramadan", "Kamis", "06-Aug-2043", 29], ["Syawal", "Jumat", "04-Sep-2043", 30], ["Zulkaidah", "Ahad", "04-Oct-2043", 30], ["Zulhijah", "Selasa", "03-Nov-2043", 30]],
    1466: [["Muharam", "Kamis", "03-Dec-2043", 29], ["Safar", "Jumat", "01-Jan-2044", 30], ["Rabiulawal", "Ahad", "31-Jan-2044", 30], ["Rabiulakhir", "Selasa", "01-Mar-2044", 29], ["Jumadilawal", "Rabu", "30-Mar-2044", 30], ["Jumadilakhir", "Jumat", "29-Apr-2044", 29], ["Rajab", "Sabtu", "28-May-2044", 29], ["Syakban", "Ahad", "26-Jun-2044", 29], ["Ramadan", "Senin", "25-Jul-2044", 30], ["Syawal", "Rabu", "24-Aug-2044", 29], ["Zulkaidah", "Kamis", "22-Sep-2044", 30], ["Zulhijah", "Sabtu", "22-Oct-2044", 30]],
    1467: [["Muharam", "Senin", "21-Nov-2044", 29], ["Safar", "Selasa", "20-Dec-2044", 30], ["Rabiulawal", "Kamis", "19-Jan-2045", 30], ["Rabiulakhir", "Sabtu", "18-Feb-2045", 30], ["Jumadilawal", "Senin", "20-Mar-2045", 29], ["Jumadilakhir", "Selasa", "18-Apr-2045", 30], ["Rajab", "Kamis", "18-May-2045", 29], ["Syakban", "Jumat", "16-Jun-2045", 29], ["Ramadan", "Sabtu", "15-Jul-2045", 29], ["Syawal", "Ahad", "13-Aug-2045", 30], ["Zulkaidah", "Selasa", "12-Sep-2045", 29], ["Zulhijah", "Rabu", "11-Oct-2045", 30]],
    1468: [["Muharam", "Jumat", "10-Nov-2045", 30], ["Safar", "Ahad", "10-Dec-2045", 29], ["Rabiulawal", "Senin", "08-Jan-2046", 30], ["Rabiulakhir", "Rabu", "07-Feb-2046", 30], ["Jumadilawal", "Jumat", "09-Mar-2046", 29], ["Jumadilakhir", "Sabtu", "07-Apr-2046", 30], ["Rajab", "Senin", "07-May-2046", 29], ["Syakban", "Selasa", "05-Jun-2046", 30], ["Ramadan", "Kamis", "05-Jul-2046", 29], ["Syawal", "Jumat", "03-Aug-2046", 30], ["Zulkaidah", "Ahad", "02-Sep-2046", 29], ["Zulhijah", "Senin", "01-Oct-2046", 29]],
    1469: [["Muharam", "Selasa", "30-Oct-2046", 30], ["Safar", "Kamis", "29-Nov-2046", 29], ["Rabiulawal", "Sabtu", "29-Dec-2046", 30], ["Rabiulakhir", "Ahad", "27-Jan-2047", 29], ["Jumadilawal", "Selasa", "26-Feb-2047", 30], ["Jumadilakhir", "Kamis", "28-Mar-2047", 29], ["Rajab", "Jumat", "26-Apr-2047", 30], ["Syakban", "Ahad", "26-May-2047", 29], ["Ramadan", "Selasa", "25-Jun-2047", 30], ["Syawal", "Rabu", "24-Jul-2047", 29], ["Zulkaidah", "Kamis", "22-Aug-2047", 30], ["Zulhijah", "Sabtu", "21-Sep-2047", 29]],
    1470: [["Muharam", "Ahad", "20-Oct-2047", 30], ["Safar", "Selasa", "19-Nov-2047", 29], ["Rabiulawal", "Rabu", "18-Dec-2047", 29], ["Rabiulakhir", "Kamis", "16-Jan-2048", 30], ["Jumadilawal", "Sabtu", "15-Feb-2048", 29], ["Jumadilakhir", "Ahad", "15-Mar-2048", 30], ["Rajab", "Selasa", "14-Apr-2048", 30], ["Syakban", "Kamis", "14-May-2048", 30], ["Ramadan", "Sabtu", "13-Jun-2048", 29], ["Syawal", "Ahad", "12-Jul-2048", 30], ["Zulkaidah", "Selasa", "11-Aug-2048", 29], ["Zulhijah", "Rabu", "09-Sep-2048", 30]],
    1471: [["Muharam", "Jumat", "09-Oct-2048", 29], ["Safar", "Sabtu", "07-Nov-2048", 30], ["Rabiulawal", "Senin", "07-Dec-2048", 29], ["Rabiulakhir", "Selasa", "05-Jan-2049", 29], ["Jumadilawal", "Rabu", "03-Feb-2049", 30], ["Jumadilakhir", "Jumat", "05-Mar-2049", 29], ["Rajab", "Sabtu", "03-Apr-2049", 30], ["Syakban", "Senin", "03-May-2049", 30], ["Ramadan", "Rabu", "02-Jun-2049", 29], ["Syawal", "Kamis", "01-Jul-2049", 30], ["Zulkaidah", "Sabtu", "31-Jul-2049", 30], ["Zulhijah", "Senin", "30-Aug-2049", 29]],
    1472: [["Muharam", "Selasa", "28-Sep-2049", 30], ["Safar", "Kamis", "28-Oct-2049", 29], ["Rabiulawal", "Jumat", "26-Nov-2049", 30], ["Rabiulakhir", "Ahad", "26-Dec-2049", 29], ["Jumadilawal", "Senin", "24-Jan-2050", 29], ["Jumadilakhir", "Selasa", "22-Feb-2050", 30], ["Rajab", "Kamis", "24-Mar-2050", 29], ["Syakban", "Jumat", "22-Apr-2050", 30], ["Ramadan", "Ahad", "22-May-2050", 29], ["Syawal", "Senin", "20-Jun-2050", 30], ["Zulkaidah", "Rabu", "20-Jul-2050", 30], ["Zulhijah", "Jumat", "19-Aug-2050", 29]],
    1473: [["Muharam", "Sabtu", "17-Sep-2050", 30], ["Safar", "Senin", "17-Oct-2050", 30], ["Rabiulawal", "Rabu", "16-Nov-2050", 29], ["Rabiulakhir", "Kamis", "15-Dec-2050", 30], ["Jumadilawal", "Sabtu", "14-Jan-2051", 29], ["Jumadilakhir", "Ahad", "12-Feb-2051", 30], ["Rajab", "Selasa", "14-Mar-2051", 29], ["Syakban", "Rabu", "12-Apr-2051", 29], ["Ramadan", "Kamis", "11-May-2051", 30], ["Syawal", "Sabtu", "10-Jun-2051", 29], ["Zulkaidah", "Ahad", "09-Jul-2051", 30], ["Zulhijah", "Selasa", "08-Aug-2051", 29]],
    1474: [["Muharam", "Rabu", "06-Sep-2051", 30], ["Safar", "Jumat", "06-Oct-2051", 30], ["Rabiulawal", "Ahad", "05-Nov-2051", 29], ["Rabiulakhir", "Senin", "04-Dec-2051", 30], ["Jumadilawal", "Rabu", "03-Jan-2052", 30], ["Jumadilakhir", "Jumat", "02-Feb-2052", 29], ["Rajab", "Sabtu", "02-Mar-2052", 30], ["Syakban", "Senin", "01-Apr-2052", 29], ["Ramadan", "Selasa", "30-Apr-2052", 29], ["Syawal", "Rabu", "29-May-2052", 30], ["Zulkaidah", "Jumat", "28-Jun-2052", 29], ["Zulhijah", "Sabtu", "27-Jul-2052", 30]],
    1475: [["Muharam", "Senin", "26-Aug-2052", 29], ["Safar", "Selasa", "24-Sep-2052", 30], ["Rabiulawal", "Kamis", "24-Oct-2052", 29], ["Rabiulakhir", "Jumat", "22-Nov-2052", 30], ["Jumadilawal", "Ahad", "22-Dec-2052", 30], ["Jumadilakhir", "Selasa", "21-Jan-2053", 29], ["Rajab", "Kamis", "20-Feb-2053", 29], ["Syakban", "Jumat", "21-Mar-2053", 30], ["Ramadan", "Ahad", "20-Apr-2053", 29], ["Syawal", "Senin", "19-May-2053", 29], ["Zulkaidah", "Selasa", "17-Jun-2053", 30], ["Zulhijah", "Kamis", "17-Jul-2053", 29]],
    1476: [["Muharam", "Jumat", "15-Aug-2053", 29], ["Safar", "Sabtu", "13-Sep-2053", 30], ["Rabiulawal", "Senin", "13-Oct-2053", 29], ["Rabiulakhir", "Selasa", "11-Nov-2053", 30], ["Jumadilawal", "Kamis", "11-Dec-2053", 30], ["Jumadilakhir", "Sabtu", "10-Jan-2054", 30], ["Rajab", "Senin", "09-Feb-2054", 29], ["Syakban", "Rabu", "11-Mar-2054", 29], ["Ramadan", "Kamis", "09-Apr-2054", 30], ["Syawal", "Sabtu", "09-May-2054", 29], ["Zulkaidah", "Ahad", "07-Jun-2054", 29], ["Zulhijah", "Senin", "06-Jul-2054", 30]],
    1477: [["Muharam", "Rabu", "05-Aug-2054", 29], ["Safar", "Kamis", "03-Sep-2054", 29], ["Rabiulawal", "Jumat", "02-Oct-2054", 30], ["Rabiulakhir", "Ahad", "01-Nov-2054", 29], ["Jumadilawal", "Senin", "30-Nov-2054", 30], ["Jumadilakhir", "Rabu", "30-Dec-2054", 30], ["Rajab", "Jumat", "29-Jan-2055", 30], ["Syakban", "Ahad", "28-Feb-2055", 29], ["Ramadan", "Senin", "29-Mar-2055", 30], ["Syawal", "Rabu", "28-Apr-2055", 30], ["Zulkaidah", "Jumat", "28-May-2055", 29], ["Zulhijah", "Sabtu", "26-Jun-2055", 29]],
    1478: [["Muharam", "Ahad", "25-Jul-2055", 30], ["Safar", "Selasa", "24-Aug-2055", 29], ["Rabiulawal", "Rabu", "22-Sep-2055", 29], ["Rabiulakhir", "Kamis", "21-Oct-2055", 30], ["Jumadilawal", "Sabtu", "20-Nov-2055", 29], ["Jumadilakhir", "Ahad", "19-Dec-2055", 30], ["Rajab", "Selasa", "18-Jan-2056", 30], ["Syakban", "Kamis", "17-Feb-2056", 29], ["Ramadan", "Jumat", "17-Mar-2056", 30], ["Syawal", "Ahad", "16-Apr-2056", 30], ["Zulkaidah", "Selasa", "16-May-2056", 29], ["Zulhijah", "Rabu", "14-Jun-2056", 30]],
    1479: [["Muharam", "Jumat", "14-Jul-2056", 29], ["Safar", "Sabtu", "12-Aug-2056", 30], ["Rabiulawal", "Senin", "11-Sep-2056", 29], ["Rabiulakhir", "Selasa", "10-Oct-2056", 30], ["Jumadilawal", "Rabu", "08-Nov-2056", 30], ["Jumadilakhir", "Jumat", "08-Dec-2056", 29], ["Rajab", "Sabtu", "06-Jan-2057", 30], ["Syakban", "Senin", "05-Feb-2057", 29], ["Ramadan", "Selasa", "06-Mar-2057", 30], ["Syawal", "Kamis", "05-Apr-2057", 30], ["Zulkaidah", "Sabtu", "05-May-2057", 29], ["Zulhijah", "Ahad", "03-Jun-2057", 30]],
    1480: [["Muharam", "Selasa", "03-Jul-2057", 30], ["Safar", "Kamis", "02-Aug-2057", 29], ["Rabiulawal", "Jumat", "31-Aug-2057", 30], ["Rabiulakhir", "Sabtu", "29-Sep-2057", 30], ["Jumadilawal", "Senin", "29-Oct-2057", 30], ["Jumadilakhir", "Rabu", "28-Nov-2057", 29], ["Rajab", "Kamis", "27-Dec-2057", 29], ["Syakban", "Jumat", "25-Jan-2058", 30], ["Ramadan", "Ahad", "24-Feb-2058", 29], ["Syawal", "Senin", "25-Mar-2058", 30], ["Zulkaidah", "Rabu", "24-Apr-2058", 29], ["Zulhijah", "Kamis", "23-May-2058", 30]],
    1481: [["Muharam", "Sabtu", "22-Jun-2058", 29], ["Safar", "Ahad", "21-Jul-2058", 30], ["Rabiulawal", "Selasa", "20-Aug-2058", 30], ["Rabiulakhir", "Kamis", "19-Sep-2058", 30], ["Jumadilawal", "Sabtu", "19-Oct-2058", 29], ["Jumadilakhir", "Ahad", "17-Nov-2058", 30], ["Rajab", "Selasa", "17-Dec-2058", 29], ["Syakban", "Rabu", "15-Jan-2059", 29], ["Ramadan", "Kamis", "13-Feb-2059", 30], ["Syawal", "Sabtu", "15-Mar-2059", 29], ["Zulkaidah", "Ahad", "13-Apr-2059", 30], ["Zulhijah", "Selasa", "13-May-2059", 29]],
    1482: [["Muharam", "Rabu", "11-Jun-2059", 30], ["Safar", "Jumat", "11-Jul-2059", 29], ["Rabiulawal", "Sabtu", "09-Aug-2059", 30], ["Rabiulakhir", "Senin", "08-Sep-2059", 30], ["Jumadilawal", "Rabu", "08-Oct-2059", 30], ["Jumadilakhir", "Jumat", "07-Nov-2059", 29], ["Rajab", "Sabtu", "06-Dec-2059", 30], ["Syakban", "Senin", "05-Jan-2060", 29], ["Ramadan", "Selasa", "03-Feb-2060", 30], ["Syawal", "Kamis", "04-Mar-2060", 29], ["Zulkaidah", "Jumat", "02-Apr-2060", 29], ["Zulhijah", "Sabtu", "01-May-2060", 30]],
    1483: [["Muharam", "Senin", "31-May-2060", 29], ["Safar", "Selasa", "29-Jun-2060", 29], ["Rabiulawal", "Rabu", "28-Jul-2060", 30], ["Rabiulakhir", "Jumat", "27-Aug-2060", 30], ["Jumadilawal", "Ahad", "26-Sep-2060", 30], ["Jumadilakhir", "Selasa", "26-Oct-2060", 29], ["Rajab", "Rabu", "24-Nov-2060", 30], ["Syakban", "Jumat", "24-Dec-2060", 30], ["Ramadan", "Ahad", "23-Jan-2061", 29], ["Syawal", "Senin", "21-Feb-2061", 30], ["Zulkaidah", "Rabu", "23-Mar-2061", 29], ["Zulhijah", "Kamis", "21-Apr-2061", 29]],
    1484: [["Muharam", "Jumat", "20-May-2061", 29], ["Safar", "Sabtu", "18-Jun-2061", 30], ["Rabiulawal", "Senin", "18-Jul-2061", 29], ["Rabiulakhir", "Selasa", "16-Aug-2061", 30], ["Jumadilawal", "Kamis", "15-Sep-2061", 30], ["Jumadilakhir", "Sabtu", "15-Oct-2061", 29], ["Rajab", "Ahad", "13-Nov-2061", 30], ["Syakban", "Selasa", "13-Dec-2061", 30], ["Ramadan", "Kamis", "12-Jan-2062", 30], ["Syawal", "Sabtu", "11-Feb-2062", 29], ["Zulkaidah", "Ahad", "12-Mar-2062", 30], ["Zulhijah", "Selasa", "11-Apr-2062", 29]],
    1485: [["Muharam", "Rabu", "10-May-2062", 29], ["Safar", "Kamis", "08-Jun-2062", 29], ["Rabiulawal", "Jumat", "07-Jul-2062", 30], ["Rabiulakhir", "Ahad", "06-Aug-2062", 29], ["Jumadilawal", "Senin", "04-Sep-2062", 30], ["Jumadilakhir", "Rabu", "04-Oct-2062", 29], ["Rajab", "Kamis", "02-Nov-2062", 30], ["Syakban", "Sabtu", "02-Dec-2062", 30], ["Ramadan", "Senin", "01-Jan-2063", 30], ["Syawal", "Rabu", "31-Jan-2063", 29], ["Zulkaidah", "Kamis", "01-Mar-2063", 30], ["Zulhijah", "Sabtu", "31-Mar-2063", 29]],
    1486: [["Muharam", "Ahad", "29-Apr-2063", 30], ["Safar", "Selasa", "29-May-2063", 29], ["Rabiulawal", "Rabu", "27-Jun-2063", 30], ["Rabiulakhir", "Jumat", "27-Jul-2063", 29], ["Jumadilawal", "Sabtu", "25-Aug-2063", 29], ["Jumadilakhir", "Ahad", "23-Sep-2063", 30], ["Rajab", "Selasa", "23-Oct-2063", 29], ["Syakban", "Rabu", "21-Nov-2063", 30], ["Ramadan", "Jumat", "21-Dec-2063", 30], ["Syawal", "Ahad", "20-Jan-2064", 29], ["Zulkaidah", "Senin", "18-Feb-2064", 30], ["Zulhijah", "Rabu", "19-Mar-2064", 30]],
    1487: [["Muharam", "Jumat", "18-Apr-2064", 29], ["Safar", "Sabtu", "17-May-2064", 30], ["Rabiulawal", "Senin", "16-Jun-2064", 29], ["Rabiulakhir", "Selasa", "15-Jul-2064", 30], ["Jumadilawal", "Kamis", "14-Aug-2064", 29], ["Jumadilakhir", "Jumat", "12-Sep-2064", 29], ["Rajab", "Sabtu", "11-Oct-2064", 30], ["Syakban", "Senin", "10-Nov-2064", 29], ["Ramadan", "Selasa", "09-Dec-2064", 30], ["Syawal", "Kamis", "08-Jan-2065", 29], ["Zulkaidah", "Jumat", "06-Feb-2065", 30], ["Zulhijah", "Ahad", "08-Mar-2065", 30]],
    1488: [["Muharam", "Selasa", "07-Apr-2065", 29], ["Safar", "Rabu", "06-May-2065", 30], ["Rabiulawal", "Jumat", "05-Jun-2065", 30], ["Rabiulakhir", "Ahad", "05-Jul-2065", 29], ["Jumadilawal", "Senin", "03-Aug-2065", 30], ["Jumadilakhir", "Rabu", "02-Sep-2065", 29], ["Rajab", "Kamis", "01-Oct-2065", 29], ["Syakban", "Jumat", "30-Oct-2065", 30], ["Ramadan", "Ahad", "29-Nov-2065", 29], ["Syawal", "Senin", "28-Dec-2065", 30], ["Zulkaidah", "Rabu", "27-Jan-2066", 29], ["Zulhijah", "Kamis", "25-Feb-2066", 30]],
    1489: [["Muharam", "Sabtu", "27-Mar-2066", 29], ["Safar", "Ahad", "25-Apr-2066", 30], ["Rabiulawal", "Selasa", "25-May-2066", 30], ["Rabiulakhir", "Kamis", "24-Jun-2066", 30], ["Jumadilawal", "Sabtu", "24-Jul-2066", 29], ["Jumadilakhir", "Ahad", "22-Aug-2066", 30], ["Rajab", "Selasa", "21-Sep-2066", 29], ["Syakban", "Rabu", "20-Oct-2066", 30], ["Ramadan", "Jumat", "19-Nov-2066", 29], ["Syawal", "Sabtu", "18-Dec-2066", 29], ["Zulkaidah", "Ahad", "16-Jan-2067", 30], ["Zulhijah", "Selasa", "15-Feb-2067", 29]],
    1490: [["Muharam", "Rabu", "16-Mar-2067", 30], ["Safar", "Jumat", "15-Apr-2067", 29], ["Rabiulawal", "Sabtu", "14-May-2067", 30], ["Rabiulakhir", "Senin", "13-Jun-2067", 30], ["Jumadilawal", "Rabu", "13-Jul-2067", 29], ["Jumadilakhir", "Kamis", "11-Aug-2067", 30], ["Rajab", "Sabtu", "10-Sep-2067", 30], ["Syakban", "Ahad", "10-Oct-2067", 29], ["Ramadan", "Selasa", "08-Nov-2067", 30], ["Syawal", "Kamis", "08-Dec-2067", 29], ["Zulkaidah", "Jumat", "06-Jan-2068", 29], ["Zulhijah", "Sabtu", "04-Feb-2068", 30]],
    1491: [["Muharam", "Senin", "05-Mar-2068", 29], ["Safar", "Selasa", "03-Apr-2068", 30], ["Rabiulawal", "Kamis", "03-May-2068", 29], ["Rabiulakhir", "Jumat", "01-Jun-2068", 30], ["Jumadilawal", "Ahad", "01-Jul-2068", 29], ["Jumadilakhir", "Senin", "30-Jul-2068", 30], ["Rajab", "Rabu", "29-Aug-2068", 30], ["Syakban", "Jumat", "28-Sep-2068", 29], ["Ramadan", "Sabtu", "27-Oct-2068", 30], ["Syawal", "Senin", "26-Nov-2068", 30], ["Zulkaidah", "Rabu", "26-Dec-2068", 29], ["Zulhijah", "Kamis", "24-Jan-2069", 29]],
    1492: [["Muharam", "Jumat", "22-Feb-2069", 30], ["Safar", "Ahad", "24-Mar-2069", 29], ["Rabiulawal", "Senin", "22-Apr-2069", 30], ["Rabiulakhir", "Rabu", "22-May-2069", 29], ["Jumadilawal", "Kamis", "20-Jun-2069", 29], ["Jumadilakhir", "Jumat", "19-Jul-2069", 30], ["Rajab", "Ahad", "18-Aug-2069", 30], ["Syakban", "Selasa", "17-Sep-2069", 29], ["Ramadan", "Rabu", "16-Oct-2069", 30], ["Syawal", "Jumat", "15-Nov-2069", 30], ["Zulkaidah", "Ahad", "15-Dec-2069", 29], ["Zulhijah", "Senin", "13-Jan-2070", 30]],
    1493: [["Muharam", "Rabu", "12-Feb-2070", 29], ["Safar", "Jumat", "14-Mar-2070", 29], ["Rabiulawal", "Sabtu", "12-Apr-2070", 29], ["Rabiulakhir", "Ahad", "11-May-2070", 30], ["Jumadilawal", "Selasa", "10-Jun-2070", 29], ["Jumadilakhir", "Rabu", "09-Jul-2070", 29], ["Rajab", "Kamis", "07-Aug-2070", 30], ["Syakban", "Sabtu", "06-Sep-2070", 29], ["Ramadan", "Ahad", "05-Oct-2070", 30], ["Syawal", "Selasa", "04-Nov-2070", 30], ["Zulkaidah", "Kamis", "04-Dec-2070", 29], ["Zulhijah", "Jumat", "02-Jan-2071", 30]],
    1494: [["Muharam", "Ahad", "01-Feb-2071", 30], ["Safar", "Selasa", "03-Mar-2071", 30], ["Rabiulawal", "Kamis", "02-Apr-2071", 29], ["Rabiulakhir", "Jumat", "01-May-2071", 29], ["Jumadilawal", "Sabtu", "30-May-2071", 30], ["Jumadilakhir", "Senin", "29-Jun-2071", 29], ["Rajab", "Selasa", "28-Jul-2071", 29], ["Syakban", "Rabu", "26-Aug-2071", 30], ["Ramadan", "Jumat", "25-Sep-2071", 29], ["Syawal", "Sabtu", "24-Oct-2071", 30], ["Zulkaidah", "Senin", "23-Nov-2071", 29], ["Zulhijah", "Selasa", "22-Dec-2071", 30]],
    1495: [["Muharam", "Kamis", "21-Jan-2072", 30], ["Safar", "Sabtu", "20-Feb-2072", 30], ["Rabiulawal", "Senin", "21-Mar-2072", 29], ["Rabiulakhir", "Selasa", "19-Apr-2072", 30], ["Jumadilawal", "Kamis", "19-May-2072", 29], ["Jumadilakhir", "Jumat", "17-Jun-2072", 30], ["Rajab", "Ahad", "17-Jul-2072", 29], ["Syakban", "Senin", "15-Aug-2072", 29], ["Ramadan", "Selasa", "13-Sep-2072", 30], ["Syawal", "Kamis", "13-Oct-2072", 29], ["Zulkaidah", "Jumat", "11-Nov-2072", 30], ["Zulhijah", "Ahad", "11-Dec-2072", 29]],
    1496: [["Muharam", "Senin", "09-Jan-2073", 30], ["Safar", "Rabu", "08-Feb-2073", 30], ["Rabiulawal", "Jumat", "10-Mar-2073", 30], ["Rabiulakhir", "Ahad", "09-Apr-2073", 29], ["Jumadilawal", "Senin", "08-May-2073", 30], ["Jumadilakhir", "Rabu", "07-Jun-2073", 29], ["Rajab", "Kamis", "06-Jul-2073", 30], ["Syakban", "Sabtu", "05-Aug-2073", 29], ["Ramadan", "Ahad", "03-Sep-2073", 29], ["Syawal", "Senin", "02-Oct-2073", 30], ["Zulkaidah", "Rabu", "01-Nov-2073", 29], ["Zulhijah", "Kamis", "30-Nov-2073", 30]],
    1497: [["Muharam", "Sabtu", "30-Dec-2073", 29], ["Safar", "Ahad", "28-Jan-2074", 30], ["Rabiulawal", "Selasa", "27-Feb-2074", 30], ["Rabiulakhir", "Kamis", "29-Mar-2074", 29], ["Jumadilawal", "Jumat", "27-Apr-2074", 30], ["Jumadilakhir", "Ahad", "27-May-2074", 30], ["Rajab", "Selasa", "26-Jun-2074", 29], ["Syakban", "Rabu", "25-Jul-2074", 30], ["Ramadan", "Jumat", "24-Aug-2074", 29], ["Syawal", "Sabtu", "22-Sep-2074", 29], ["Zulkaidah", "Ahad", "21-Oct-2074", 30], ["Zulhijah", "Selasa", "20-Nov-2074", 30]],
    1498: [
        [
            "Muharam",
            "Selasa",
            "19-Dec-2074",
            30
        ],
        [
            "Safar",
            "Kamis",
            "18-Jan-2075",
            29
        ],
        [
            "Rabiulawal",
            "Jumat",
            "16-Feb-2075",
            30
        ],
        [
            "Rabiulakhir",
            "Ahad",
            "18-Mar-2075",
            29
        ],
        [
            "Jumadilawal",
            "Senin",
            "16-Apr-2075",
            30
        ],
        [
            "Jumadilakhir",
            "Rabu",
            "16-May-2075",
            29
        ],
        [
            "Rajab",
            "Kamis",
            "14-Jun-2075",
            30
        ],
        [
            "Syakban",
            "Sabtu",
            "14-Jul-2075",
            30
        ],
        [
            "Ramadan",
            "Senin",
            "13-Aug-2075",
            29
        ],
        [
            "Syawal",
            "Selasa",
            "11-Sep-2075",
            30
        ],
        [
            "Zulkaidah",
            "Kamis",
            "11-Oct-2075",
            29
        ],
        [
            "Zulhijah",
            "Jumat",
            "09-Nov-2075",
            30
        ]
    ],
    "1499": [
        [
            "Muharam",
            "Ahad",
            "09-Dec-2075",
            29
        ],
        [
            "Safar",
            "Senin",
            "07-Jan-2076",
            30
        ],
        [
            "Rabiulawal",
            "Rabu",
            "06-Feb-2076",
            29
        ],
        [
            "Rabiulakhir",
            "Kamis",
            "06-Mar-2076",
            30
        ],
        [
            "Jumadilawal",
            "Sabtu",
            "05-Apr-2076",
            29
        ],
        [
            "Jumadilakhir",
            "Ahad",
            "04-May-2076",
            30
        ],
        [
            "Rajab",
            "Selasa",
            "03-Jun-2076",
            29
        ],
        [
            "Syakban",
            "Rabu",
            "02-Jul-2076",
            30
        ],
        [
            "Ramadan",
            "Jumat",
            "01-Aug-2076",
            29
        ],
        [
            "Syawal",
            "Sabtu",
            "30-Aug-2076",
            30
        ],
        [
            "Zulkaidah",
            "Senin",
            "29-Sep-2076",
            30
        ],
        [
            "Zulhijah",
            "Rabu",
            "29-Oct-2076",
            29
        ]
    ],
    "1500": [
        [
            "Muharam",
            "Kamis",
            "27-Nov-2076",
            30
        ],
        [
            "Safar",
            "Sabtu",
            "27-Dec-2076",
            29
        ],
        [
            "Rabiulawal",
            "Ahad",
            "25-Jan-2077",
            30
        ],
        [
            "Rabiulakhir",
            "Selasa",
            "24-Feb-2077",
            29
        ],
        [
            "Jumadilawal",
            "Rabu",
            "25-Mar-2077",
            30
        ],
        [
            "Jumadilakhir",
            "Jumat",
            "24-Apr-2077",
            29
        ],
        [
            "Rajab",
            "Sabtu",
            "23-May-2077",
            29
        ],
        [
            "Syakban",
            "Ahad",
            "21-Jun-2077",
            30
        ],
        [
            "Ramadan",
            "Selasa",
            "21-Jul-2077",
            29
        ],
        [
            "Syawal",
            "Rabu",
            "19-Aug-2077",
            30
        ],
        [
            "Zulkaidah",
            "Jumat",
            "18-Sep-2077",
            30
        ],
        [
            "Zulhijah",
            "Ahad",
            "18-Oct-2077",
            30
        ]
    ]
}

class Menu20App(ctk.CTk):
    def __init__(self):
        super().__init__()
        self.title("Komparasi 50 Tahun Ramadhan (Modul 20)")
        self.geometry("1000x600")
        ctk.set_appearance_mode("Dark")
        self.setup_ui()

    def get_header(self, width):
        return "\n".join(line.center(width) for line in ["By the Name of Allah", "KALENDER HIJRIAH GLOBAL TUNGGAL", "KHGT Times 7.2"])

    def setup_ui(self):
        self.sidebar = ctk.CTkFrame(self, width=250)
        self.sidebar.pack(side="left", fill="y", padx=10, pady=10)
        
        ctk.CTkLabel(self.sidebar, text="KOMPARASI 50 TAHUN\n(RAMADHAN)", font=("Segoe UI", 16, "bold"), text_color="#00E5FF").pack(pady=20)
        ctk.CTkLabel(self.sidebar, text="Rentang: 1447 H - 1496 H", text_color="yellow").pack(pady=5)
        
        self.btn_hitung = ctk.CTkButton(self.sidebar, text="▶ MULAI ANALISIS", command=self.analisis_komparasi_ramadhan_50_tahun, height=40)
        self.btn_hitung.pack(pady=20, fill="x", padx=20)
        
        self.lbl_status = ctk.CTkLabel(self.sidebar, text="Sistem Siap", text_color="#00E676")
        self.lbl_status.pack()

        self.textbox = ctk.CTkTextbox(self, font=("Consolas", 13), wrap="none")
        self.textbox.pack(side="right", fill="both", expand=True, padx=10, pady=10)
        self.textbox.insert("1.0", "Klik 'MULAI ANALISIS' untuk membandingkan kriteria KHGT vs MABIMS Sabang.\nPastikan HIJRI_DB sudah lengkap di dalam kode.")
        self.textbox.configure(state="disabled")

    def analisis_komparasi_ramadhan_50_tahun(self):
        threading.Thread(target=self._proses_komparasi_ramadhan, daemon=True).start()

    def _proses_komparasi_ramadhan(self):
        self.after(0, lambda: self.lbl_status.configure(text="Menganalisis...", text_color="#FFAB40"))
        self.after(0, lambda: self.btn_hitung.configure(state="disabled"))
        self.after(0, lambda: self.textbox.configure(state="normal"))
        self.after(0, lambda: self.textbox.delete("1.0", "end"))
        
        output_lines = []
        output_lines.append(self.get_header(125))
        output_lines.append("[ REKAPITULASI KOMPARASI AWAL RAMADHAN (1447 H - 1496 H) ]".center(125))
        output_lines.append("KHGT (Global Alt>=5°, Eln>=8°) vs Neo MABIMS (Lokal Sabang Alt>=3°, Eln>=6.4°)".center(125))
        output_lines.append("=" * 125)
        output_lines.append(f"{'Tahun':<8} | {'Waktu Ijtimak (UTC)':<19} | {'1 Ramadhan (KHGT)':<20} | {'1 Ramadhan (MABIMS Sabang)':<28} | {'Status / Selisih'}")
        output_lines.append("-" * 125)

        sabang = ephem.Observer()
        sabang.lat, sabang.lon = math.radians(5.8942), math.radians(95.3184)
        sabang.elevation, sabang.pressure, sabang.temp = 0, 1010, 25
        matahari, bulan = ephem.Sun(), ephem.Moon()

        # Proses 1447 - 1496
        for thn_h in range(1447, 1497):
            try:
                if thn_h not in HIJRI_DB:
                    output_lines.append(f"{thn_h} H   | Database HIJRI_DB untuk tahun ini kosong/belum disalin.")
                    continue
                
                # Index 8 adalah bulan ke-9 (Ramadan)
                data_ramadan = HIJRI_DB[thn_h][8] 
                tgl_khgt_str = data_ramadan[2]
                
                bulan_map = {"Jan":1, "Feb":2, "Mar":3, "Apr":4, "May":5, "Jun":6, "Jul":7, "Aug":8, "Sep":9, "Oct":10, "Nov":11, "Dec":12}
                parts = tgl_khgt_str.split('-')
                dt_khgt = datetime.datetime(int(parts[2]), bulan_map.get(parts[1], 1), int(parts[0]))
                
                # Tanggal Rukyat (29 Syakban)
                dt_rukyat = dt_khgt - datetime.timedelta(days=1)
                
                # Waktu Ijtimak
                ijtimak = ephem.previous_new_moon(ephem.Date(dt_rukyat) + 5)
                str_ijtimak = ijtimak.datetime().strftime("%d-%m-%Y %H:%M")

                # Kalkulasi Sunset Sabang
                sabang.date = ephem.Date(dt_rukyat.replace(hour=0, minute=0, second=0))
                try: waktu_sunset = sabang.next_setting(matahari)
                except: waktu_sunset = ephem.Date(dt_rukyat.replace(hour=11, minute=30, second=0))
                
                sabang.date = waktu_sunset
                matahari.compute(sabang)
                bulan.compute(sabang)
                
                alt_topo = math.degrees(bulan.alt)
                elong_topo = math.degrees(ephem.separation(matahari, bulan))
                umur_bulan = waktu_sunset - ijtimak
                
                if umur_bulan > 0 and alt_topo >= 3.0 and elong_topo >= 6.4:
                    dt_mabims = dt_khgt
                    status = "Serentak (Sama)"
                else:
                    dt_mabims = dt_khgt + datetime.timedelta(days=1)
                    status = "Beda (MABIMS Mundur 1 Hari)"

                str_khgt = dt_khgt.strftime("%d %b %Y")
                str_mabims = dt_mabims.strftime("%d %b %Y")
                
                output_lines.append(f"{thn_h} H   | {str_ijtimak:<19} | {str_khgt:<20} | {str_mabims:<28} | {status}")
                if (thn_h - 1446) % 10 == 0 and thn_h != 1496: output_lines.append("-" * 125)

            except Exception as e:
                output_lines.append(f"{thn_h} H   | Error: {str(e)}")

        output_lines.append("=" * 125)
        
        self.after(0, lambda: self.textbox.insert("1.0", "\n".join(output_lines)))
        self.after(0, lambda: self.textbox.configure(state="disabled"))
        self.after(0, lambda: self.lbl_status.configure(text="Selesai", text_color="#00E676"))
        self.after(0, lambda: self.btn_hitung.configure(state="normal"))

if __name__ == "__main__":
    app = Menu20App()
    app.mainloop()