import os
import sqlite3
import json
import pandas as pd
from flask import Flask, Blueprint, render_template_string, request, redirect, url_for, session, flash, render_template, jsonify, current_app
from werkzeug.utils import secure_filename

# ==============================================================================
# 1. BAGIAN: Konstanta & Fungsi Baca Wilayah (Tanpa Hardcode)
# ==============================================================================
DB_NAME = 'mbg3b.db'
UPLOAD_FOLDER = 'static/uploads'

def load_data_wilayah():
    """Membaca MASTER.xlsx dan mengembalikan dictionary wilayah, tanpa hardcode."""
    file_path = 'MASTER.xlsx'
    if not os.path.exists(file_path):
        print(f"GAGAL: File '{file_path}' tidak ditemukan. Data wilayah kosong.")
        return {}

    try:
        df = pd.read_excel(file_path, sheet_name='BASIS', header=1)
    except Exception as e:
        print(f"Gagal membaca file Excel: {e}")
        return {}

    df.columns = [str(col).strip() for col in df.columns]
    col_kabupaten, col_kecamatan, col_desa = 'Kabupaten/ Kota', 'Kecamatan', 'Desa'

    if not set([col_kabupaten, col_kecamatan, col_desa]).issubset(df.columns):
        print("GAGAL: Struktur kolom tidak sesuai.")
        return {}

    df = df.dropna(subset=[col_kabupaten, col_kecamatan, col_desa])
    data_wilayah = {}

    for _, row in df.iterrows():
        kec = str(row[col_kecamatan]).strip().upper()
        desa = str(row[col_desa]).strip().upper()
        if kec not in data_wilayah:
            data_wilayah[kec] = {}
        if desa not in data_wilayah[kec]:
            data_wilayah[kec][desa] = []

    print(f"Data wilayah berhasil dimuat: {len(data_wilayah)} kecamatan.")
    return data_wilayah

# Inisialisasi global DATA_WILAYAH
DATA_WILAYAH = {}

# ==============================================================================
# 2. BAGIAN: HTML Templates (login & shared)
# ==============================================================================
LOGIN_HTML = """
<!DOCTYPE html>
<html lang="id">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Login - Sistem MBG B3 IPeKB</title>
    <link href="https://fonts.googleapis.com/css2?family=Poppins:wght@300;400;500;600;700&display=swap" rel="stylesheet">
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
    <style>
        * { font-family: 'Poppins', sans-serif; }
        body {
            margin: 0;
            min-height: 100vh;
            background: linear-gradient(135deg, #0a2647 0%, #144272 40%, #205295 100%);
            display: flex;
            align-items: center;
            justify-content: center;
            position: relative;
            overflow: hidden;
        }
        .bg-blob {
            position: absolute;
            border-radius: 50%;
            filter: blur(80px);
            opacity: 0.15;
            animation: float 8s ease-in-out infinite;
        }
        .blob1 {
            width: 500px; height: 500px; background: #fdbb2d;
            top: -150px; right: -150px; animation-delay: 0s;
        }
        .blob2 {
            width: 400px; height: 400px; background: #b21f1f;
            bottom: -150px; left: -150px; animation-delay: -4s;
        }
        @keyframes float {
            0%, 100% { transform: translateY(0) scale(1); }
            50% { transform: translateY(-30px) scale(1.05); }
        }
        .login-wrapper {
            position: relative; z-index: 10; width: 100%; max-width: 440px; padding: 20px;
        }
        .login-card {
            background: rgba(255, 255, 255, 0.95);
            backdrop-filter: blur(12px);
            border-radius: 20px; padding: 40px 35px;
            box-shadow: 0 30px 50px rgba(0,0,0,0.25), 0 10px 20px rgba(0,0,0,0.15);
            border: 1px solid rgba(255,255,255,0.3);
        }
        .brand-icon {
            width: 70px; height: 70px;
            background: linear-gradient(135deg, #0b3d91, #1e40af);
            border-radius: 50%; display: flex; align-items: center; justify-content: center;
            margin: 0 auto 15px; color: white; font-size: 32px;
            box-shadow: 0 8px 20px rgba(11,61,145,0.4);
        }
        .brand-title { font-weight: 700; font-size: 22px; color: #0b3d91; letter-spacing: -0.5px; }
        .brand-subtitle { color: #6b7280; font-size: 14px; font-weight: 400; }
        .form-floating-custom { position: relative; margin-bottom: 1.2rem; }
        .form-floating-custom .form-control {
            height: 52px; border: 1px solid #e2e8f0; border-radius: 12px;
            background-color: #f8fafc; padding: 0 15px 0 45px; font-size: 14px; font-weight: 500;
            transition: all 0.3s; color: #1e293b;
        }
        .form-floating-custom .form-control:focus {
            border-color: #0b3d91; box-shadow: 0 0 0 3px rgba(11,61,145,0.15);
            background-color: #ffffff;
        }
        .form-floating-custom .input-icon {
            position: absolute; left: 15px; top: 50%; transform: translateY(-50%);
            color: #94a3b8; font-size: 16px; z-index: 5; transition: color 0.3s;
        }
        .form-floating-custom .form-control:focus + .input-icon,
        .form-floating-custom .form-control:focus ~ .input-icon { color: #0b3d91; }
        .password-toggle {
            position: absolute; right: 15px; top: 50%; transform: translateY(-50%);
            background: none; border: none; color: #94a3b8; cursor: pointer; z-index: 5;
            font-size: 16px;
        }
        .password-toggle:hover { color: #0b3d91; }
        .btn-login {
            background: linear-gradient(135deg, #0b3d91 0%, #1e40af 100%);
            border: none; border-radius: 12px; padding: 12px; font-weight: 600;
            font-size: 15px; letter-spacing: 0.5px; color: white; width: 100%;
            box-shadow: 0 6px 20px rgba(11,61,145,0.35); transition: all 0.3s; margin-top: 10px;
        }
        .btn-login:hover {
            background: linear-gradient(135deg, #082c68 0%, #0b3d91 100%);
            transform: translateY(-2px); box-shadow: 0 10px 25px rgba(11,61,145,0.5);
        }
        .btn-login:active { transform: translateY(0); }
        .alert { border-radius: 10px; font-size: 13px; font-weight: 500; padding: 10px 15px; }
        .footer-text { color: #94a3b8; font-size: 12px; font-weight: 400; }
    </style>
</head>
<body>
    <div class="bg-blob blob1"></div>
    <div class="bg-blob blob2"></div>
    <div class="login-wrapper">
        <div class="login-card">
            <div class="brand-icon"><i class="fas fa-heartbeat"></i></div>
            <h4 class="brand-title text-center mb-1">SISTEM MBG B3</h4>
            <p class="brand-subtitle text-center mb-4">Monitoring & Evaluasi 1000 HPK</p>
            {% with messages = get_flashed_messages(with_categories=true) %}
                {% if messages %}
                    {% for category, message in messages %}
                        <div class="alert alert-{{ 'success' if category == 'success' else 'danger' }} d-flex align-items-center py-2 px-3 mb-3">
                            <i class="fas fa-{{ 'check-circle' if category == 'success' else 'exclamation-triangle' }} me-2"></i>
                            {{ message }}
                        </div>
                    {% endfor %}
                {% endif %}
            {% endwith %}
            <form action="/login" method="POST">
                <div class="form-floating-custom">
                    <input type="text" name="username" class="form-control" placeholder="Username" required autocomplete="username">
                    <i class="fas fa-user input-icon"></i>
                </div>
                <div class="form-floating-custom">
                    <input type="password" name="password" class="form-control" id="passwordField" placeholder="Password" required autocomplete="current-password">
                    <i class="fas fa-lock input-icon"></i>
                    <button type="button" class="password-toggle" onclick="togglePassword()">
                        <i id="toggleIcon" class="fas fa-eye"></i>
                    </button>
                </div>
                <button type="submit" class="btn btn-login">
                    <i class="fas fa-sign-in-alt me-2"></i> MASUK KE SISTEM
                </button>
            </form>
            <p class="text-center footer-text mt-3 mb-0">
                <i class="far fa-copyright me-1"></i> 2026 IPeKB Kabupaten Sukabumi
            </p>
        </div>
    </div>
    <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js"></script>
    <script>
        function togglePassword() {
            const passwordInput = document.getElementById('passwordField');
            const toggleIcon = document.getElementById('toggleIcon');
            if (passwordInput.type === 'password') {
                passwordInput.type = 'text';
                toggleIcon.classList.remove('fa-eye');
                toggleIcon.classList.add('fa-eye-slash');
            } else {
                passwordInput.type = 'password';
                toggleIcon.classList.remove('fa-eye-slash');
                toggleIcon.classList.add('fa-eye');
            }
        }
    </script>
</body>
</html>
"""

HTML_TEMPLATE = """
<!DOCTYPE html>
<html lang="id">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>MBG B3 - {{ session['role'] | upper }}</title>
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
    <link href="https://cdn.jsdelivr.net/npm/sweetalert2@11/dist/sweetalert2.min.css" rel="stylesheet">
    <style>
        body {
            font-family: 'Inter', 'Segoe UI', sans-serif;
            background-color: #f1f5f9;
            color: #1e293b;
        }
        {% if session['role'] == 'superadmin' %}
        .navbar-custom {
            background: linear-gradient(135deg, #0f172a 0%, #1e1b4b 50%, #b91c1c 100%);
            border-bottom: 1px solid rgba(255,255,255,0.1);
            height: 64px;
        }
        .navbar-brand-custom {
            font-weight: 700;
            color: #fff;
            font-size: 22px;
            padding-left: 20px;
            display: flex;
            align-items: center;
        }
        .sidebar {
            height: calc(100vh - 64px);
            width: 260px;
            background: #111827;
            color: #cbd5e1;
            box-shadow: 2px 0 15px rgba(0,0,0,0.3);
            padding-top: 12px;
            position: fixed;
            top: 64px;
            left: 0;
            overflow-y: auto;
        }
        .sidebar-item {
            padding: 12px 24px;
            color: #94a3b8;
            font-weight: 500;
            text-decoration: none;
            display: block;
            transition: 0.2s;
        }
        .sidebar-item:hover, .sidebar-item.active {
            background: rgba(255,255,255,0.08);
            color: #fbbf24;
            border-left: 4px solid #fbbf24;
        }
        .sidebar-heading {
            color: #64748b;
            font-size: 0.7rem;
            letter-spacing: 1px;
            margin-top: 16px;
            padding: 10px 24px;
            text-transform: uppercase;
            font-weight: bold;
        }
        {% else %}
        .navbar-custom {
            background: linear-gradient(135deg, #1e3a8a 0%, #3b82f6 100%);
            border-bottom: 1px solid rgba(0,0,0,0.05);
            height: 64px;
        }
        .navbar-brand-custom {
            font-weight: 700;
            color: #ffffff;
            font-size: 22px;
            padding-left: 20px;
            display: flex;
            align-items: center;
        }
        .sidebar {
            height: calc(100vh - 64px);
            width: 260px;
            background: #ffffff;
            border-right: 1px solid #e2e8f0;
            box-shadow: 2px 0 15px rgba(0,0,0,0.03);
            padding-top: 12px;
            position: fixed;
            top: 64px;
            left: 0;
            overflow-y: auto;
        }
        .sidebar-item {
            padding: 12px 24px;
            color: #475569;
            font-weight: 500;
            text-decoration: none;
            display: block;
            transition: 0.2s;
        }
        .sidebar-item:hover, .sidebar-item.active {
            background: #eff6ff;
            color: #1d4ed8;
            border-left: 4px solid #1d4ed8;
        }
        .sidebar-heading {
            color: #94a3b8;
            font-size: 0.7rem;
            letter-spacing: 1px;
            margin-top: 16px;
            padding: 10px 24px;
            text-transform: uppercase;
            font-weight: bold;
        }
        {% endif %}
        .main-content {
            margin-left: 260px;
            padding: 28px;
            margin-top: 64px;
        }
        .panel-search {
            background: white;
            border-radius: 12px;
            box-shadow: 0 1px 3px rgba(0,0,0,0.05);
            overflow: hidden;
            margin-bottom: 20px;
        }
        .panel-search-header {
            background: #1e3a8a;
            color: white;
            padding: 12px 20px;
            font-size: 14px;
            font-weight: 600;
        }
        .panel-search-body {
            padding: 20px;
        }
        .btn-search {
            background: #1d4ed8;
            color: white;
            font-weight: 600;
            border-radius: 8px;
            width: 100%;
        }
        .btn-search:hover {
            background: #1e40af;
            color: white;
        }
        .table-custom th {
            background: #f8fafc;
            font-weight: 600;
            color: #334155;
            border-bottom: 2px solid #e2e8f0;
            padding: 12px;
            text-align: center;
        }
        .table-custom td {
            padding: 12px;
            border-bottom: 1px solid #f1f5f9;
            vertical-align: middle;
            text-align: center;
        }
        .bg-green-siga {
            background: linear-gradient(135deg, #059669, #10b981);
            color: white;
            padding: 6px 14px;
            border-radius: 20px;
            font-weight: 600;
            display: inline-block;
            width: 100%;
            text-align: left;
        }
        .badge-kategori {
            font-size: 11px;
            padding: 5px 10px;
            border-radius: 20px;
            font-weight: 600;
        }
        .form-section {
            background: #f8fafc;
            padding: 10px 16px;
            border-radius: 10px;
            margin: 18px 0 12px;
            font-weight: 600;
            color: #0f172a;
            border-left: 5px solid #3b82f6;
            font-size: 14px;
        }
        .form-label {
            font-weight: 500;
            font-size: 0.85rem;
            margin-bottom: 3px;
        }
        small {
            color: #6c757d;
            font-size: 0.8em;
        }
        input[readonly], select[readonly] {
            background-color: #f1f3f5;
            opacity: 1;
            pointer-events: none;
        }
        .admin-card {
            background: white;
            border-radius: 16px;
            box-shadow: 0 4px 12px rgba(0,0,0,0.04);
            padding: 24px;
            margin-bottom: 24px;
            border: 1px solid #f1f5f9;
        }
        .stat-box {
            background: white;
            border-radius: 16px;
            padding: 20px;
            border: 1px solid #e2e8f0;
            display: flex;
            align-items: center;
            justify-content: space-between;
            transition: all 0.2s;
        }
        .stat-box.clickable:hover {
            transform: translateY(-4px);
            box-shadow: 0 12px 24px rgba(0,0,0,0.08);
            border-color: #3b82f6;
        }
        .stat-icon {
            font-size: 2.4rem;
            color: #1d4ed8;
        }
        .stat-value {
            font-size: 2rem;
            font-weight: 700;
            color: #0f172a;
            margin-bottom: 0;
        }
        .stat-label {
            font-size: 0.8rem;
            color: #64748b;
            text-transform: uppercase;
            letter-spacing: 0.5px;
        }
        .dropdown-menu {
            border-radius: 12px;
            box-shadow: 0 10px 25px rgba(0,0,0,0.15);
            border: none;
        }
        .dropdown-item {
            padding: 10px 20px;
            font-weight: 500;
            transition: 0.2s;
        }
        .dropdown-item:hover {
            background: #f1f5f9;
            color: #1d4ed8;
        }
        .btn-sm {
            border-radius: 8px;
            padding: 5px 12px;
        }
        .bg-cyber-warning {
            background-color: #fff1f2;
            border-color: #fda4af;
        }
        .text-cyber {
            color: #be123c;
            font-weight: bold;
            font-size: 0.8rem;
        }
    </style>
</head>
<body>
    {% set list_bulan = ['Januari','Februari','Maret','April','Mei','Juni','Juli','Agustus','September','Oktober','November','Desember'] %}
    {% set list_tahun = ['2024','2025','2026','2027'] %}
    {% set user_kecamatan = session.get('kecamatan', 'CIRACAP') %}
    {% if user_kecamatan == 'SEMUA' %}
        {% set list_desa = [] %}
        {% for kec, desas in DATA_WILAYAH.items() %}
            {% for d in desas.keys() %}
                {% if d not in list_desa %}{% set _ = list_desa.append(d) %}{% endif %}
            {% endfor %}
        {% endfor %}
    {% else %}
        {% set list_desa = DATA_WILAYAH.get(user_kecamatan, {}).keys() | list %}
    {% endif %}

    <nav class="navbar navbar-expand-lg navbar-custom fixed-top">
        <div class="container-fluid">
            {% if session['role'] == 'superadmin' %}
            <span class="navbar-brand-custom"><img src="/static/logo.png" alt="Logo" style="height: 50px; margin-right: 10px;"> Sistem Panel <span style="color:#fdbb2d; margin-left: 5px;">Admin</span></span>
            {% else %}
            <span class="navbar-brand-custom"><img src="/static/logo.png" alt="Logo" style="height: 50px;"></span>
            {% endif %}
            <div class="d-flex align-items-center me-3">
                <div class="dropdown">
                    <a href="#" class="d-flex align-items-center text-decoration-none dropdown-toggle" id="dropdownUser" data-bs-toggle="dropdown" aria-expanded="false">
                        <span class="me-3" style="font-size: 14px; color: {% if session['role'] == 'superadmin' %}#ffffff{% else %}#0b3d91{% endif %}; font-weight: 600;">Halo, {{ session['nama_lengkap'] }} ({{ session['role'] | upper }})</span>
                        <img src="{% if session.get('foto_profil') %}/static/uploads/{{ session['foto_profil'] }}{% else %}https://ui-avatars.com/api/?name={{ session['nama_lengkap'] }}&background={% if session['role'] == 'superadmin' %}fdbb2d&color=1e293b{% else %}0b3d91&color=fff{% endif %}&rounded=true&size=38&bold=true{% endif %}" alt="Avatar" width="38" height="38" class="rounded-circle shadow-sm" style="border: 2px solid #ffffff; object-fit: cover;">
                    </a>
                    <ul class="dropdown-menu dropdown-menu-end shadow border-0 mt-2" aria-labelledby="dropdownUser" style="border-radius: 8px; min-width: 200px;">
                        <li><h6 class="dropdown-header text-muted fw-bold">Pengaturan Akun</h6></li>
                        <li><a class="dropdown-item py-2" href="#" data-bs-toggle="modal" data-bs-target="#modalUbahProfil"><i class="fas fa-user-cog me-2 text-secondary"></i> Ubah Profil</a></li>
                        <li><hr class="dropdown-divider"></li>
                        <li><a class="dropdown-item py-2 text-danger fw-bold" href="/logout"><i class="fas fa-sign-out-alt me-2"></i> Keluar Sistem</a></li>
                    </ul>
                </div>
            </div>
        </div>
    </nav>

    <div class="sidebar">
        {% if session['role'] == 'superadmin' %}
            <div class="text-center py-3 mb-2" style="border-bottom: 1px solid #334155;">
                <img src="{% if session.get('foto_profil') %}/static/uploads/{{ session['foto_profil'] }}{% else %}https://ui-avatars.com/api/?name={{ session['nama_lengkap'] }}&background=fdbb2d&color=1e293b&rounded=true&size=60&bold=true{% endif %}" alt="Avatar" width="60" height="60" class="rounded-circle shadow-sm mb-2" style="border: 2px solid #334155; object-fit: cover;">
                <h6 class="mb-0 text-white fw-bold">{{ session['nama_lengkap'] }}</h6>
                <small class="text-warning">Root Administrator</small>
            </div>
            <a href="/admin_dashboard" class="sidebar-item {% if active_page == 'dashboard' %}active{% endif %}"><i class="fas fa-desktop me-2"></i> Kontrol Panel</a>
            <div class="sidebar-heading">MASTER DATA</div>
            <a href="/manajemen_akun" class="sidebar-item {% if active_page == 'manajemen_akun' %}active{% endif %}"><i class="fas fa-users-cog me-2"></i> Manajemen Akun</a>
            <a href="/registrasi_dapur" class="sidebar-item {% if active_page == 'registrasi_dapur' %}active{% endif %}"><i class="fas fa-store-alt me-2"></i> Registrasi Dapur</a>
            <div class="sidebar-heading">MONITORING LINTAS WILAYAH</div>
            <a href="/rekapitulasi" class="sidebar-item {% if active_page == 'rekapitulasi' %}active{% endif %}"><i class="fas fa-database me-2"></i> Semua Data Sasaran</a>
            <a href="/arsip_laporan" class="sidebar-item {% if active_page == 'arsip_laporan' %}active{% endif %}"><i class="fas fa-archive me-2"></i> Arsip Laporan Dapur</a>
            <a href="/rekap_laporan_kader" class="sidebar-item {% if active_page == 'rekap_laporan_kader' %}active{% endif %}"><i class="fas fa-users me-2"></i> Rekap Laporan Kader</a>
            <div class="sidebar-heading">SISTEM PENGATURAN</div>
            <a href="#" class="sidebar-item"><i class="fas fa-shield-alt me-2"></i> Backup & Keamanan</a>
        {% else %}
            <a href="/" class="sidebar-item {% if active_page == 'dashboard' %}active{% endif %}"><i class="fas fa-home me-2"></i> Beranda</a>
            {% if session['role'] == 'plkb' %}
                <div class="sidebar-heading">MANAJEMEN DATA</div>
                <a href="/rekapitulasi" class="sidebar-item {% if active_page == 'rekapitulasi' %}active{% endif %}"><i class="fas fa-list me-2"></i> Sasaran 1000 HPK dan MBG B3</a>
                <a href="/arsip_laporan" class="sidebar-item {% if active_page == 'arsip_laporan' %}active{% endif %}"><i class="fas fa-file-excel me-2"></i> Rekap Laporan Dapur</a>
                <a href="/rekap_laporan_kader" class="sidebar-item {% if active_page == 'rekap_laporan_kader' %}active{% endif %}"><i class="fas fa-users me-2"></i> Rekap Laporan Kader</a>
            {% elif session['role'] == 'kader' %}
                <div class="sidebar-heading">ENTRY DATA</div>
                <a href="/form_kader" class="sidebar-item {% if active_page == 'form_kader' %}active{% endif %}"><i class="fas fa-edit me-2"></i> Input Sasaran</a>
                <div class="sidebar-heading">DATA SAYA</div>
                <a href="/rekapitulasi" class="sidebar-item {% if active_page == 'rekapitulasi' %}active{% endif %}"><i class="fas fa-list me-2"></i> Rekapitulasi Sasaran</a>
            {% elif session['role'] == 'dapur' %}
                <div class="sidebar-heading">PEMANTAUAN</div>
                <a href="/rekapitulasi" class="sidebar-item {% if active_page == 'rekapitulasi' %}active{% endif %}"><i class="fas fa-eye me-2"></i> Lihat Sasaran</a>
                <div class="sidebar-heading">PELAPORAN</div>
                <a href="/form_dapur" class="sidebar-item"><i class="fas fa-edit me-2"></i> Input Realisasi Dapur</a>
                <a href="/arsip_laporan" class="sidebar-item {% if active_page == 'arsip_laporan' %}active{% endif %}"><i class="fas fa-history me-2"></i> Arsip Laporan</a>
            {% endif %}
        {% endif %}
    </div>

    <div class="modal fade" id="modalUbahProfil" tabindex="-1" aria-hidden="true">
        <div class="modal-dialog">
            <div class="modal-content">
                <form action="/ubah_profil" method="POST" enctype="multipart/form-data">
                    <div class="modal-header" style="background-color: #f0f4f8; border-bottom: 2px solid #0b3d91;">
                        <h5 class="modal-title fw-bold text-primary"><i class="fas fa-user-edit me-2"></i> Pengaturan Profil</h5>
                        <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
                    </div>
                    <div class="modal-body text-start">
                        <div class="mb-3 text-center">
                            <img src="{% if session.get('foto_profil') %}/static/uploads/{{ session['foto_profil'] }}{% else %}https://ui-avatars.com/api/?name={{ session['nama_lengkap'] }}&background=0b3d91&color=fff&rounded=true&size=80&bold=true{% endif %}" alt="Avatar" width="80" height="80" class="rounded-circle shadow-sm mb-2" style="border: 2px solid #0b3d91; object-fit: cover;">
                        </div>
                        <div class="mb-3">
                            <label class="form-label fw-bold">Unggah Foto Profil Baru</label>
                            <input type="file" name="foto_profil" class="form-control" accept=".jpg, .jpeg, .png">
                            <small class="text-muted">Format: JPG, JPEG, PNG. Maksimal 2MB.</small>
                        </div>
                        <hr>
                        <div class="mb-3"><label class="form-label fw-bold">Username</label><input type="text" class="form-control" value="{{ session['username'] }}" disabled></div>
                        <div class="mb-3"><label class="form-label fw-bold">Nama Lengkap</label><input type="text" class="form-control" value="{{ session['nama_lengkap'] }}" disabled></div>
                        <div class="mb-3"><label class="form-label fw-bold">Ubah Password <span class="text-muted fw-normal">(opsional)</span></label><input type="password" name="password_baru" class="form-control" placeholder="Masukkan password baru jika ingin mengubah"></div>
                    </div>
                    <div class="modal-footer">
                        <button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Batal</button>
                        <button type="submit" class="btn btn-primary"><i class="fas fa-save me-1"></i> Simpan Profil</button>
                    </div>
                </form>
            </div>
        </div>
    </div>

    <script>
        const dataWilayahGlobal = {{ DATA_WILAYAH | tojson | safe }};
        function updateDesaDropdown(kecId, desaId) {
            const kec = document.getElementById(kecId).value;
            const selectDesa = document.getElementById(desaId);
            let options = '<option value="">-- Pilih Desa --</option>';
            if (kec && dataWilayahGlobal[kec]) {
                Object.keys(dataWilayahGlobal[kec]).forEach(desa => {
                    options += `<option value="${desa}">${desa}</option>`;
                });
            }
            if(selectDesa) {
                const currValue = selectDesa.value;
                selectDesa.innerHTML = options;
                if(currValue && options.includes(`"${currValue}"`)) {
                    selectDesa.value = currValue;
                }
            }
        }
    </script>

    <div class="main-content">
        {% if active_page != 'dashboard' or session['role'] != 'superadmin' %}
        <h4 class="mb-4" style="font-size: 20px; color: #333;">{{ page_title }}</h4>
        {% endif %}
        
        {% if active_page == 'form_kader' %}
        <div class="admin-card mt-0" style="border-top: 4px solid #0d6efd;">
            <form action="/submit_sasaran" method="POST">
                
                <div class="form-section">1. Data Wilayah (Kabupaten, Kecamatan, Desa)</div>
                <div class="row mb-3">
                    <div class="col-md-4">
                        <label class="form-label text-primary fw-bold">Kabupaten</label>
                        <select name="kabupaten_sasaran" class="form-select" readonly><option value="SUKABUMI">KABUPATEN SUKABUMI</option></select>
                    </div>
                    <div class="col-md-4">
                        <label class="form-label text-primary fw-bold">Kecamatan <span class="text-danger">*</span></label>
                        <select name="kecamatan_sasaran" id="kecamatan_sasaran" class="form-select" required onchange="updateDesaDropdown('kecamatan_sasaran', 'desa_sasaran_wilayah'); updateDesaDropdown('kecamatan_sasaran', 'desa_sasaran'); setTimeout(filterDapurByDesa, 100);">
                            <option value="">-- Pilih Kecamatan --</option>
                            {% for kec in DATA_WILAYAH.keys() %}
                            <option value="{{ kec }}">{{ kec }}</option>
                            {% endfor %}
                        </select>
                    </div>
                    <div class="col-md-4">
                        <label class="form-label text-primary fw-bold">Desa / Kelurahan <span class="text-danger">*</span></label>
                        <select name="desa_sasaran_wilayah" id="desa_sasaran_wilayah" class="form-select" required onchange="document.getElementById('desa_sasaran').value = this.value; filterDapurByDesa();">
                            <option value="">-- Pilih Kecamatan Terlebih Dahulu --</option>
                        </select>
                    </div>
                </div>

                <div class="form-section">2. Data Pelaporan & Dapur SPPG</div>
                <div class="row mb-3">
                    <div class="col-md-6"><label class="form-label">Bulan Pelaporan <span class="text-danger">*</span></label><select name="bulan_lapor" class="form-select" required><option value="">-- Pilih Bulan --</option>{% for b in list_bulan %}<option value="{{ b }}">{{ b }}</option>{% endfor %}</select></div>
                    <div class="col-md-6"><label class="form-label">Tahun Pelaporan <span class="text-danger">*</span></label><select name="tahun_lapor" class="form-select" required><option value="">-- Pilih Tahun --</option>{% for t in list_tahun %}<option value="{{ t }}">{{ t }}</option>{% endfor %}</select></div>
                </div>
                <div class="row mb-3">
                    <div class="col-md-6">
                        <label class="form-label">Nama Dapur SPPG <span class="text-danger">*</span></label>
                        <select name="nama_dapur" id="nama_dapur" class="form-select" required onchange="autoFillDapur()">
                            <option value="">-- Pilih Dapur --</option>
                            {% for dapur in data_dapur_db %}
                                <option value="{{ dapur[0] }}" data-desa="{{ dapur[1] }}" data-alamat="{{ dapur[2] }}">{{ dapur[0] }}</option>
                            {% endfor %}
                        </select>
                    </div>
                    <div class="col-md-6">
                        <label class="form-label">Alamat Lengkap Dapur <span class="text-danger">*</span></label>
                        <input type="text" name="alamat_dapur" id="alamat_dapur" class="form-control" readonly required placeholder="Terisi otomatis berdasarkan dapur...">
                    </div>
                </div>

                <div class="form-section">3. Identitas Sasaran (Penerima Manfaat)</div>
                <div class="row mb-3">
                    <div class="col-md-4"><label class="form-label">Kategori Sasaran <span class="text-danger">*</span></label><select name="kategori_Sasaran" id="kategori_sasaran" class="form-select" required onchange="toggleAnakFields()"><option value="">-- Pilih Kategori --</option><option value="Balita Non-PAUD">Balita Non-PAUD</option><option value="Baduta">Baduta</option><option value="Ibu Hamil">Ibu Hamil</option><option value="Ibu Menyusui">Ibu Menyusui</option></select></div>
                    <div class="col-md-4"><label class="form-label">Nama Ibu/Sasaran <span class="text-danger">*</span></label><input type="text" name="nama_Sasaran" class="form-control" required></div>
                    <div class="col-md-4"><label class="form-label">Nama Ayah / Suami</label><input type="text" name="nama_ayah" class="form-control"></div>
                </div>
                <div class="row mb-3">
                    <div class="col-md-4"><label class="form-label">NIK Sasaran (16 Digit)</label><input type="text" name="nik_Sasaran" class="form-control" maxlength="16" oninput="this.value=this.value.replace(/[^0-9]/g,'')"></div>
                    <div class="col-md-4"><label class="form-label">No. KK Sasaran (16 Digit)</label><input type="text" name="kk_Sasaran" class="form-control" maxlength="16" oninput="this.value=this.value.replace(/[^0-9]/g,'')"></div>
                    <div class="col-md-4"><label class="form-label">Usia Sasaran (Otomatis)</label><input type="text" name="usia_sasaran" id="usia_sasaran" class="form-control" readonly></div>
                </div>
                <div class="row mb-3">
                    <div class="col-md-6"><label class="form-label">Tempat Lahir (Ibu)</label><input type="text" name="tempat_lahir" class="form-control"></div>
                    <div class="col-md-6"><label class="form-label">Tanggal Lahir (Ibu) <span class="text-danger">*</span></label><input type="date" name="tanggal_lahir" class="form-control" onchange="calculateAgeUniversal(this.value, 'usia_sasaran')" required></div>
                </div>

                <div id="section_anak" style="display: none;">
                    <div class="form-section bg-light border-info" style="border-left-color: #0dcaf0;">4. Identitas Anak</div>
                    <div class="row mb-3">
                        <div class="col-md-6"><label class="form-label">NIK Anak (Jika Ada)</label><input type="text" name="nik_anak" class="form-control input-anak" maxlength="16" oninput="this.value=this.value.replace(/[^0-9]/g,'')"></div>
                        <div class="col-md-6"><label class="form-label">Nama Anak <span class="text-danger">*</span></label><input type="text" name="nama_anak" class="form-control input-anak"></div>
                    </div>
                    <div class="row mb-3">
                        <div class="col-md-4"><label class="form-label">Tempat Lahir Anak <span class="text-danger">*</span></label><input type="text" name="tempat_lahir_anak" class="form-control input-anak"></div>
                        <div class="col-md-4"><label class="form-label">Tanggal Lahir Anak <span class="text-danger">*</span></label><input type="date" name="tanggal_lahir_anak" class="form-control input-anak" onchange="calculateAgeUniversal(this.value, 'usia_anak')"></div>
                        <div class="col-md-4"><label class="form-label">Usia Anak (Otomatis)</label><input type="text" name="usia_anak" id="usia_anak" class="form-control" readonly></div>
                    </div>
                </div>

                <div class="form-section">5. Alamat & Posyandu Sasaran</div>
                <div class="row mb-3">
                    <div class="col-md-6">
                        <label class="form-label">Desa Sasaran <span class="text-danger">*</span></label>
                        <select name="desa_sasaran" id="desa_sasaran" class="form-select" required onchange="document.getElementById('desa_sasaran_wilayah').value = this.value; filterDapurByDesa();">
                            <option value="">-- Pilih Kecamatan di Data Wilayah --</option>
                        </select>
                    </div>
                    <div class="col-md-6">
                        <label class="form-label">Wilayah Posyandu <span class="text-danger">*</span></label>
                        <input type="text" name="wilayah_posyandu" class="form-control" placeholder="Ketik nama posyandu manual... (Contoh: MELATI 1)" required>
                    </div>
                </div>
                <div class="row mb-3"><div class="col-12"><label class="form-label">Alamat Lengkap Sasaran <span class="text-danger">*</span></label><input type="text" name="alamat_sasaran" class="form-control" required></div></div>

                <div class="form-section">6. Data Klinis & Pengukuran</div>
                <div class="row mb-3">
                    <div class="col-md-3"><label class="form-label">Hamil Ke-</label><input type="number" name="hamil_ke" id="hamil_ke" class="form-control"></div>
                    <div class="col-md-3"><label class="form-label">Usia Kehamilan (Minggu)</label><input type="number" name="usia_kehamilan" id="usia_kehamilan" class="form-control"></div>
                    <div class="col-md-3"><label class="form-label">Anak Ke-</label><input type="number" name="anak_ke" id="anak_ke" class="form-control"></div>
                    <div class="col-md-3"><label class="form-label">Jenis Kontrasepsi</label><input type="text" name="jenis_kontrasepsi" class="form-control"></div>
                </div>
                <div class="row mb-4">
                    <div class="col-md-6"><label class="form-label">Berat Badan (Kg) <span class="text-danger">*</span></label><input type="number" step="0.01" name="berat_badan" id="berat_badan" class="form-control" required></div>
                    <div class="col-md-6"><label class="form-label">Tinggi Badan (Cm) <span class="text-danger">*</span></label><input type="number" step="0.01" name="tinggi_badan" id="tinggi_badan" class="form-control" required></div>
                </div>
                <div class="d-grid gap-2 d-md-flex justify-content-md-end border-top pt-3">
                    <button type="reset" class="btn btn-secondary me-md-2"><i class="fas fa-undo me-1"></i> Reset Form</button>
                    <button type="submit" class="btn btn-primary fw-bold px-4"><i class="fas fa-save me-1"></i> Simpan Data Sasaran</button>
                </div>
            </form>
        </div>
        <script>
            let allDapurOptions = [];
            document.addEventListener("DOMContentLoaded", function() {
                const select = document.getElementById('nama_dapur');
                if(select) {
                    allDapurOptions = Array.from(select.options).slice(1);
                }
            });
            function filterDapurByDesa() {
                var selectedDesa = document.getElementById('desa_sasaran_wilayah').value;
                var dapurSelect = document.getElementById('nama_dapur');
                if(!dapurSelect) return;
                dapurSelect.innerHTML = '<option value="">-- Pilih Dapur --</option>';
                allDapurOptions.forEach(function(opt) {
                    var dapurDesa = opt.getAttribute('data-desa');
                    if (selectedDesa === "" || dapurDesa === selectedDesa) {
                        dapurSelect.appendChild(opt.cloneNode(true));
                    }
                });
                autoFillDapur();
            }
            function autoFillDapur(){
                var select = document.getElementById('nama_dapur');
                if(select && select.selectedIndex > 0) {
                    var selectedOpt = select.options[select.selectedIndex];
                    document.getElementById('alamat_dapur').value = selectedOpt.getAttribute('data-alamat') || '';
                } else {
                    document.getElementById('alamat_dapur').value = '';
                }
            }
            function toggleAnakFields(){
                const kat = document.getElementById('kategori_sasaran').value;
                const sectionAnak = document.getElementById('section_anak');
                const inputsAnak = document.querySelectorAll('.input-anak');
                const hamilKe = document.getElementById('hamil_ke');
                const usiaKehamilan = document.getElementById('usia_kehamilan');
                const anakKe = document.getElementById('anak_ke');
                const bb = document.getElementById('berat_badan');
                const tb = document.getElementById('tinggi_badan');
                if(kat === 'Ibu Hamil'){
                    hamilKe.disabled = false; usiaKehamilan.disabled = false; anakKe.disabled = true;
                    bb.disabled = true; tb.disabled = true; bb.required = false; tb.required = false;
                    sectionAnak.style.display = 'none'; inputsAnak.forEach(i => i.required = false);
                } else if (['Ibu Menyusui', 'Balita Non-PAUD', 'Baduta'].includes(kat)){
                    hamilKe.disabled = true; usiaKehamilan.disabled = true; anakKe.disabled = false;
                    bb.disabled = false; tb.disabled = false; bb.required = true; tb.required = true;
                    sectionAnak.style.display = 'block'; inputsAnak.forEach(i => { if(i.name !== 'nik_anak') i.required = true; });
                } else {
                    hamilKe.disabled = false; usiaKehamilan.disabled = false; anakKe.disabled = false;
                    bb.disabled = false; tb.disabled = false; bb.required = true; tb.required = true;
                    sectionAnak.style.display = 'none'; inputsAnak.forEach(i => i.required = false);
                }
            }
        </script>
        {% endif %}

        {% if active_page == 'dashboard' and session['role'] == 'superadmin' %}
        <div class="d-flex justify-content-between align-items-center mb-4"><h4 class="fw-bold" style="color: #1e293b;"><i class="fas fa-cogs me-2"></i> Pusat Kendali Super Admin</h4></div>
        <div class="row">
            <div class="col-md-4 mb-4"><div class="stat-box"><div><p class="stat-label">Total Pengguna Aktif</p><h3 class="stat-value text-primary">{{ user_online if user_online else '1' }} <span style="font-size: 1rem; color:gray;">User Online</span></h3></div><div class="stat-icon"><i class="fas fa-users-circle text-primary"></i></div></div></div>
            <div class="col-md-4 mb-4"><div class="stat-box clickable" data-bs-toggle="modal" data-bs-target="#modalDapurTerdaftar" title="Klik untuk melihat detail Dapur"><div><p class="stat-label text-primary">Dapur SPPG Terdaftar <i class="fas fa-hand-pointer fa-sm ms-1"></i></p><h3 class="stat-value">{{ total_dapur if total_dapur else '0' }} Unit</h3></div><div class="stat-icon"><i class="fas fa-store text-success"></i></div></div></div>
            <div class="col-md-4 mb-4"><div class="stat-box bg-cyber-warning"><div><p class="stat-label text-danger">Status Sistem Terkini</p><h5 class="stat-value text-danger mb-1"><i class="fas fa-shield-alt"></i> Aman</h5><p class="text-cyber mb-0"><i class="fas fa-info-circle"></i> 0 Peringatan Hacking</p></div></div></div>
        </div>
        <div class="modal fade" id="modalDapurTerdaftar" tabindex="-1" aria-hidden="true">
            <div class="modal-dialog modal-lg modal-dialog-scrollable">
                <div class="modal-content">
                    <div class="modal-header bg-success text-white"><h5 class="modal-title fw-bold"><i class="fas fa-store me-2"></i> Data Dapur SPPG Terdaftar</h5><button type="button" class="btn-close btn-close-white" data-bs-dismiss="modal" aria-label="Close"></button></div>
                    <div class="modal-body">
                        <table class="table table-bordered table-striped table-custom">
                            <thead><tr><th>No</th><th>Nama Dapur</th><th>Alamat Lengkap</th><th>Kepala Dapur</th></tr></thead>
                            <tbody>
                                {% for row in data_dapur %}<tr><td>{{ loop.index }}</td><td class="text-start fw-bold text-primary">{{ row[1] }}</td><td class="text-start">{{ row[2] }}</td><td>{{ row[3] }}</td></tr>
                                {% else %}<tr><td colspan="4" class="text-center py-3">Belum ada Dapur Terdaftar.</td></tr>{% endfor %}
                            </tbody>
                        </table>
                    </div>
                </div>
            </div>
        </div>
        <div class="row"><div class="col-12"><div class="admin-card"><h5 class="fw-bold mb-3 border-bottom pb-2"><i class="fas fa-user-shield me-2"></i> Akses Cepat Kelola Hak Akses</h5><p class="text-muted mb-4" style="font-size: 14px;">Gunakan modul ini untuk menambah, memblokir, atau mengatur ulang kata sandi dari tiap-tiap pengguna organisasi IPeKB, Kader TPK, Tim Dapur, dan PLKB wilayah.</p><a href="/manajemen_akun" class="btn btn-primary fw-bold me-2"><i class="fas fa-users-cog me-1"></i> Manajemen Akun</a><a href="/registrasi_dapur" class="btn btn-success fw-bold me-2"><i class="fas fa-store me-1"></i> Registrasi Dapur</a><button class="btn btn-outline-secondary fw-bold"><i class="fas fa-sync-alt me-1"></i> Sinkronisasi Database</button></div></div></div>
        {% endif %}

        {% if active_page == 'manajemen_akun' %}
        <div class="d-flex justify-content-between mb-3"><div class="d-flex align-items-center"><i class="fas fa-users-cog fa-2x text-primary me-2"></i><div><span style="font-size: 16px; font-weight: bold;">Manajemen Akun</span><br><small class="text-muted">Kelola akun, reset password, dan ubah hak akses</small></div></div><button class="btn btn-primary btn-sm mt-2" data-bs-toggle="modal" data-bs-target="#modalTambahAkun" style="height:35px;"><i class="fas fa-plus me-1"></i> Tambah Akun Baru</button></div>
        <div class="table-responsive bg-white rounded shadow-sm border">
            <table class="table table-bordered table-hover table-custom mb-0">
                <thead><tr><th style="width: 50px;">No</th><th>Username</th><th>Nama Lengkap</th><th>Peran (Role)</th><th>Wilayah Tugas</th><th>Jenjang Jabatan</th><th style="width: 120px;">Aksi</th></tr></thead>
                <tbody>
                    {% for row in data_users %}
                    <tr>
                        <td>{{ loop.index }}</td><td class="fw-bold">{{ row[1] }}</td><td>{{ row[2] }}</td>
                        <td>{% if row[3]=='superadmin' %}<span class="badge bg-danger">Superadmin</span>{% elif row[3]=='plkb' %}<span class="badge bg-primary">PLKB</span>{% elif row[3]=='kader' %}<span class="badge bg-success">Kader TPK</span>{% elif row[3]=='dapur' %}<span class="badge bg-warning text-dark">Dapur SPPG</span>{% else %}{{ row[3] }}{% endif %}</td>
                        <td><span class="badge bg-secondary">{{ row[5] if row|length > 5 and row[5] else 'SEMUA' }}</span></td>
                        <td>{{ row[4] if row[4] else '-' }}</td>
                        <td><button class="btn btn-warning btn-sm text-dark" data-bs-toggle="modal" data-bs-target="#modalEditAkun{{ row[0] }}" title="Reset/Edit"><i class="fas fa-edit"></i></button> <a href="javascript:void(0);" onclick="confirmDelete('/hapus_akun/{{ row[0] }}')" class="btn btn-danger btn-sm" title="Hapus"><i class="fas fa-trash"></i></a></td>
                    </tr>
                    <div class="modal fade" id="modalEditAkun{{ row[0] }}" tabindex="-1" aria-hidden="true">
                        <div class="modal-dialog"><div class="modal-content"><form action="/edit_akun" method="POST"><div class="modal-header bg-warning text-dark"><h5 class="modal-title fw-bold"><i class="fas fa-user-edit me-2"></i> Edit / Reset Akun</h5><button type="button" class="btn-close" data-bs-dismiss="modal"></button></div>
                            <div class="modal-body text-start"><input type="hidden" name="id" value="{{ row[0] }}">
                                <div class="mb-3"><label class="form-label fw-bold">Nama Lengkap</label><input type="text" class="form-control" value="{{ row[2] }}" disabled></div>
                                <div class="mb-3"><label class="form-label text-primary fw-bold">Username Baru (Opsional)</label><input type="text" name="username" class="form-control" value="{{ row[1] }}" required></div>
                                <div class="mb-3"><label class="form-label text-danger fw-bold">Reset Password</label><input type="password" name="password" class="form-control" placeholder="Ketik sandi baru..."></div>
                                <div class="mb-3"><label class="form-label">Peran</label><select name="role" class="form-select" id="editRole{{ row[0] }}" required onchange="toggleJenjangEdit('{{ row[0] }}')">{% set roles={'plkb':'PLKB Wilayah', 'kader':'Kader TPK', 'dapur':'Dapur SPPG', 'superadmin':'Superadmin'} %}{% for kv, kn in roles.items() %}<option value="{{ kv }}" {% if row[3]==kv %}selected{% endif %}>{{ kn }}</option>{% endfor %}</select></div>
                                <div class="mb-3">
                                    <label class="form-label">Kecamatan Tugas</label>
                                    <select name="kecamatan" class="form-select" required>
                                        <option value="SEMUA" {% if row|length > 5 and row[5] == 'SEMUA' %}selected{% endif %}>-- Superadmin (Semua Kecamatan) --</option>
                                        {% for kec in DATA_WILAYAH.keys() %}
                                        <option value="{{ kec }}" {% if row|length > 5 and row[5] == kec %}selected{% endif %}>{{ kec }}</option>
                                        {% endfor %}
                                    </select>
                                </div>
                                <div class="mb-3" id="editJabatanContainer{{ row[0] }}" style="display: {% if row[3]=='plkb' %}block{% else %}none{% endif %};"><label class="form-label">Jenjang Jabatan</label><select name="jenjang_jabatan" class="form-select"><option value="">-- Pilih --</option>{% set jenjangs=['AHLI MADYA','AHLI PERTAMA & AHLI MUDA','KETERAMPILAN'] %}{% for j in jenjangs %}<option value="{{ j }}" {% if row[4]==j %}selected{% endif %}>{{ j }}</option>{% endfor %}</select></div>
                            </div>
                            <div class="modal-footer"><button type="submit" class="btn btn-warning fw-bold text-dark"><i class="fas fa-save me-1"></i> Simpan Perubahan</button></div>
                        </form></div></div>
                    </div>
                    {% else %}<tr><td colspan="7" class="text-center py-3">Belum ada data pengguna.</td></tr>{% endfor %}
                </tbody>
            </table>
        </div>
        <div class="modal fade" id="modalTambahAkun" tabindex="-1" aria-hidden="true">
            <div class="modal-dialog"><div class="modal-content"><form action="/tambah_akun" method="POST"><div class="modal-header bg-primary text-white"><h5 class="modal-title fw-bold"><i class="fas fa-user-plus me-2"></i> Tambah Akun Baru</h5><button type="button" class="btn-close btn-close-white" data-bs-dismiss="modal"></button></div>
                <div class="modal-body text-start">
                    <div class="mb-3"><label class="form-label">Username</label><input type="text" name="username" class="form-control" required></div>
                    <div class="mb-3"><label class="form-label">Password</label><input type="password" name="password" class="form-control" required></div>
                    <div class="mb-3"><label class="form-label">Nama Lengkap</label><input type="text" name="nama_lengkap" class="form-control" required></div>
                    <div class="mb-3"><label class="form-label">Peran</label><select name="role" class="form-select" id="selectRole" required onchange="toggleJenjangJabatan()"><option value="">-- Pilih Peran --</option><option value="superadmin">Superadmin</option><option value="plkb">PLKB Wilayah</option><option value="kader">Kader TPK</option><option value="dapur">Dapur SPPG</option></select></div>
                    <div class="mb-3">
                        <label class="form-label">Kecamatan Tugas</label>
                        <select name="kecamatan" class="form-select" required>
                            <option value="SEMUA">-- Superadmin (Semua Kecamatan) --</option>
                            {% for kec in DATA_WILAYAH.keys() %}
                            <option value="{{ kec }}">{{ kec }}</option>
                            {% endfor %}
                        </select>
                    </div>
                    <div class="mb-3" id="jabatanContainer" style="display:none;"><label class="form-label">Jenjang Jabatan (Khusus PLKB)</label><select name="jenjang_jabatan" class="form-select"><option value="">-- Pilih --</option><option value="AHLI MADYA">AHLI MADYA</option><option value="AHLI PERTAMA & AHLI MUDA">AHLI PERTAMA & AHLI MUDA</option><option value="KETERAMPILAN">KETERAMPILAN</option></select></div>
                </div>
                <div class="modal-footer"><button type="submit" class="btn btn-primary"><i class="fas fa-save me-1"></i> Simpan Akun</button></div>
            </form></div></div>
        </div>
        <script>
            function toggleJenjangJabatan(){document.getElementById("jabatanContainer").style.display=(document.getElementById("selectRole").value==="plkb")?"block":"none";}
            function toggleJenjangEdit(id){document.getElementById("editJabatanContainer"+id).style.display=(document.getElementById("editRole"+id).value==="plkb")?"block":"none";}
        </script>
        {% endif %}

        {% if active_page == 'registrasi_dapur' %}
        <div class="d-flex justify-content-between mb-3"><div class="d-flex align-items-center"><i class="fas fa-store-alt fa-2x text-success me-2"></i><div><span style="font-size: 16px; font-weight: bold;">Registrasi Dapur SPPG</span><br><small class="text-muted">Daftar unit Dapur Sehat Atasi Stunting</small></div></div><button class="btn btn-success btn-sm mt-2" data-bs-toggle="modal" data-bs-target="#modalTambahDapur" style="height:35px;"><i class="fas fa-plus me-1"></i> Tambah Dapur Baru</button></div>
        <div class="table-responsive bg-white rounded shadow-sm border">
            <table class="table table-bordered table-hover table-custom mb-0">
                <thead><tr><th style="width: 50px;">No</th><th>Kecamatan</th><th>Desa/Kelurahan</th><th>Nama Dapur SPPG</th><th>Alamat Dapur</th><th>Kepala Dapur</th><th style="width: 100px;">Aksi</th></tr></thead>
                <tbody>
                    {% for row in data_dapur %}<tr><td>{{ loop.index }}</td><td>{{ row[5] }}</td><td>{{ row[2] }}</td><td class="fw-bold text-start">{{ row[1] }}</td><td class="text-start">{{ row[3] }}</td><td>{{ row[4] }}</td><td><a href="javascript:void(0);" onclick="confirmDelete('/hapus_dapur/{{ row[0] }}')" class="btn btn-danger btn-sm"><i class="fas fa-trash"></i></a></td></tr>
                    {% else %}<tr><td colspan="7" class="text-center py-3">Belum ada unit dapur yang didaftarkan.</td></tr>{% endfor %}
                </tbody>
            </table>
        </div>
        <div class="modal fade" id="modalTambahDapur" tabindex="-1" aria-hidden="true">
            <div class="modal-dialog"><div class="modal-content"><form action="/tambah_dapur" method="POST"><div class="modal-header bg-success text-white"><h5 class="modal-title fw-bold"><i class="fas fa-store-alt me-2"></i> Registrasi Dapur SPPG Baru</h5><button type="button" class="btn-close btn-close-white" data-bs-dismiss="modal"></button></div>
                <div class="modal-body text-start">
                    <div class="mb-3">
                        <label class="form-label">Kecamatan</label>
                        <select name="kecamatan" id="kec_dapur_reg" class="form-select" required onchange="updateDesaDropdown('kec_dapur_reg', 'desa_dapur_reg')">
                            <option value="">-- Pilih Kecamatan --</option>
                            {% for kec in DATA_WILAYAH.keys() %}
                            <option value="{{ kec }}">{{ kec }}</option>
                            {% endfor %}
                        </select>
                    </div>
                    <div class="mb-3">
                        <label class="form-label">Desa / Kelurahan</label>
                        <select name="desa_kelurahan" id="desa_dapur_reg" class="form-select" required>
                            <option value="">-- Pilih Kecamatan Dulu --</option>
                        </select>
                    </div>
                    <div class="mb-3"><label class="form-label">Nama Dapur</label><input type="text" name="nama_dapur" class="form-control" required></div>
                    <div class="mb-3"><label class="form-label">Alamat Dapur</label><textarea name="alamat_lengkap" class="form-control" rows="2" required></textarea></div>
                    <div class="mb-3"><label class="form-label">Nama Kepala Dapur</label><input type="text" name="penanggung_jawab" class="form-control" required></div>
                </div>
                <div class="modal-footer"><button type="submit" class="btn btn-success"><i class="fas fa-save me-1"></i> Simpan Dapur</button></div>
            </form></div></div>
        </div>
        {% endif %}

        {% if active_page == 'rekapitulasi' %}
        <div class="panel-search">
            <div class="panel-search-header">Filter Pencarian Rekapitulasi</div>
            <div class="panel-search-body">
                <form action="/rekapitulasi" method="GET">
                    {% if search_query %}<input type="hidden" name="q" value="{{ search_query }}">{% endif %}
                    <div class="row g-3">
                        <div class="col-md-6"><div class="row align-items-center"><div class="col-4"><label class="form-label-custom">Provinsi</label></div><div class="col-8"><select class="form-select form-select-sm" disabled><option>32 - JAWA BARAT</option></select></div></div></div>
                        <div class="col-md-6"><div class="row align-items-center"><div class="col-4"><label class="form-label-custom">Kab/Kota</label></div><div class="col-8"><select class="form-select form-select-sm" disabled><option>02 - SUKABUMI</option></select></div></div></div>
                        <div class="col-md-6">
                            <div class="row align-items-center">
                                <div class="col-4"><label class="form-label-custom">Kecamatan</label></div>
                                <div class="col-8">
                                    <select name="kecamatan" id="filter_kecamatan_rekap" class="form-select form-select-sm" onchange="updateDesaDropdown('filter_kecamatan_rekap', 'filter_desa_rekap')">
                                        <option value="">-- Semua Kecamatan --</option>
                                        {% for kec in DATA_WILAYAH.keys() %}
                                        <option value="{{ kec }}" {% if kecamatan_filter == kec %}selected{% endif %}>{{ kec }}</option>
                                        {% endfor %}
                                    </select>
                                </div>
                            </div>
                        </div>
                        <div class="col-md-6">
                            <div class="row align-items-center">
                                <div class="col-4"><label class="form-label-custom">Desa/Kel</label></div>
                                <div class="col-8">
                                    <select name="desa" id="filter_desa_rekap" class="form-select form-select-sm">
                                        <option value="">-- Semua Desa --</option>
                                        {% if kecamatan_filter and kecamatan_filter in DATA_WILAYAH %}
                                            {% for d in DATA_WILAYAH[kecamatan_filter].keys() %}
                                            <option value="{{ d }}" {% if desa_filter == d %}selected{% endif %}>{{ d }}</option>
                                            {% endfor %}
                                        {% endif %}
                                    </select>
                                </div>
                            </div>
                        </div>
                        <div class="col-md-12">
                            <div class="row align-items-center">
                                <div class="col-2"><label class="form-label-custom">Periode Lapor</label></div>
                                <div class="col-5"><select name="bulan" class="form-select form-select-sm"><option value="">-- Semua Bulan --</option>{% for b in list_bulan %}<option value="{{ b }}" {% if bulan_filter == b %}selected{% endif %}>{{ b }}</option>{% endfor %}</select></div>
                                <div class="col-5"><select name="tahun" class="form-select form-select-sm"><option value="">-- Semua Tahun --</option>{% for t in list_tahun %}<option value="{{ t }}" {% if tahun_filter == t %}selected{% endif %}>{{ t }}</option>{% endfor %}</select></div>
                            </div>
                        </div>
                    </div>
                    <div class="row mt-3"><div class="col-12"><button type="submit" class="btn btn-search btn-sm"><i class="fas fa-search"></i> Terapkan Filter</button></div></div>
                </form>
            </div>
        </div>

        <div class="d-flex justify-content-between mb-2 align-items-end">
            <div class="d-flex align-items-center"><i class="fas fa-clipboard-list me-2"></i> <span style="font-size: 14px; font-weight: bold;">Data Sasaran 1000 HPK dan MBG B3</span></div>
            <div class="d-flex gap-2">
                <button type="button" class="btn btn-sm btn-success" title="Cetak Format Identitas & Fisik ke Excel" onclick="cetakExcelRekapitulasi()"><i class="fas fa-file-excel"></i> Cetak Excel</button>
                <form action="/rekapitulasi" method="GET" class="input-group" style="width: 250px;">
                    {% if kecamatan_filter %}<input type="hidden" name="kecamatan" value="{{ kecamatan_filter }}">{% endif %}
                    {% if desa_filter %}<input type="hidden" name="desa" value="{{ desa_filter }}">{% endif %}
                    {% if bulan_filter %}<input type="hidden" name="bulan" value="{{ bulan_filter }}">{% endif %}
                    {% if tahun_filter %}<input type="hidden" name="tahun" value="{{ tahun_filter }}">{% endif %}
                    <input type="text" name="q" class="form-control form-control-sm" placeholder="Cari NIK/Nama..." value="{{ search_query }}">
                    {% if search_query or kecamatan_filter or desa_filter or bulan_filter or tahun_filter %}<a href="/rekapitulasi" class="btn btn-sm btn-danger"><i class="fas fa-times"></i></a>{% endif %}
                    <button type="submit" class="btn btn-sm" style="background-color: #337ab7; color: white;"><i class="fas fa-search"></i></button>
                </form>
            </div>
        </div>

        <table id="tabelExportRekapitulasi" style="display:none;">
            <thead><tr><th>No</th><th>Kategori Sasaran</th><th>Nama Ibu</th><th>Nama Ayah</th><th>NIK Sasaran</th><th>KK Sasaran</th><th>Tempat Lahir (Ibu)</th><th>Tanggal Lahir (Ibu)</th><th>NIK Anak</th><th>Nama Anak</th><th>Tempat Lahir Anak</th><th>Tanggal Lahir Anak</th><th>Usia Anak</th><th>Kecamatan Sasaran</th><th>Desa Sasaran</th><th>Wilayah Posyandu</th><th>Alamat Lengkap</th><th>Usia Sasaran</th><th>Hamil Ke-</th><th>Usia Kehamilan</th><th>Anak Ke-</th><th>Berat Badan</th><th>Tinggi Badan</th><th>Jenis Kontrasepsi</th></tr></thead>
            <tbody>
                {% for row in data %}
                <tr><td>{{ loop.index }}</td><td>{{ row[6] }}</td><td>{{ row[7] }}</td><td>{{ row[8] }}</td><td>'{{ row[9] }}</td><td>'{{ row[10] }}</td><td>{{ row[23] }}</td><td>{{ row[24] }}</td><td>'{{ row[29] if row[29] else '' }}</td><td>{{ row[25] }}</td><td>{{ row[26] }}</td><td>{{ row[27] }}</td><td>{{ row[28] }}</td><td>{{ row[23] }}</td><td>{{ row[12] }}</td><td>{{ row[14] }}</td><td>{{ row[13] }}</td><td>{{ row[15] }}</td><td>{{ row[16] }}</td><td>{{ row[17] }}</td><td>{{ row[18] }}</td><td>{{ row[19] }}</td><td>{{ row[20] }}</td><td>{{ row[21] }}</td></tr>
                {% endfor %}
            </tbody>
        </table>

        <div class="table-responsive bg-white">
            <table class="table table-bordered table-hover table-custom">
                <thead><tr><th style="width: 50px;">No</th><th>NIK Sasaran</th><th>Nama Sasaran</th><th>Kategori B3</th><th>Periode Lapor</th><th>Desa </th><th style="width: 120px;">Aksi</th></tr></thead>
                <tbody>
                    {% for row in data %}
                    <tr>
                        <td>{{ loop.index }}</td><td class="fw-bold">{{ row[9] }}</td><td><div class="bg-green-siga">{{ row[7] }}</div></td>
                        <td>{% if row[6] in ['Balita Non-PAUD','Baduta'] %}<span class="badge bg-info badge-kategori text-dark">{{ row[6] }}</span>{% elif row[6] == 'Ibu Hamil' %}<span class="badge bg-warning badge-kategori text-dark">Ibu Hamil</span>{% else %}<span class="badge bg-primary badge-kategori">Ibu Menyusui</span>{% endif %}</td>
                        <td>{{ row[1] }} {{ row[2] }}</td><td>{{ row[12] if row[12] else '-' }}</td> 
                        <td style="white-space: nowrap;">
                            <button type="button" class="btn btn-info btn-sm text-dark" data-bs-toggle="modal" data-bs-target="#detailModal{{ row[0] }}"><i class="fas fa-search"></i></button>
                            {% if session['role'] != 'dapur' %}
                            <button type="button" class="btn btn-warning btn-sm text-dark" data-bs-toggle="modal" data-bs-target="#editModal{{ row[0] }}"><i class="fas fa-edit"></i></button>
                            <a href="javascript:void(0);" onclick="confirmDelete('/hapus_sasaran/{{ row[0] }}')" class="btn btn-danger btn-sm"><i class="fas fa-trash"></i></a>
                            {% endif %}

                            <div class="modal fade" id="detailModal{{ row[0] }}" tabindex="-1" aria-hidden="true" style="white-space: normal;">
                                <div class="modal-dialog modal-lg modal-dialog-scrollable"><div class="modal-content"><div class="modal-header bg-info text-dark"><h5 class="modal-title fw-bold"><i class="fas fa-search me-2"></i> Detail: {{ row[7] }}</h5><button type="button" class="btn-close" data-bs-dismiss="modal"></button></div>
                                    <div class="modal-body text-start">
                                        <div class="form-section">1. Data Dapur SPPG</div>
                                        <div class="row mb-3"><div class="col-md-6"><label class="form-label text-primary fw-bold">Bulan Pelaporan</label><input type="text" class="form-control form-control-sm" value="{{ row[1] }}" readonly></div><div class="col-md-6"><label class="form-label text-primary fw-bold">Tahun Pelaporan</label><input type="text" class="form-control form-control-sm" value="{{ row[2] }}" readonly></div></div>
                                        <div class="row mb-3"><div class="col-md-6"><label class="form-label">Nama Dapur</label><input type="text" class="form-control form-control-sm" value="{{ row[3] }}" readonly></div><div class="col-md-6"><label class="form-label">Desa/Kelurahan</label><input type="text" class="form-control form-control-sm" value="{{ row[4] }}" readonly></div></div>
                                        <div class="form-section">2. Identitas Sasaran (Ibu)</div>
                                        <div class="row mb-3"><div class="col-md-4"><label class="form-label">Kategori Sasaran</label><input type="text" class="form-control form-control-sm" value="{{ row[6] }}" readonly></div><div class="col-md-4"><label class="form-label">Nama Ibu</label><input type="text" class="form-control form-control-sm" value="{{ row[7] }}" readonly></div><div class="col-md-4"><label class="form-label">NIK Sasaran</label><input type="text" class="form-control form-control-sm" value="{{ row[9] }}" readonly></div></div>
                                        {% if row[6] != 'Ibu Hamil' and (row[25] or row[29]) %}
                                        <div class="form-section">3. Identitas Anak</div>
                                        <div class="row mb-3"><div class="col-md-4"><label class="form-label">NIK Anak</label><input type="text" class="form-control form-control-sm" value="{{ row[29] if row[29] else '-' }}" readonly></div><div class="col-md-4"><label class="form-label">Nama Anak</label><input type="text" class="form-control form-control-sm" value="{{ row[25] if row[25] else '-' }}" readonly></div><div class="col-md-4"><label class="form-label">Usia Anak</label><input type="text" class="form-control form-control-sm" value="{{ row[28] if row[28] else '-' }}" readonly></div></div>
                                        <div class="row mb-3"><div class="col-md-6"><label class="form-label">Tempat Lahir Anak</label><input type="text" class="form-control form-control-sm" value="{{ row[26] if row[26] else '-' }}" readonly></div><div class="col-md-6"><label class="form-label">Tanggal Lahir Anak</label><input type="date" class="form-control form-control-sm" value="{{ row[27] if row[27] else '-' }}" readonly></div></div>
                                        {% endif %}
                                        <div class="form-section">4. Wilayah & Posyandu</div>
                                        <div class="row mb-3"><div class="col-md-12"><label class="form-label text-primary fw-bold">Wilayah Posyandu</label><input type="text" class="form-control form-control-sm" value="{{ row[14] if row[14] else '-' }}" readonly></div></div>
                                    </div>
                                </div></div>
                            </div>
                            
                            <div class="modal fade" id="editModal{{ row[0] }}" tabindex="-1" aria-hidden="true" style="white-space: normal;">
                                <div class="modal-dialog modal-lg modal-dialog-scrollable"><div class="modal-content"><form action="/update_sasaran/{{ row[0] }}" method="POST"><div class="modal-header bg-warning text-dark"><h5 class="modal-title fw-bold"><i class="fas fa-edit me-2"></i> Edit Data: {{ row[7] }}</h5><button type="button" class="btn-close" data-bs-dismiss="modal"></button></div>
                                    <div class="modal-body text-start">
                                        <div class="form-section">Data Dapur & Wilayah</div>
                                        <div class="row mb-3">
                                            <div class="col-md-6"><label class="form-label">Bulan Lapor</label><select name="bulan_lapor" class="form-select form-select-sm" required>{% for b in list_bulan %}<option value="{{ b }}" {% if row[1] == b %}selected{% endif %}>{{ b }}</option>{% endfor %}</select></div>
                                            <div class="col-md-6"><label class="form-label">Tahun Lapor</label><select name="tahun_lapor" class="form-select form-select-sm" required>{% for t in list_tahun %}<option value="{{ t }}" {% if row[2] == t %}selected{% endif %}>{{ t }}</option>{% endfor %}</select></div>
                                        </div>
                                        <div class="row mb-3"><div class="col-md-6"><label class="form-label">Nama Dapur</label><input type="text" name="nama_dapur" class="form-control form-control-sm" value="{{ row[3] }}"></div><div class="col-md-6"><label class="form-label">Desa Dapur</label><input type="text" name="desa_kelurahan" class="form-control form-control-sm" value="{{ row[4] }}" readonly></div></div>
                                        <div class="row mb-3"><div class="col-md-12"><label class="form-label">Alamat Dapur</label><input type="text" name="alamat_dapur" class="form-control form-control-sm" value="{{ row[5] }}"></div></div>
                                        <div class="form-section">Identitas Sasaran (Ibu)</div>
                                        <div class="row mb-3">
                                            <div class="col-md-4"><label class="form-label">Kategori Sasaran</label><select name="kategori_Sasaran" id="editKategori_{{ row[0] }}" class="form-select form-select-sm" required onchange="toggleEditAnakFields('{{ row[0] }}')">{% set kats=['Balita Non-PAUD','Baduta','Ibu Hamil','Ibu Menyusui'] %}{% for k in kats %}<option value="{{ k }}" {% if row[6] == k %}selected{% endif %}>{{ k }}</option>{% endfor %}</select></div>
                                            <div class="col-md-4"><label class="form-label">Nama Penerima/Sasaran</label><input type="text" name="nama_Sasaran" class="form-control form-control-sm" value="{{ row[7] }}" required></div>
                                            <div class="col-md-4"><label class="form-label">Nama Ayah</label><input type="text" name="nama_ayah" class="form-control form-control-sm" value="{{ row[8] }}"></div>
                                        </div>
                                        <div class="row mb-3"><div class="col-md-4"><label class="form-label">NIK Sasaran</label><input type="text" name="nik_Sasaran" class="form-control form-control-sm" value="{{ row[9] }}"></div><div class="col-md-4"><label class="form-label">KK Sasaran</label><input type="text" name="kk_Sasaran" class="form-control form-control-sm" value="{{ row[10] }}"></div><div class="col-md-4"><label class="form-label">Usia Sasaran (Ibu)</label><input type="text" name="usia_sasaran" id="usia_sasaran_edit_{{ row[0] }}" class="form-control form-control-sm" value="{{ row[15] }}" readonly></div></div>
                                        <div class="row mb-3"><div class="col-md-6"><label class="form-label">Tempat Lahir (Ibu)</label><input type="text" name="tempat_lahir" class="form-control form-control-sm" value="{{ row[23] }}"></div><div class="col-md-6"><label class="form-label">Tanggal Lahir (Ibu)</label><input type="date" name="tanggal_lahir" id="tgl_lahir_edit_{{ row[0] }}" class="form-control form-control-sm" value="{{ row[24] }}" onchange="calculateAgeUniversal(this.value, 'usia_sasaran_edit_{{ row[0] }}')"></div></div>
                                        
                                        <div class="row mb-3 pb-3 pt-3 border rounded bg-light" id="edit_anak_fields_{{ row[0] }}" style="display: {% if row[6] == 'Ibu Hamil' %}none{% else %}flex{% endif %};">
                                            <div class="col-12 mb-2"><span class="fw-bold text-primary"><i class="fas fa-child me-2"></i>Data Anak</span></div>
                                            <div class="col-md-6 mb-2"><label class="form-label">NIK Anak</label><input type="text" class="form-control form-control-sm input-anak-{{ row[0] }}" name="nik_anak" value="{{ row[29] if row[29] else '' }}" maxlength="16" oninput="this.value=this.value.replace(/[^0-9]/g,'')"></div>
                                            <div class="col-md-6 mb-2"><label class="form-label">Nama Anak</label><input type="text" class="form-control form-control-sm input-anak-{{ row[0] }}" name="nama_anak" value="{{ row[25] if row[25] else '' }}" {% if row[6]!='Ibu Hamil' %}required{% endif %}></div>
                                            <div class="col-md-4"><label class="form-label">Tempat Lahir Anak</label><input type="text" class="form-control form-control-sm input-anak-{{ row[0] }}" name="tempat_lahir_anak" value="{{ row[26] if row[26] else '' }}" {% if row[6]!='Ibu Hamil' %}required{% endif %}></div>
                                            <div class="col-md-4"><label class="form-label">Tanggal Lahir Anak</label><input type="date" class="form-control form-control-sm input-anak-{{ row[0] }}" name="tanggal_lahir_anak" id="tgl_lahir_anak_edit_{{ row[0] }}" value="{{ row[27] if row[27] else '' }}" onchange="calculateAgeUniversal(this.value, 'usia_anak_edit_{{ row[0] }}')" {% if row[6]!='Ibu Hamil' %}required{% endif %}></div>
                                            <div class="col-md-4"><label class="form-label">Usia Anak</label><input type="text" class="form-control form-control-sm" name="usia_anak" id="usia_anak_edit_{{ row[0] }}" value="{{ row[28] if row[28] else '' }}" readonly></div>
                                        </div>
                                        <div class="form-section">Alamat & Posyandu Sasaran</div>
                                        <div class="row mb-3">
                                            <div class="col-md-6">
                                                <label class="form-label">Kecamatan Sasaran</label>
                                                <select name="kecamatan_sasaran" id="edit_kec_{{ row[0] }}" class="form-select form-select-sm" required onchange="updateDesaDropdown('edit_kec_{{ row[0] }}', 'edit_desa_{{ row[0] }}')">
                                                    <option value="">-- Pilih Kecamatan --</option>
                                                    {% for kec in DATA_WILAYAH.keys() %}
                                                    <option value="{{ kec }}" {% if row[23] == kec %}selected{% endif %}>{{ kec }}</option>
                                                    {% endfor %}
                                                </select>
                                            </div>
                                            <div class="col-md-6">
                                                <label class="form-label">Desa Sasaran</label>
                                                <select name="desa_sasaran" id="edit_desa_{{ row[0] }}" class="form-select form-select-sm" required>
                                                    {% if row[23] and row[23] in DATA_WILAYAH %}
                                                        {% for d in DATA_WILAYAH[row[23]].keys() %}
                                                        <option value="{{ d }}" {% if row[12] == d %}selected{% endif %}>{{ d }}</option>
                                                        {% endfor %}
                                                    {% else %}
                                                        <option value="{{ row[12] }}" selected>{{ row[12] }}</option>
                                                    {% endif %}
                                                </select>
                                            </div>
                                            <div class="col-md-12 mt-2">
                                                <label class="form-label">Wilayah Posyandu</label>
                                                <input type="text" name="wilayah_posyandu" class="form-control form-control-sm" value="{{ row[14] or '' }}" placeholder="Ketik nama posyandu manual..." required>
                                            </div>
                                        </div>
                                        <div class="row mb-3"><div class="col-md-12"><label class="form-label">Alamat Lengkap Sasaran</label><input type="text" name="alamat_sasaran" class="form-control form-control-sm" value="{{ row[13] }}"></div></div>
                                        <div class="form-section">Data Fisik & Klinis</div>
                                        <div class="row mb-3"><div class="col-md-3"><label class="form-label">Hamil Ke</label><input type="number" name="hamil_ke" id="hamil_ke_edit_{{ row[0] }}" class="form-control form-control-sm" value="{{ row[16] }}"></div><div class="col-md-3"><label class="form-label">Usia Kehamilan</label><input type="number" name="usia_kehamilan" id="usia_hamil_edit_{{ row[0] }}" class="form-control form-control-sm" value="{{ row[17] }}"></div><div class="col-md-3"><label class="form-label">Anak Ke</label><input type="number" name="anak_ke" id="anak_ke_edit_{{ row[0] }}" class="form-control form-control-sm" value="{{ row[18] }}"></div><div class="col-md-3"><label class="form-label">Jenis Kontrasepsi</label><input type="text" name="jenis_kontrasepsi" class="form-control form-control-sm" value="{{ row[21] }}"></div></div>
                                        <div class="row mb-3"><div class="col-md-6"><label class="form-label">Berat Badan (kg)</label><input type="number" step="0.01" name="berat_badan" id="bb_edit_{{ row[0] }}" class="form-control form-control-sm" value="{{ row[19] }}"></div><div class="col-md-6"><label class="form-label">Tinggi Badan (cm)</label><input type="number" step="0.01" name="tinggi_badan" id="tb_edit_{{ row[0] }}" class="form-control form-control-sm" value="{{ row[20] }}"></div></div>
                                    </div>
                                    <div class="modal-footer"><button type="button" class="btn btn-secondary btn-sm" data-bs-dismiss="modal">Tutup</button><button type="submit" class="btn btn-primary btn-sm"><i class="fas fa-save me-1"></i> Simpan Perubahan</button></div>
                                </form></div></div>
                            </div>
                        </td>
                    </tr>
                    {% else %}<tr><td colspan="7" class="text-center py-3">Tidak ada data sasaran yang ditemukan.</td></tr>{% endfor %}
                </tbody>
            </table>
        </div> 
        {% endif %}

        {% if active_page == 'arsip_laporan' %}
        <div class="panel-search mb-4">
            <div class="panel-search-header"><i class="fas fa-filter me-1"></i> Filter Histori Laporan Distribusi Dapur</div>
            <div class="panel-search-body">
                <form action="/arsip_laporan" method="GET">
                    <div class="row g-3 align-items-center">
                        <div class="col-md-3">
                            <label class="form-label-custom fw-bold">Kecamatan</label>
                            <select name="kecamatan" id="filter_kecamatan_arsip" class="form-select form-select-sm" onchange="updateDesaDropdown('filter_kecamatan_arsip', 'filter_desa_arsip')">
                                <option value="">-- Semua Kecamatan --</option>
                                {% for kec in DATA_WILAYAH.keys() %}
                                <option value="{{ kec }}" {% if kecamatan_filter == kec %}selected{% endif %}>{{ kec }}</option>
                                {% endfor %}
                            </select>
                        </div>
                        <div class="col-md-3">
                            <label class="form-label-custom fw-bold">Desa/Kelurahan</label>
                            <select name="desa" id="filter_desa_arsip" class="form-select form-select-sm">
                                <option value="">-- Semua Desa --</option>
                                {% if kecamatan_filter and kecamatan_filter in DATA_WILAYAH %}
                                    {% for d in DATA_WILAYAH[kecamatan_filter].keys() %}
                                    <option value="{{ d }}" {% if desa_filter == d %}selected{% endif %}>{{ d }}</option>
                                    {% endfor %}
                                {% endif %}
                            </select>
                        </div>
                        <div class="col-md-2"><label class="form-label-custom fw-bold">Periode Bulan</label><select name="bulan" class="form-select form-select-sm"><option value="">-- Semua Bulan --</option>{% for b in list_bulan %}<option value="{{ b }}" {% if bulan_filter == b %}selected{% endif %}>{{ b }}</option>{% endfor %}</select></div>
                        <div class="col-md-2"><label class="form-label-custom fw-bold">Periode Tahun</label><select name="tahun" class="form-select form-select-sm"><option value="">-- Semua Tahun --</option>{% for t in list_tahun %}<option value="{{ t }}" {% if tahun_filter == t %}selected{% endif %}>{{ t }}</option>{% endfor %}</select></div>
                        <div class="col-md-2 mt-4 pt-2"><button type="submit" class="btn btn-search btn-sm w-100"><i class="fas fa-search"></i> Terapkan</button></div>
                    </div>
                </form>
            </div>
        </div>

        <div class="d-flex justify-content-between mb-3 mt-2">
            <div class="d-flex align-items-center"><div class="me-3"><i class="fas fa-list-alt fa-2x text-primary"></i></div><div><span style="font-size: 16px; font-weight: bold; color:#333;">Data Laporan Dapur</span><br><small class="text-muted" style="font-size: 13px;"><strong>Periode:</strong> {{ bulan_filter if bulan_filter else 'Semua Bulan' }} {{ tahun_filter if tahun_filter else 'Semua Tahun' }}</small></div></div>
            <div class="text-end">
                {% if kecamatan_filter or desa_filter or bulan_filter or tahun_filter %}<a href="/arsip_laporan" class="btn btn-sm btn-danger mt-2" title="Reset Pencarian" style="height:32px;"><i class="fas fa-times"></i> Reset</a>{% endif %}
                <button type="button" class="btn btn-sm btn-danger mt-2 ms-2" onclick="cetakPDFLaporanDapur('{{ bulan_filter }}', '{{ tahun_filter }}')" style="height:32px;"><i class="fas fa-file-pdf"></i> Cetak PDF</button>
                <button type="button" class="btn btn-sm btn-success mt-2 ms-2" onclick="cetakExcelLaporanDapur('{{ bulan_filter }}', '{{ tahun_filter }}')" style="height:32px;"><i class="fas fa-file-excel"></i> Cetak Excel</button>
            </div>
        </div>

        <div class="table-responsive" style="overflow: visible;">
            <table class="table table-bordered table-hover table-custom" id="tabelLaporanDapur">
                <thead><tr><th style="width: 50px;">No</th><th>Periode</th><th>Nama Dapur</th><th>Balita Non-PAUD</th><th>Baduta</th><th>Ibu Hamil</th><th>Ibu Menyusui</th><th>Total Sasaran</th></tr></thead>
                <tbody>
                    {% for row in data_laporan %}
                    <tr><td>{{ loop.index }}</td><td class="fw-bold text-primary">{{ row[1] }} {{ row[2] }}</td><td class="text-start fw-bold">{{ row[3] }}</td><td>{{ row[5] }}</td><td>{{ row[6] }}</td><td>{{ row[7] }}</td><td>{{ row[8] }}</td><td><span class="badge bg-success" style="font-size: 13px;">{{ row[9] }}</span></td></tr>
                    {% else %}<tr><td colspan="8" class="text-center py-4 text-muted">Belum ada laporan realisasi dapur yang diinputkan untuk periode ini.</td></tr>{% endfor %}
                </tbody>
            </table>
        </div>
        
        <table id="tabelExportLaporanDapur" style="display:none;">
            <thead><tr><th>No</th><th>Bulan Pelaporan</th><th>Tahun Pelaporan</th><th>Nama Dapur</th><th>Alamat Dapur</th><th>Balita Non-PAUD</th><th>Baduta</th><th>Ibu Hamil</th><th>Ibu Menyusui</th><th>Total Sasaran</th><th>SPPG Mendistribusikan MBG B3</th><th>Pemberian Makanan UPF</th><th>Frekuensi Distribusi MBG B3</th><th>Frekuensi Sasaran B3 Menerima MBG</th><th>Frekuensi Menu Makanan Basah</th><th>Status Insentif Kader</th><th>Nominal Insentif</th><th>Jml. Anggota TPK</th><th>Jml. Anggota TPK Distribusi MBG B3</th><th>Jml. Kader (Non TPK) Distribusi MBG B3</th></tr></thead>
            <tbody>
                {% for row in data_laporan %}
                <tr><td>{{ loop.index }}</td>{% for i in range(1, 20) %}<td>{% if row|length > i and row[i] is not none %}{{ row[i] }}{% else %}-{% endif %}</td>{% endfor %}</tr>
                {% else %}<tr><td colspan="20">Belum ada laporan realisasi dapur yang diinputkan untuk periode ini.</td></tr>{% endfor %}
            </tbody>
        </table>
        {% endif %}

        {% if active_page == 'rekap_laporan_kader' %}
        <div class="panel-search mb-4">
            <div class="panel-search-header"><i class="fas fa-filter me-1"></i> Filter Rekapitulasi Laporan Kader</div>
            <div class="panel-search-body">
                <form action="/rekap_laporan_kader" method="GET">
                    <div class="row g-3 align-items-center">
                        <div class="col-md-3">
                            <label class="form-label-custom fw-bold">Kecamatan</label>
                            <select name="kecamatan" id="filter_kecamatan_rk" class="form-select form-select-sm" onchange="updateDesaDropdown('filter_kecamatan_rk', 'filter_desa_rk')">
                                <option value="">-- Semua Kecamatan --</option>
                                {% for kec in DATA_WILAYAH.keys() %}
                                <option value="{{ kec }}" {% if kecamatan_filter == kec %}selected{% endif %}>{{ kec }}</option>
                                {% endfor %}
                            </select>
                        </div>
                        <div class="col-md-3">
                            <label class="form-label-custom fw-bold">Desa/Kelurahan</label>
                            <select name="desa" id="filter_desa_rk" class="form-select form-select-sm">
                                <option value="">-- Semua Desa --</option>
                                {% if kecamatan_filter and kecamatan_filter in DATA_WILAYAH %}
                                    {% for d in DATA_WILAYAH[kecamatan_filter].keys() %}
                                    <option value="{{ d }}" {% if desa_filter == d %}selected{% endif %}>{{ d }}</option>
                                    {% endfor %}
                                {% endif %}
                            </select>
                        </div>
                        <div class="col-md-2"><label class="form-label-custom fw-bold">Periode Bulan</label><select name="bulan" class="form-select form-select-sm"><option value="">-- Semua Bulan --</option>{% for b in list_bulan %}<option value="{{ b }}" {% if bulan_filter == b %}selected{% endif %}>{{ b }}</option>{% endfor %}</select></div>
                        <div class="col-md-2"><label class="form-label-custom fw-bold">Periode Tahun</label><select name="tahun" class="form-select form-select-sm"><option value="">-- Semua Tahun --</option>{% for t in list_tahun %}<option value="{{ t }}" {% if tahun_filter == t %}selected{% endif %}>{{ t }}</option>{% endfor %}</select></div>
                        <div class="col-md-2 mt-4 pt-2"><button type="submit" class="btn btn-search btn-sm w-100"><i class="fas fa-search"></i> Terapkan</button></div>
                    </div>
                </form>
            </div>
        </div>

        <div class="d-flex justify-content-between mb-3 mt-2">
            <div class="d-flex align-items-center"><div class="me-3"><i class="fas fa-users fa-2x text-primary"></i></div><div><span style="font-size: 16px; font-weight: bold; color:#333;">Rekapitulasi Sasaran 1000 HPK dan MBG B3</span><br><small class="text-muted" style="font-size: 13px;"><strong>Kecamatan:</strong> {{ kecamatan_filter if kecamatan_filter else 'Semua Kecamatan' }} &nbsp;|&nbsp; <strong>Desa:</strong> {{ desa_filter if desa_filter else 'Semua Desa' }} &nbsp;|&nbsp; <strong>Periode:</strong> {{ bulan_filter if bulan_filter else 'Semua Bulan' }} {{ tahun_filter if tahun_filter else 'Semua Tahun' }}</small></div></div>
            <div class="text-end">
                {% if kecamatan_filter or desa_filter or bulan_filter or tahun_filter %}<a href="/rekap_laporan_kader" class="btn btn-sm btn-danger mt-2" title="Reset Pencarian" style="height:32px;"><i class="fas fa-times"></i> Reset</a>{% endif %}
                <button type="button" class="btn btn-sm btn-danger mt-2 ms-2" onclick="cetakPDFRekapKader('{{ desa_filter }}', '{{ bulan_filter }}', '{{ tahun_filter }}')" style="height:32px;"><i class="fas fa-file-pdf"></i> Cetak PDF</button>
                <button type="button" class="btn btn-sm btn-success mt-2 ms-2" onclick="cetakExcelRekapKader('{{ desa_filter }}', '{{ bulan_filter }}', '{{ tahun_filter }}')" style="height:32px;"><i class="fas fa-file-excel"></i> Cetak Excel</button>
            </div>
        </div>

        <div class="table-responsive" style="overflow: visible;">
            <table class="table table-bordered table-hover table-custom" id="tabelRekapKader">
                <thead><tr><th style="width: 50px;">Nomor</th><th>Nama Posyandu</th><th>Balita Non-PAUD</th><th>Baduta</th><th>Ibu Hamil</th><th>Ibu Menyusui</th><th>Total Sasaran</th></tr></thead>
                <tbody>
                    {% for row in data_kader %}<tr><td>{{ loop.index }}</td><td class="text-start fw-bold">{{ row[0] }}</td><td>{{ row[1] }}</td><td>{{ row[2] }}</td><td>{{ row[3] }}</td><td>{{ row[4] }}</td><td><span class="badge bg-success" style="font-size: 13px;">{{ row[5] }}</span></td></tr>
                    {% else %}<tr><td colspan="7" class="text-center py-4 text-muted">Belum ada rekapitulasi laporan kader untuk periode/desa ini.</td></tr>{% endfor %}
                </tbody>
            </table>
        </div>
        {% endif %}
    </div>

    <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js"></script>
    <script src="https://cdn.jsdelivr.net/npm/sweetalert2@11"></script>
    <script>
        const Toast=Swal.mixin({toast:true,position:'bottom-end',showConfirmButton:false,timer:5000,timerProgressBar:true,didOpen:(toast)=>{toast.onmouseenter=Swal.stopTimer;toast.onmouseleave=Swal.resumeTimer;}});
        document.addEventListener("DOMContentLoaded", function() {
            {% with messages = get_flashed_messages(with_categories=true) %}
                {% if messages %}{% for category, message in messages %}Toast.fire({icon:'{{ "success" if category == "success" else "error" }}',title:'{{ message }}'});{% endfor %}{% endif %}
            {% endwith %}
        });
        window.calculateAgeUniversal=function(tglInputVal,ageOutputId){
            const dob=new Date(tglInputVal);
            if(!isNaN(dob.getTime())){
                const today=new Date(); let years=today.getFullYear()-dob.getFullYear(), months=today.getMonth()-dob.getMonth();
                if(months<0||(months===0&&today.getDate()<dob.getDate())){years--; months+=12;}
                if(today.getDate()<dob.getDate()) months--; if(months<0) months=11;
                const usiaInput=document.getElementById(ageOutputId);
                if(usiaInput) usiaInput.value = (years<=0) ? months+" Bulan" : (months===0 ? years+" Tahun" : years+" Tahun "+months+" Bulan");
            }
        };
        window.toggleEditAnakFields=function(rowId){
            const kat=document.getElementById('editKategori_'+rowId).value, anakFields=document.getElementById('edit_anak_fields_'+rowId), inputsAnak=document.querySelectorAll('.input-anak-'+rowId);
            const els = ['hamil_ke_edit_','usia_hamil_edit_','anak_ke_edit_','bb_edit_','tb_edit_'].map(id=>document.getElementById(id+rowId));
            if(kat==='Ibu Hamil'){
                if(els[0]) els[0].disabled=false; if(els[1]) els[1].disabled=false; if(els[2]) els[2].disabled=true; if(els[3]) els[3].disabled=true; if(els[4]) els[4].disabled=true;
                if(anakFields) anakFields.style.display='none'; inputsAnak.forEach(i=>i.required=false);
            }else if(['Ibu Menyusui','Balita Non-PAUD','Baduta'].includes(kat)){
                if(els[0]) els[0].disabled=true; if(els[1]) els[1].disabled=true; if(els[2]) els[2].disabled=false; if(els[3]) els[3].disabled=false; if(els[4]) els[4].disabled=false;
                if(anakFields) anakFields.style.display='flex'; inputsAnak.forEach(i=>{if(i.name!=='nik_anak')i.required=true;});
            }else{
                els.forEach(e=>{if(e)e.disabled=false;}); if(anakFields) anakFields.style.display='none'; inputsAnak.forEach(i=>i.required=false);
            }
        };
        const exportStyle=`<html xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns="http://www.w3.org/TR/REC-html40"><head><meta charset="utf-8"><style>.title-row{background-color:#0b3d91;color:#fff;font-size:16pt;font-weight:bold;text-align:center;height:40px;vertical-align:middle}.subtitle-row{background-color:#1e40af;color:#fff;font-size:12pt;text-align:center;height:30px;vertical-align:middle}.header-cell{background-color:#fdbb2d;color:#000;font-weight:bold;border:1px solid #000;text-align:center;vertical-align:middle;padding:5px}.data-cell{border:1px solid #000;text-align:center;vertical-align:middle;padding:5px}.data-cell-left{border:1px solid #000;text-align:left;vertical-align:middle;padding:5px}.alt-row{background-color:#f4f6f9}</style></head><body><table style="border-collapse:collapse;">`;
        window.cetakExcelRekapitulasi=function(){
            let table=document.getElementById("tabelExportRekapitulasi"); if(!table)return; let rows=table.querySelectorAll("tbody tr");
            let html=exportStyle+`<tr><td colspan="24" class="title-row">DATA SASARAN 1000 HPK DAN MBG B3</td></tr><tr><td colspan="24" class="subtitle-row">RINCIAN IDENTITAS DAN FISIK SASARAN</td></tr><tr><td colspan="24"></td></tr><tr><th class="header-cell">No</th><th class="header-cell">Kategori Sasaran</th><th class="header-cell">Nama Ibu</th><th class="header-cell">Nama Ayah / Suami</th><th class="header-cell">NIK Sasaran</th><th class="header-cell">KK Sasaran</th><th class="header-cell">Tempat Lahir (Ibu)</th><th class="header-cell">Tanggal Lahir (Ibu)</th><th class="header-cell">NIK Anak</th><th class="header-cell">Nama Anak</th><th class="header-cell">Tempat Lahir Anak</th><th class="header-cell">Tanggal Lahir Anak</th><th class="header-cell">Usia Anak</th><th class="header-cell">Kecamatan Sasaran</th><th class="header-cell">Desa Sasaran</th><th class="header-cell">Wilayah Posyandu</th><th class="header-cell">Alamat Lengkap</th><th class="header-cell">Usia Sasaran</th><th class="header-cell">Hamil Ke-</th><th class="header-cell">Usia Kehamilan (Minggu)</th><th class="header-cell">Anak Ke-</th><th class="header-cell">Berat Badan (Kg)</th><th class="header-cell">Tinggi Badan (Cm)</th><th class="header-cell">Jenis Kontrasepsi</th></tr>`;
            for(let i=0;i<rows.length;i++){
                let cols=rows[i].querySelectorAll("td"); html+=`<tr class="${i%2===0?'':'alt-row'}">`;
                for(let j=0;j<cols.length;j++){
                    let text=cols[j].innerText.trim(); let cellClass=[2,3,9,16].includes(j)?"data-cell-left":"data-cell";
                    let styleAttr=[4,5,8].includes(j)?` style="mso-number-format:'\\\\@';"`:"";
                    if([4,5,8].includes(j)) text=text.replace(/'/g,"");
                    html+=`<td class="${cellClass}"${styleAttr}>${text}</td>`;
                }
                html+=`</tr>`;
            }
            html+=`</table></body></html>`; let blob=new Blob([html],{type:'application/vnd.ms-excel'}), url=URL.createObjectURL(blob), link=document.createElement("a"); link.href=url; link.download="Data_Sasaran_Kader_Lengkap.xls"; document.body.appendChild(link); link.click(); document.body.removeChild(link); URL.revokeObjectURL(url);
        };
        window.cetakExcelLaporanDapur=function(bulan,tahun){
            let table=document.getElementById("tabelExportLaporanDapur"); if(!table)return; bulan=bulan||"Semua Bulan"; tahun=tahun||"Semua Tahun"; let rows=table.querySelectorAll("tbody tr");
            let html=exportStyle+`<tr><td colspan="20" class="title-row">DATA LAPORAN REALISASI DAPUR</td></tr><tr><td colspan="20" class="subtitle-row">PERIODE: ${bulan.toUpperCase()} ${tahun}</td></tr><tr><td colspan="20"></td></tr><tr><th class="header-cell">No</th><th class="header-cell">Bulan Pelaporan</th><th class="header-cell">Tahun Pelaporan</th><th class="header-cell">Nama Dapur</th><th class="header-cell">Alamat Dapur</th><th class="header-cell">Balita Non-PAUD</th><th class="header-cell">Baduta</th><th class="header-cell">Ibu Hamil</th><th class="header-cell">Ibu Menyusui</th><th class="header-cell">Total Sasaran</th><th class="header-cell">SPPG Mendistribusikan MBG B3</th><th class="header-cell">Pemberian Makanan UPF</th><th class="header-cell">Frekuensi Distribusi MBG B3</th><th class="header-cell">Frekuensi Sasaran B3 Menerima MBG</th><th class="header-cell">Frekuensi Menu Makanan Basah</th><th class="header-cell">Status Insentif Kader</th><th class="header-cell">Nominal Insentif</th><th class="header-cell">Jml. Anggota TPK</th><th class="header-cell">Jml. Anggota TPK Distribusi MBG B3</th><th class="header-cell">Jml. Kader (Non TPK) Distribusi MBG B3</th></tr>`;
            for(let i=0;i<rows.length;i++){
                let cols=rows[i].querySelectorAll("td"); if(cols.length===1){html+=`<tr><td colspan="20" class="data-cell">${cols[0].innerText}</td></tr>`;continue;}
                html+=`<tr class="${i%2===0?'':'alt-row'}">`;
                for(let j=0;j<cols.length;j++){
                    let text=cols[j].innerText.trim(); html+=`<td class="${[3,4].includes(j)?'data-cell-left':'data-cell'}"${j===16?` style="mso-number-format:'\\\\#\\\\,\\\\#\\\\#0';"`:""}>${text}</td>`;
                }
                html+=`</tr>`;
            }
            html+=`</table></body></html>`; let blob=new Blob([html],{type:'application/vnd.ms-excel'}), url=URL.createObjectURL(blob), link=document.createElement("a"); link.href=url; link.download=`Laporan_Dapur_${bulan}_${tahun}.xls`; document.body.appendChild(link); link.click(); document.body.removeChild(link); URL.revokeObjectURL(url);
        };
        window.cetakPDFLaporanDapur=function(bulan,tahun){
            let table=document.getElementById("tabelLaporanDapur"); if(!table)return; bulan=bulan||"Semua Bulan"; tahun=tahun||"Semua Tahun";
            let printWindow=window.open('','','height=600,width=800'); printWindow.document.write('<html><head><title>Cetak Laporan</title><style>body{font-family:"Segoe UI",Arial,sans-serif;padding:20px}table{width:100%;border-collapse:collapse;margin-top:15px;font-size:13px}th,td{border:1px solid #000;padding:8px;text-align:center}th{background-color:#e9ecef}.text-start{text-align:left}</style></head><body><h2 style="color:#0b3d91;text-align:center;">Data Laporan Realisasi Dapur</h2><p style="text-align:center;"><strong>Periode:</strong> '+bulan+' '+tahun+'</p><hr>'+table.outerHTML+'</body></html>');
            printWindow.document.close(); setTimeout(()=>printWindow.print(),500);
        };
        window.cetakExcelRekapKader=function(desa,bulan,tahun){
            let table=document.getElementById("tabelRekapKader"); if(!table)return; desa=desa||"Semua Desa"; bulan=bulan||"Semua Bulan"; tahun=tahun||"Semua Tahun"; let rows=table.querySelectorAll("tbody tr");
            let html=exportStyle+`<tr><td colspan="7" class="title-row">REKAPITULASI LAPORAN KADER - DESA ${desa.toUpperCase()}</td></tr><tr><td colspan="7" class="subtitle-row">PERIODE: ${bulan.toUpperCase()} ${tahun}</td></tr><tr><td colspan="7"></td></tr><tr><th class="header-cell">Nomor</th><th class="header-cell">Nama Posyandu</th><th class="header-cell">Balita Non-PAUD</th><th class="header-cell">Baduta</th><th class="header-cell">Ibu Hamil</th><th class="header-cell">Ibu Menyusui</th><th class="header-cell">Total Sasaran</th></tr>`;
            for(let i=0;i<rows.length;i++){
                let cols=rows[i].querySelectorAll("td"); if(cols.length===1){html+=`<tr><td colspan="7" class="data-cell">${cols[0].innerText}</td></tr>`;continue;}
                html+=`<tr class="${i%2===0?'':'alt-row'}">`; for(let j=0;j<cols.length;j++){html+=`<td class="${j===1?'data-cell-left':'data-cell'}">${cols[j].innerText.trim()}</td>`;} html+=`</tr>`;
            }
            html+=`</table></body></html>`; let blob=new Blob([html],{type:'application/vnd.ms-excel'}), url=URL.createObjectURL(blob), link=document.createElement("a"); link.href=url; link.download=`Rekap_Kader_${desa}_${bulan}_${tahun}.xls`; document.body.appendChild(link); link.click(); document.body.removeChild(link); URL.revokeObjectURL(url);
        };
        window.cetakPDFRekapKader=function(desa,bulan,tahun){
            let table=document.getElementById("tabelRekapKader"); if(!table)return; desa=desa||"Semua Desa"; bulan=bulan||"Semua Bulan"; tahun=tahun||"Semua Tahun";
            let printWindow=window.open('','','height=600,width=800'); printWindow.document.write('<html><head><title>Cetak Rekap - '+desa+'</title><style>body{font-family:"Segoe UI",Arial,sans-serif;padding:20px}table{width:100%;border-collapse:collapse;margin-top:15px;font-size:13px}th,td{border:1px solid #000;padding:8px;text-align:center}th{background-color:#e9ecef}.text-start{text-align:left}</style></head><body><h2 style="color:#0b3d91;text-align:center;">Rekapitulasi Laporan Kader</h2><p style="text-align:center;"><strong>Desa:</strong> '+desa+' | <strong>Periode:</strong> '+bulan+' '+tahun+'</p><hr>'+table.outerHTML+'</body></html>');
            printWindow.document.close(); setTimeout(()=>printWindow.print(),500);
        };
        function confirmDelete(url){
            Swal.fire({title:'Hapus data ini?',text:"Data yang dihapus tidak dapat dikembalikan!",icon:'warning',showCancelButton:true,confirmButtonColor:'#d33',cancelButtonColor:'#3085d6',confirmButtonText:'<i class="fas fa-trash me-1"></i> Ya, Hapus!',cancelButtonText:'Batal',reverseButtons:true}).then(r=>{if(r.isConfirmed)window.location.href=url;});
        }
    </script>
</body>
</html>
"""

# ==============================================================================
# 3. BAGIAN: Database & Utility
# ==============================================================================
def auto_fix_db():
    os.makedirs(UPLOAD_FOLDER, exist_ok=True)
    conn = sqlite3.connect(DB_NAME)
    c = conn.cursor()
    
    # Users
    c.execute('''CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY, username TEXT, password TEXT, role TEXT, nama_lengkap TEXT)''')
    c.execute("PRAGMA table_info(users)")
    cols = [col[1] for col in c.fetchall()]
    for col in ['foto_profil', 'kecamatan', 'jenjang_jabatan', 'is_online']:
        if col not in cols: c.execute(f"ALTER TABLE users ADD COLUMN {col} TEXT")
    
    users_to_check = [
        ('admin', 'admin123', 'superadmin', 'Super Admin BKKBN', 'SEMUA'),
        ('plkb1', 'plkb123', 'plkb', 'PLKB Ciracap', 'CIRACAP'),
        ('dapur1', 'dapur123', 'dapur', 'Kepala Dapur Sentral', 'CIRACAP'),
        ('kader1', 'kader123', 'kader', 'Kader TPK', 'CIRACAP')
    ]
    for u in users_to_check:
        c.execute("SELECT COUNT(*) FROM users WHERE username=?", (u[0],))
        if c.fetchone()[0] == 0: c.execute("INSERT INTO users (username, password, role, nama_lengkap, kecamatan) VALUES (?,?,?,?,?)", u)
        else: c.execute("UPDATE users SET nama_lengkap=?, kecamatan=? WHERE username=?", (u[3], u[4], u[0]))
    
    # Sasaran lengkap
    c.execute("PRAGMA table_info(sasaran_lengkap)")
    cols = [col[1] for col in c.fetchall()]
    if not cols or 'bulan_lapor' not in cols:
        c.execute("DROP TABLE IF EXISTS sasaran_lengkap")
        c.execute('''CREATE TABLE sasaran_lengkap (
                     id INTEGER PRIMARY KEY, bulan_lapor TEXT, tahun_lapor TEXT,
                     nama_dapur TEXT, desa_kelurahan TEXT, alamat_dapur TEXT,
                     kategori_penerima TEXT, nama_penerima TEXT, nama_ayah TEXT, nik_penerima TEXT,
                     kk_penerima TEXT, ttl_penerima TEXT, desa_sasaran TEXT, alamat_sasaran TEXT, wilayah_posyandu TEXT,
                     usia_sasaran TEXT, hamil_ke INTEGER, usia_kehamilan INTEGER, anak_ke INTEGER, berat_badan REAL, tinggi_badan REAL,
                     jenis_kontrasepsi TEXT, input_oleh TEXT, kecamatan TEXT)''')
    else:
        for col in ['tempat_lahir', 'tanggal_lahir', 'nama_anak', 'tempat_lahir_anak', 'tanggal_lahir_anak', 'usia_anak', 'nik_anak', 'kecamatan']:
            if col not in cols: c.execute(f"ALTER TABLE sasaran_lengkap ADD COLUMN {col} TEXT")
    
    # Laporan dapur
    c.execute("PRAGMA table_info(laporan_dapur)")
    cols = [col[1] for col in c.fetchall()]
    if not cols or 'bulan_lapor' not in cols:
        c.execute("DROP TABLE IF EXISTS laporan_dapur")
        c.execute('''CREATE TABLE laporan_dapur (
                     id INTEGER PRIMARY KEY, bulan_lapor TEXT, tahun_lapor TEXT, nama_dapur TEXT, alamat_dapur TEXT,
                     jml_balita INTEGER, jml_baduta INTEGER, jml_bumil INTEGER, jml_busui INTEGER, total_sasaran INTEGER,
                     distribusi_mbg TEXT, frek_distribusi TEXT, frek_sasaran TEXT, frek_makanan_basah TEXT,
                     pemberian_upf TEXT, insentif_kader TEXT, nominal_insentif REAL, jml_anggota_tpk INTEGER, jml_tpk_distribusi INTEGER, jml_kader_lain INTEGER,
                     input_oleh TEXT, kecamatan TEXT)''')
    else:
        for col in ['jml_baduta', 'kecamatan', 'desa_kelurahan']:
            if col not in cols: c.execute(f"ALTER TABLE laporan_dapur ADD COLUMN {col} TEXT")
    
    # Dapur SPPG
    c.execute("PRAGMA table_info(dapur_sppg)")
    cols = [col[1] for col in c.fetchall()]
    if not cols:
        c.execute('''CREATE TABLE IF NOT EXISTS dapur_sppg (
                        id INTEGER PRIMARY KEY AUTOINCREMENT, nama_dapur TEXT, desa_kelurahan TEXT,
                        alamat_lengkap TEXT, penanggung_jawab TEXT, kecamatan TEXT)''')
    elif 'kecamatan' not in cols:
        c.execute("ALTER TABLE dapur_sppg ADD COLUMN kecamatan TEXT")
    
    conn.commit()
    conn.close()

# ==============================================================================
# 4. BAGIAN: Blueprints & Routes
# ==============================================================================
auth_bp = Blueprint('auth', __name__)
main_bp = Blueprint('main', __name__)
kader_bp = Blueprint('kader', __name__)
dapur_bp = Blueprint('dapur', __name__)
rekap_bp = Blueprint('rekap', __name__)
superadmin_bp = Blueprint('superadmin', __name__)

# --- Auth ---
@auth_bp.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'POST':
        username = request.form['username']
        password = request.form['password']
        conn = sqlite3.connect(DB_NAME)
        c = conn.cursor()
        c.execute("SELECT id, username, role, nama_lengkap, foto_profil, kecamatan FROM users WHERE username=? AND password=?", (username, password))
        user = c.fetchone()
        conn.close()
        if user:
            session['logged_in'] = True
            session['user_id'] = user[0]
            session['username'] = user[1]
            session['role'] = user[2]
            session['nama_lengkap'] = user[3]
            session['foto_profil'] = user[4]
            session['kecamatan'] = user[5] if user[5] else 'SEMUA'
            if session['role'] == 'superadmin':
                return redirect(url_for('superadmin.admin_dashboard'))
            return redirect(url_for('main.dashboard_main'))
        else:
            flash('Username atau password salah!', 'error')
            return redirect(url_for('auth.login'))
    return render_template_string(LOGIN_HTML)

@auth_bp.route('/logout')
def logout():
    session.clear()
    flash('Anda telah berhasil keluar.', 'success')
    return redirect(url_for('auth.login'))

@auth_bp.route('/ubah_profil', methods=['POST'])
def ubah_profil_auth():
    if 'username' not in session: return redirect(url_for('auth.login'))
    user_id = session['user_id']
    password_baru = request.form.get('password_baru')
    foto = request.files.get('foto_profil')
    conn = sqlite3.connect(DB_NAME)
    c = conn.cursor()
    if password_baru: c.execute("UPDATE users SET password=? WHERE id=?", (password_baru, user_id))
    if foto and foto.filename != '':
        filename = secure_filename(f"user_{user_id}_{foto.filename}")
        filepath = os.path.join(UPLOAD_FOLDER, filename)
        foto.save(filepath)
        c.execute("UPDATE users SET foto_profil=? WHERE id=?", (filename, user_id))
        session['foto_profil'] = filename
    conn.commit()
    conn.close()
    flash('Profil berhasil diperbarui!', 'success')
    return redirect(request.referrer or url_for('main.dashboard_main'))

# --- Main ---
@main_bp.route('/')
def dashboard_main():
    if not session.get('logged_in'): return redirect('/login')
    role = session.get('role')
    if role == 'superadmin':
        conn = sqlite3.connect(DB_NAME)
        c = conn.cursor()
        c.execute("SELECT COUNT(*) FROM users")
        total_users = c.fetchone()[0]
        try: c.execute("SELECT COUNT(*) FROM dapur_sppg"); total_dapur = c.fetchone()[0]
        except: total_dapur = 0
        conn.close()
        return render_template('superadmin.html', active_page='dashboard', total_users=total_users, total_dapur=total_dapur)
    elif role == 'plkb': return render_template('plkb.html')
    else: return render_template('index.html')

@main_bp.route('/ubah_profil', methods=['POST'])
def ubah_profil_main():
    if not session.get('logged_in'): return redirect('/login')
    username = session['username']
    if 'foto_profil' in request.files:
        file = request.files['foto_profil']
        if file and file.filename:
            filename = secure_filename(f"{username}_{file.filename}")
            upload_folder = current_app.config.get('UPLOAD_FOLDER', 'static/uploads')
            os.makedirs(upload_folder, exist_ok=True)
            filepath = os.path.join(upload_folder, filename)
            file.save(filepath)
            session['foto_profil'] = filename
            conn = sqlite3.connect(DB_NAME)
            c = conn.cursor()
            try: c.execute("UPDATE users SET foto_profil=? WHERE username=?", (filename, username))
            except: c.execute("ALTER TABLE users ADD COLUMN foto_profil TEXT"); c.execute("UPDATE users SET foto_profil=? WHERE username=?", (filename, username))
            conn.commit()
            conn.close()
    password_baru = request.form.get('password_baru')
    if password_baru:
        conn = sqlite3.connect(DB_NAME)
        c = conn.cursor()
        c.execute("UPDATE users SET password=? WHERE username=?", (password_baru, username))
        conn.commit()
        conn.close()
    flash('Profil berhasil diperbarui!', 'success')
    return redirect(request.referrer or '/')

# --- Dapur ---
@dapur_bp.route('/form_dapur')
def form_dapur():
    if not session.get('logged_in'): return redirect('/login')
    conn = sqlite3.connect(DB_NAME); c = conn.cursor()
    try: c.execute("SELECT nama_dapur, alamat_lengkap FROM dapur_sppg ORDER BY nama_dapur ASC"); data_dapur_db = c.fetchall()
    except: data_dapur_db = []
    finally: conn.close()
    return render_template('dapur.html', data_dapur_db=data_dapur_db)

@dapur_bp.route('/tambah_laporan_dapur', methods=['POST'])
def tambah_laporan_dapur():
    data = request.form
    conn = sqlite3.connect(DB_NAME); c = conn.cursor()
    c.execute('''INSERT INTO laporan_dapur VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)''', (
        None, data['bulan_lapor'], data['tahun_lapor'], data['nama_dapur'], data['alamat_dapur'],
        int(data.get('jml_balita',0)), int(data.get('jml_baduta',0)), int(data.get('jml_bumil',0)), int(data.get('jml_busui',0)), int(data.get('total_sasaran',0)),
        data.get('distribusi_mbg'), data.get('frek_distribusi'), data.get('frek_sasaran'), data.get('frek_makanan_basah'),
        data.get('pemberian_upf'), data.get('insentif_kader'), float(data.get('nominal_insentif',0)),
        int(data.get('jml_anggota_tpk',0)), int(data.get('jml_tpk_distribusi',0)), int(data.get('jml_kader_lain',0)),
        session.get('nama_lengkap'), data.get('kecamatan_dapur'), data.get('desa_dapur')
    ))
    conn.commit(); conn.close()
    flash('Laporan Realisasi Dapur berhasil disimpan!', 'success')
    return redirect('/arsip_laporan')

@dapur_bp.route('/hapus_laporan/<int:id>')
def hapus_laporan(id):
    conn = sqlite3.connect(DB_NAME); c = conn.cursor()
    c.execute("DELETE FROM laporan_dapur WHERE id=?", (id,)); conn.commit(); conn.close()
    flash('Laporan dihapus!', 'success'); return redirect('/arsip_laporan')

@dapur_bp.route('/arsip_laporan')
def arsip_laporan():
    if not session.get('logged_in'): return redirect('/login')
    kecamatan_filter = request.args.get('kecamatan',''); desa_filter = request.args.get('desa',''); bulan_filter = request.args.get('bulan',''); tahun_filter = request.args.get('tahun','')
    conn = sqlite3.connect(DB_NAME); c = conn.cursor()
    query = "SELECT id,bulan_lapor,tahun_lapor,nama_dapur,alamat_dapur,jml_balita,jml_baduta,jml_bumil,jml_busui,total_sasaran,distribusi_mbg,pemberian_upf,frek_distribusi,frek_sasaran,frek_makanan_basah,insentif_kader,nominal_insentif,jml_anggota_tpk,jml_tpk_distribusi,jml_kader_lain FROM laporan_dapur WHERE 1=1"
    params = []
    if kecamatan_filter: query += " AND kecamatan=?"; params.append(kecamatan_filter)
    if desa_filter: query += " AND desa_kelurahan=?"; params.append(desa_filter)
    if bulan_filter: query += " AND bulan_lapor=?"; params.append(bulan_filter)
    if tahun_filter: query += " AND tahun_lapor=?"; params.append(tahun_filter)
    query += " ORDER BY id DESC"
    c.execute(query, params); data_laporan = c.fetchall(); conn.close()
    return render_template_string(HTML_TEMPLATE, data_laporan=data_laporan, kecamatan_filter=kecamatan_filter, desa_filter=desa_filter, bulan_filter=bulan_filter, tahun_filter=tahun_filter, active_page='arsip_laporan', page_title='Arsip Laporan Realisasi Dapur')

# --- Kader ---
@kader_bp.route('/form_kader')
def form_kader():
    if not session.get('logged_in'): return redirect('/login')
    conn = sqlite3.connect(DB_NAME); c = conn.cursor()
    try: c.execute("SELECT nama_dapur, desa_kelurahan, alamat_lengkap FROM dapur_sppg ORDER BY nama_dapur ASC"); data_dapur_db = c.fetchall()
    except: data_dapur_db = []
    finally: conn.close()
    return render_template_string(HTML_TEMPLATE, data_dapur_db=data_dapur_db, active_page='form_kader', page_title='Formulir Input BNBA 1000 HPK dan Sasaran B3')

@kader_bp.route('/submit_sasaran', methods=['POST'])
@kader_bp.route('/tambah_sasaran_lengkap', methods=['POST'])
def tambah_sasaran_lengkap():
    data = request.form
    conn = sqlite3.connect(DB_NAME); c = conn.cursor()
    c.execute('''INSERT INTO sasaran_lengkap VALUES (NULL,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)''', (
        data['bulan_lapor'], data['tahun_lapor'], data['nama_dapur'], data['desa_sasaran_wilayah'], data['alamat_dapur'],
        data['kategori_Sasaran'], data['nama_Sasaran'], data['nama_ayah'], data['nik_Sasaran'], data['kk_Sasaran'],
        f"{data.get('tempat_lahir','')}, {data.get('tanggal_lahir','')}".strip(', '), data['desa_sasaran'], data['alamat_sasaran'], data['wilayah_posyandu'],
        data['usia_sasaran'], int(data.get('hamil_ke',0)), int(data.get('usia_kehamilan',0)), int(data.get('anak_ke',0)),
        float(data.get('berat_badan',0)), float(data.get('tinggi_badan',0)), data.get('jenis_kontrasepsi'), session.get('nama_lengkap'),
        data.get('tempat_lahir',''), data.get('tanggal_lahir',''), data.get('nama_anak',''), data.get('tempat_lahir_anak',''),
        data.get('tanggal_lahir_anak',''), data.get('usia_anak',''), data.get('nik_anak',''), data['kecamatan_sasaran']
    ))
    conn.commit(); conn.close()
    flash('Data Sasaran Lengkap (BNBA) berhasil disimpan!', 'success')
    return redirect('/rekapitulasi')

@kader_bp.route('/hapus_sasaran/<int:id>')
def hapus_sasaran(id):
    conn = sqlite3.connect(DB_NAME); c = conn.cursor()
    c.execute("DELETE FROM sasaran_lengkap WHERE id=?", (id,)); conn.commit(); conn.close()
    flash('Data sasaran berhasil dihapus!', 'success')
    return redirect('/rekapitulasi')

@kader_bp.route('/update_sasaran/<int:id>', methods=['POST'])
def update_sasaran(id):
    data = request.form
    conn = sqlite3.connect(DB_NAME); c = conn.cursor()
    c.execute('''UPDATE sasaran_lengkap SET 
                 bulan_lapor=?, tahun_lapor=?, nama_dapur=?, desa_kelurahan=?, alamat_dapur=?, kategori_penerima=?, nama_penerima=?, nama_ayah=?, nik_penerima=?, kk_penerima=?, ttl_penerima=?, desa_sasaran=?, alamat_sasaran=?, wilayah_posyandu=?, usia_sasaran=?, hamil_ke=?, usia_kehamilan=?, anak_ke=?, berat_badan=?, tinggi_badan=?, jenis_kontrasepsi=?, tempat_lahir=?, tanggal_lahir=?, nama_anak=?, tempat_lahir_anak=?, tanggal_lahir_anak=?, usia_anak=?, nik_anak=?, kecamatan=? WHERE id=?''', (
        data['bulan_lapor'], data['tahun_lapor'], data['nama_dapur'], data['desa_kelurahan'], data['alamat_dapur'],
        data['kategori_Sasaran'], data['nama_Sasaran'], data['nama_ayah'], data['nik_Sasaran'], data['kk_Sasaran'],
        f"{data.get('tempat_lahir','')}, {data.get('tanggal_lahir','')}".strip(', '), data['desa_sasaran'], data['alamat_sasaran'], data['wilayah_posyandu'],
        data['usia_sasaran'], int(data.get('hamil_ke',0)), int(data.get('usia_kehamilan',0)), int(data.get('anak_ke',0)),
        float(data.get('berat_badan',0)), float(data.get('tinggi_badan',0)), data.get('jenis_kontrasepsi'),
        data.get('tempat_lahir',''), data.get('tanggal_lahir',''), data.get('nama_anak',''), data.get('tempat_lahir_anak',''),
        data.get('tanggal_lahir_anak',''), data.get('usia_anak',''), data.get('nik_anak',''), data['kecamatan_sasaran'], id
    ))
    conn.commit(); conn.close()
    flash('Data Sasaran berhasil diupdate!', 'success')
    return redirect('/rekapitulasi')

# --- Rekapitulasi ---
@rekap_bp.route('/rekapitulasi')
def rekapitulasi():
    if not session.get('logged_in'): return redirect('/login')
    search_query = request.args.get('q',''); kecamatan_filter = request.args.get('kecamatan',''); desa_filter = request.args.get('desa',''); bulan_filter = request.args.get('bulan',''); tahun_filter = request.args.get('tahun','')
    conn = sqlite3.connect(DB_NAME); c = conn.cursor()
    query = "SELECT * FROM sasaran_lengkap WHERE 1=1"
    params = []
    if search_query: query += " AND (nik_penerima LIKE ? OR nama_penerima LIKE ?)"; params.extend(['%'+search_query+'%']*2)
    if kecamatan_filter: query += " AND kecamatan=?"; params.append(kecamatan_filter)
    if desa_filter: query += " AND desa_sasaran COLLATE NOCASE=?"; params.append(desa_filter)
    if bulan_filter: query += " AND bulan_lapor=?"; params.append(bulan_filter)
    if tahun_filter: query += " AND tahun_lapor=?"; params.append(tahun_filter)
    query += " ORDER BY id DESC"
    c.execute(query, params); data_sasaran = c.fetchall(); conn.close()
    processed = []
    for r in data_sasaran:
        r = list(r)
        ttl = r[11] if r[11] else ""
        if ", " in ttl: tempat, tanggal = ttl.split(", ", 1)
        else: tempat, tanggal = ttl, ""
        r.extend([tempat, tanggal])
        processed.append(r)
    return render_template_string(HTML_TEMPLATE, data=processed, search_query=search_query, kecamatan_filter=kecamatan_filter, desa_filter=desa_filter, bulan_filter=bulan_filter, tahun_filter=tahun_filter, active_page='rekapitulasi', page_title='Rekapitulasi Sasaran 1000 HPK dan B3')

@rekap_bp.route('/rekap_laporan_kader')
def rekap_laporan_kader():
    if not session.get('logged_in'): return redirect('/login')
    kecamatan_filter = request.args.get('kecamatan',''); desa_filter = request.args.get('desa',''); bulan_filter = request.args.get('bulan',''); tahun_filter = request.args.get('tahun','')
    conn = sqlite3.connect(DB_NAME); c = conn.cursor()
    query = """SELECT wilayah_posyandu, 
            SUM(CASE WHEN kategori_penerima='Balita Non-PAUD' THEN 1 ELSE 0 END),
            SUM(CASE WHEN kategori_penerima='Baduta' THEN 1 ELSE 0 END),
            SUM(CASE WHEN kategori_penerima='Ibu Hamil' THEN 1 ELSE 0 END),
            SUM(CASE WHEN kategori_penerima='Ibu Menyusui' THEN 1 ELSE 0 END),
            COUNT(id), bulan_lapor, tahun_lapor FROM sasaran_lengkap WHERE 1=1"""
    params = []
    if kecamatan_filter: query += " AND kecamatan=?"; params.append(kecamatan_filter)
    if desa_filter: query += " AND desa_sasaran COLLATE NOCASE=?"; params.append(desa_filter)
    if bulan_filter: query += " AND bulan_lapor=?"; params.append(bulan_filter)
    if tahun_filter: query += " AND tahun_lapor=?"; params.append(tahun_filter)
    query += " GROUP BY wilayah_posyandu, bulan_lapor, tahun_lapor ORDER BY tahun_lapor DESC, bulan_lapor DESC"
    c.execute(query, params); data_kader = c.fetchall(); conn.close()
    return render_template_string(HTML_TEMPLATE, data_kader=data_kader, kecamatan_filter=kecamatan_filter, desa_filter=desa_filter, bulan_filter=bulan_filter, tahun_filter=tahun_filter, active_page='rekap_laporan_kader', page_title='Rekapitulasi Hasil Input Kader')

# --- Superadmin ---
@superadmin_bp.route('/admin_dashboard')
def admin_dashboard():
    if not session.get('logged_in'): return redirect('/login')
    conn = sqlite3.connect(DB_NAME); c = conn.cursor()
    c.execute("UPDATE users SET is_online=1 WHERE username=?", (session['username'],)); conn.commit()
    c.execute("SELECT COUNT(*) FROM users WHERE is_online=1"); user_online = c.fetchone()[0]
    c.execute("SELECT id, nama_dapur, alamat_lengkap, penanggung_jawab FROM dapur_sppg ORDER BY id DESC"); data_dapur = c.fetchall()
    total_dapur = len(data_dapur); conn.close()
    return render_template_string(HTML_TEMPLATE, active_page='dashboard', page_title='Kontrol Panel', user_online=user_online, total_dapur=total_dapur, data_dapur=data_dapur)

@superadmin_bp.route('/manajemen_akun')
def manajemen_akun():
    conn = sqlite3.connect(DB_NAME); c = conn.cursor()
    c.execute("SELECT id, username, nama_lengkap, role, jenjang_jabatan, kecamatan FROM users ORDER BY id DESC"); data_users = c.fetchall(); conn.close()
    return render_template_string(HTML_TEMPLATE, active_page='manajemen_akun', page_title='Manajemen Akun Pengguna', data_users=data_users)

@superadmin_bp.route('/tambah_akun', methods=['POST'])
def tambah_akun():
    data = request.form
    try:
        conn = sqlite3.connect(DB_NAME); c = conn.cursor()
        c.execute('''INSERT INTO users (username, password, nama_lengkap, role, jenjang_jabatan, kecamatan) VALUES (?,?,?,?,?,?)''', (data['username'], data['password'], data['nama_lengkap'], data['role'], data.get('jenjang_jabatan'), data['kecamatan']))
        conn.commit(); conn.close(); flash('Akun berhasil ditambahkan!', 'success')
    except sqlite3.IntegrityError: flash('Username sudah digunakan!', 'error')
    return redirect('/manajemen_akun')

@superadmin_bp.route('/edit_akun', methods=['POST'])
def edit_akun():
    data = request.form
    conn = sqlite3.connect(DB_NAME); c = conn.cursor()
    try:
        if data.get('password'):
            c.execute("UPDATE users SET username=?, password=?, role=?, jenjang_jabatan=?, kecamatan=? WHERE id=?", (data['username'], data['password'], data['role'], data.get('jenjang_jabatan'), data['kecamatan'], data['id']))
        else:
            c.execute("UPDATE users SET username=?, role=?, jenjang_jabatan=?, kecamatan=? WHERE id=?", (data['username'], data['role'], data.get('jenjang_jabatan'), data['kecamatan'], data['id']))
        conn.commit(); flash('Akun berhasil diperbarui!', 'success')
    except sqlite3.IntegrityError: flash('Update gagal!', 'error')
    finally: conn.close()
    return redirect('/manajemen_akun')

@superadmin_bp.route('/hapus_akun/<int:id>')
def hapus_akun(id):
    conn = sqlite3.connect(DB_NAME); c = conn.cursor(); c.execute("DELETE FROM users WHERE id=?", (id,)); conn.commit(); conn.close()
    flash('Akun dihapus!', 'success'); return redirect('/manajemen_akun')

@superadmin_bp.route('/registrasi_dapur')
def registrasi_dapur():
    conn = sqlite3.connect(DB_NAME); c = conn.cursor()
    c.execute("SELECT id, nama_dapur, desa_kelurahan, alamat_lengkap, penanggung_jawab, kecamatan FROM dapur_sppg ORDER BY id DESC"); data_dapur = c.fetchall(); conn.close()
    return render_template_string(HTML_TEMPLATE, active_page='registrasi_dapur', page_title='Registrasi Dapur SPPG', data_dapur=data_dapur)

@superadmin_bp.route('/tambah_dapur', methods=['POST'])
def tambah_dapur():
    data = request.form
    conn = sqlite3.connect(DB_NAME); c = conn.cursor()
    c.execute('''INSERT INTO dapur_sppg (nama_dapur, desa_kelurahan, alamat_lengkap, penanggung_jawab, kecamatan) VALUES (?,?,?,?,?)''', (data['nama_dapur'], data['desa_kelurahan'], data['alamat_lengkap'], data['penanggung_jawab'], data['kecamatan']))
    conn.commit(); conn.close(); flash('Dapur SPPG didaftarkan!', 'success'); return redirect('/registrasi_dapur')

@superadmin_bp.route('/hapus_dapur/<int:id>')
def hapus_dapur(id):
    conn = sqlite3.connect(DB_NAME); c = conn.cursor(); c.execute("DELETE FROM dapur_sppg WHERE id=?", (id,)); conn.commit(); conn.close()
    flash('Dapur dihapus!', 'success'); return redirect('/registrasi_dapur')

# ==============================================================================
# 5. Inisialisasi Aplikasi
# ==============================================================================
app = Flask(__name__)
app.secret_key = 'mbg3b_rahasia_super_aman'
app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER
app.config['MAX_CONTENT_LENGTH'] = 2 * 1024 * 1024

@app.context_processor
def inject_global_data():
    return dict(DATA_WILAYAH=DATA_WILAYAH)

app.register_blueprint(auth_bp)
app.register_blueprint(main_bp)
app.register_blueprint(kader_bp)
app.register_blueprint(dapur_bp)
app.register_blueprint(rekap_bp)
app.register_blueprint(superadmin_bp)

if __name__ == '__main__':
    # Muat data wilayah dari Excel (tanpa hardcode)
    DATA_WILAYAH = load_data_wilayah()
    auto_fix_db()
    app.run(debug=True, host='0.0.0.0', port=5000)