<?php
/**
 * Plugin Name:       Pielgrzymka Edukacji Domowej — mapa modlitwy i szkół
 * Plugin URI:        https://pielgrzymkaed.pl
 * Description:       Mapa Polski rozświetlana modlitwą, baza szkół przyjaznych edukacji domowej i formularz zgłaszania nowych. Wstawia się skrótami [ped_mapa], [ped_szkoly], [ped_zglos].
 * Version:           1.0.0
 * Requires at least: 5.8
 * Requires PHP:      7.4
 * Author:            Pielgrzymka Edukacji Domowej
 * License:           GPL-2.0-or-later
 * Text Domain:       pielgrzymka-ed
 *
 * ─────────────────────────────────────────────────────────────────────────────
 * MODUŁ JEST SAMODZIELNY. Nie łączy się z żadnym zewnętrznym serwisem: dane
 * trzyma we własnych tabelach WordPressa, kontury mapy i bazę szkół nosi
 * w plikach obok siebie. Ma to trzy skutki, wszystkie zamierzone:
 *   1. intencje modlitewne pielgrzymki są WŁASNOŚCIĄ pielgrzymki i nie mieszają
 *      się z żadnym cudzym licznikiem;
 *   2. strona działa, gdy dowolny inny serwer ma przerwę;
 *   3. nie ma zapytań na zewnątrz, więc nie ma czego tłumaczyć przy RODO.
 *
 * CO ZAPISUJEMY PRZY ŚWIECY: diecezja, godzina, wylosowany fragment Pisma i —
 * jeśli ktoś ją napisał — jawna intencja. Bez konta, bez adresu IP, bez
 * ciasteczek śledzących. Imię jest nieobowiązkowe.
 *
 * GEOLOKALIZACJA dzieje się w przeglądarce i tam zostaje: współrzędne służą
 * wyłącznie do podpowiedzenia diecezji z listy i nigdzie nie są wysyłane.
 *
 * BAZA SZKÓŁ: 343 pozycji ze wszystkich 16 województw, z przypisaną diecezją.
 * 11 rekordów ma diecezję oznaczoną jako niepewną — są pokazane inaczej
 * i to od nich zaczyna się uzupełnianie bazy. Każdy może zgłosić nową szkołę
 * albo poprawkę do istniejącej; zgłoszenie czeka na zatwierdzenie w kokpicie.
 * ─────────────────────────────────────────────────────────────────────────────
 */

if (!defined('ABSPATH')) { exit; }

define('PED_WERSJA', '1.0.0');
define('PED_KAT', plugin_dir_path(__FILE__));
define('PED_URL', plugin_dir_url(__FILE__));

/* ═══════════════════════════ Instalacja ═════════════════════════════════ */

register_activation_hook(__FILE__, 'ped_instaluj');

function ped_instaluj() {
    global $wpdb;
    $collate = $wpdb->get_charset_collate();
    require_once ABSPATH . 'wp-admin/includes/upgrade.php';

    // Świece modlitwy. Bez pola na adres IP i bez identyfikatora użytkownika —
    // brak tych kolumn jest tu zabezpieczeniem, nie przeoczeniem.
    dbDelta("CREATE TABLE {$wpdb->prefix}ped_swiece (
        id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
        diecezja VARCHAR(8) NOT NULL,
        imie VARCHAR(60) NULL,
        intencja VARCHAR(200) NULL,
        sigla VARCHAR(40) NULL,
        zapalono DATETIME NOT NULL,
        PRIMARY KEY (id),
        KEY diecezja (diecezja),
        KEY zapalono (zapalono)
    ) $collate;");

    // Zgłoszenia szkół: nowe i poprawki do istniejących.
    dbDelta("CREATE TABLE {$wpdb->prefix}ped_zgloszenia (
        id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
        rodzaj VARCHAR(12) NOT NULL DEFAULT 'nowa',
        nazwa VARCHAR(200) NOT NULL,
        miasto VARCHAR(120) NULL,
        adres VARCHAR(200) NULL,
        woj VARCHAR(40) NULL,
        diecezja VARCHAR(8) NULL,
        telefon VARCHAR(40) NULL,
        email VARCHAR(120) NULL,
        www VARCHAR(200) NULL,
        opis TEXT NULL,
        dotyczy VARCHAR(200) NULL,
        zglaszajacy VARCHAR(120) NULL,
        stan VARCHAR(12) NOT NULL DEFAULT 'nowe',
        uwaga_moderatora TEXT NULL,
        utworzono DATETIME NOT NULL,
        rozpatrzono DATETIME NULL,
        PRIMARY KEY (id),
        KEY stan (stan)
    ) $collate;");

    // Szkoły zatwierdzone — startowo zasiane z pliku, potem rosną ze zgłoszeń.
    dbDelta("CREATE TABLE {$wpdb->prefix}ped_szkoly (
        id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
        nazwa VARCHAR(200) NOT NULL,
        miasto VARCHAR(120) NULL,
        adres VARCHAR(200) NULL,
        woj VARCHAR(40) NULL,
        diecezja VARCHAR(8) NULL,
        telefon VARCHAR(40) NULL,
        email VARCHAR(120) NULL,
        www VARCHAR(200) NULL,
        niepewna TINYINT(1) NOT NULL DEFAULT 0,
        zrodlo VARCHAR(60) NULL,
        utworzono DATETIME NOT NULL,
        PRIMARY KEY (id),
        KEY diecezja (diecezja),
        KEY woj (woj)
    ) $collate;");

    ped_zasiej_szkoly();
}

/** Zasiew bazy startowej. Uruchamia się raz — przy powtórnym wywołaniu nie dubluje. */
function ped_zasiej_szkoly() {
    global $wpdb;
    $tab = $wpdb->prefix . 'ped_szkoly';
    if ((int) $wpdb->get_var("SELECT COUNT(*) FROM $tab") > 0) { return; }

    $plik = PED_KAT . 'assets/szkoly.json';
    if (!file_exists($plik)) { return; }
    $dane = json_decode(file_get_contents($plik), true);
    if (empty($dane['szkoly'])) { return; }

    foreach ($dane['szkoly'] as $s) {
        $wpdb->insert($tab, [
            'nazwa'     => $s['nazwa'],
            'miasto'    => $s['miasto'],
            'adres'     => $s['adres'],
            'woj'       => $s['woj'],
            'diecezja'  => $s['kod'],
            'telefon'   => $s['telefon'],
            'email'     => $s['email'],
            'www'       => $s['www'],
            'niepewna'  => !empty($s['niepewna']) ? 1 : 0,
            'zrodlo'    => 'baza FED 1.07.2026',
            'utworzono' => current_time('mysql'),
        ]);
    }
}

/* ═══════════════════════════ Dane pomocnicze ════════════════════════════ */

/* Cięcie tekstu bez zależności od rozszerzenia mbstring. WordPress dokłada
   własne zamienniki mb_substr i mb_strlen, ale nie wszystkich funkcji z tej
   rodziny — nie opieramy się więc na tym, czego na cudzym serwerze może nie być.
   Polskie znaki są w UTF-8 dwubajtowe; ucięcie „na sztywno” rozcięłoby literę. */
function ped_utnij($tekst, $od, $ile) {
    return function_exists('mb_substr')
        ? mb_substr($tekst, $od, $ile, 'UTF-8')
        : preg_replace('/^(.{0,' . (int) $ile . '}).*$/us', '$1', substr($tekst, $od));
}

function ped_dlugosc($tekst) {
    return function_exists('mb_strlen')
        ? mb_strlen($tekst, 'UTF-8')
        : (int) preg_match_all('/./us', $tekst);
}

function ped_json($nazwa) {
    static $bufor = [];
    if (isset($bufor[$nazwa])) { return $bufor[$nazwa]; }
    $p = PED_KAT . 'assets/' . $nazwa . '.json';
    $bufor[$nazwa] = file_exists($p) ? json_decode(file_get_contents($p), true) : null;
    return $bufor[$nazwa];
}

/** Diecezje z konturów + nazwy z bazy szkół — jedno źródło listy wyboru. */
function ped_diecezje() {
    $s = ped_json('szkoly');
    $lista = [];
    foreach (($s['szkoly'] ?? []) as $x) {
        if ($x['kod'] && !isset($lista[$x['kod']])) { $lista[$x['kod']] = $x['diecezja']; }
    }
    asort($lista);
    return $lista;
}

/* Pieśni i obrazy bierzemy z katalogów, a nie z listy wpisanej w kodzie.
   Dorzucenie kolejnego nagrania albo zdjęcia to skopiowanie pliku do
   assets/piesn/ lub assets/madonna/ — bez zaglądania do wtyczki.
   Nazwa pliku staje się podpisem: „granice-dobra.mp3” → „Granice dobra”. */
function ped_zbior($katalog, $wzor) {
    $pliki = glob(PED_KAT . 'assets/' . $katalog . '/' . $wzor, GLOB_BRACE);
    if (!$pliki) { return []; }
    sort($pliki);
    // Właściwe tytuły siedzą w assets/piesn/nazwy.json — nazwa pliku nie może
    // mieć polskich znaków, bo część serwerów je przekręca przy pobieraniu.
    $podpisy = ped_json('piesn/nazwy');
    $lista = [];
    foreach ($pliki as $p) {
        $baza = pathinfo($p, PATHINFO_FILENAME);
        if ($baza === 'nazwy') { continue; }
        $lista[] = [
            'url'   => PED_URL . 'assets/' . $katalog . '/' . rawurlencode(basename($p)),
            'nazwa' => $podpisy[$katalog][$baza] ?? ucfirst(str_replace('-', ' ', $baza)),
        ];
    }
    return $lista;
}

function ped_piesni() { return ped_zbior('piesn', '*.{mp3,ogg,m4a}'); }
function ped_obrazy() { return ped_zbior('madonna', '*.{jpg,jpeg,png,webp}'); }

/** Szkoły pogrupowane po diecezji — pod panel otwierany kliknięciem w mapę. */
function ped_szkoly_wg_diecezji() {
    global $wpdb;
    $w = $wpdb->get_results("SELECT nazwa, miasto, adres, telefon, email, www, diecezja, niepewna
                               FROM {$wpdb->prefix}ped_szkoly
                              WHERE diecezja<>'' ORDER BY miasto, nazwa", ARRAY_A);
    $wg = [];
    foreach ($w as $s) {
        $wg[$s['diecezja']][] = [
            'n' => $s['nazwa'], 'm' => $s['miasto'], 'a' => $s['adres'],
            't' => $s['telefon'], 'e' => $s['email'], 'w' => $s['www'],
            'x' => (int) $s['niepewna'],
        ];
    }
    return $wg;
}

function ped_statystyki() {
    global $wpdb;
    $sw = $wpdb->prefix . 'ped_swiece';
    $sz = $wpdb->prefix . 'ped_szkoly';
    return [
        'swiec'       => (int) $wpdb->get_var("SELECT COUNT(*) FROM $sw"),
        'dzis'        => (int) $wpdb->get_var($wpdb->prepare(
                            "SELECT COUNT(*) FROM $sw WHERE DATE(zapalono)=%s", current_time('Y-m-d'))),
        'diecezji'    => (int) $wpdb->get_var("SELECT COUNT(DISTINCT diecezja) FROM $sw"),
        'zIntencja'   => (int) $wpdb->get_var("SELECT COUNT(*) FROM $sw WHERE intencja<>''"),
        'szkol'       => (int) $wpdb->get_var("SELECT COUNT(*) FROM $sz"),
        'szkolWoj'    => (int) $wpdb->get_var("SELECT COUNT(DISTINCT woj) FROM $sz"),
    ];
}

/* ═══════════════════════════ Zapis: świeca i zgłoszenie ═════════════════ */

add_action('rest_api_init', function () {
    register_rest_route('ped/v1', '/swieca', [
        'methods' => 'POST', 'permission_callback' => '__return_true',
        'callback' => 'ped_zapal_swiece',
    ]);
    register_rest_route('ped/v1', '/zglos', [
        'methods' => 'POST', 'permission_callback' => '__return_true',
        'callback' => 'ped_przyjmij_zgloszenie',
    ]);
    register_rest_route('ped/v1', '/slowo', [
        'methods' => 'POST', 'permission_callback' => '__return_true',
        'callback' => 'ped_kolejne_slowo',
    ]);
    register_rest_route('ped/v1', '/stan', [
        'methods' => 'GET', 'permission_callback' => '__return_true',
        'callback' => function () {
            global $wpdb;
            $sw = $wpdb->prefix . 'ped_swiece';
            $wg = $wpdb->get_results("SELECT diecezja, COUNT(*) ile FROM $sw GROUP BY diecezja", ARRAY_A);
            return ['ok' => true, 'stat' => ped_statystyki(), 'diecezje' => $wg];
        },
    ]);
});

/** Prosty próg czasowy. Świeca to gest modlitwy, nie przycisk do klikania w kółko. */
function ped_prog($klucz, $sekund) {
    $odcisk = 'ped_' . $klucz . '_' . substr(md5(($_SERVER['REMOTE_ADDR'] ?? '') . wp_salt()), 0, 12);
    if (get_transient($odcisk)) { return false; }
    set_transient($odcisk, 1, $sekund);
    return true;
}

/* Losowanie fragmentu Pisma. Można zawęzić do jednego wątku (rodzina, modlitwa,
   droga, wychowanie, maryja) atrybutem watek="…" w skrócie. Nie oddajemy tego
   samego fragmentu dwa razy pod rząd — powtórka w modlitwie czyta się jak
   awaria, nawet gdy jest zwykłym trafem losowania. */
function ped_losuj_fragment($watek, $poprzedni, $dla = '') {
    $pismo = ped_json('pismo')['fragmenty'] ?? [];
    if (!$pismo) { return null; }

    // Prośba kierowana („o słowo dla dzieci”) ma pierwszeństwo przed wątkiem.
    // Gdy dla danej prośby nic nie mamy, wracamy do całości — lepiej dać słowo
    // trochę obok niż nie dać żadnego.
    if ($dla) {
        $pula = array_values(array_filter($pismo, function ($f) use ($dla) {
            return !empty($f['dla']) && in_array($dla, $f['dla'], true);
        }));
        if ($pula) {
            $mozliwe = array_values(array_filter($pula, function ($f) use ($poprzedni) {
                return $f['sigla'] !== $poprzedni;
            }));
            if (!$mozliwe) { $mozliwe = $pula; }
            return $mozliwe[random_int(0, count($mozliwe) - 1)];
        }
    }

    $pula = $watek
        ? array_values(array_filter($pismo, function ($f) use ($watek) { return $f['watek'] === $watek; }))
        : $pismo;
    if (!$pula) { $pula = $pismo; }               // nieznany wątek — bierzemy całość

    $mozliwe = array_values(array_filter($pula, function ($f) use ($poprzedni) {
        return $f['sigla'] !== $poprzedni;
    }));
    if (!$mozliwe) { $mozliwe = $pula; }          // wątek jednoelementowy

    return $mozliwe[random_int(0, count($mozliwe) - 1)];
}

function ped_zapal_swiece(WP_REST_Request $z) {
    if (!wp_verify_nonce($z->get_header('X-WP-Nonce'), 'wp_rest')) {
        return new WP_REST_Response(['ok' => false, 'blad' => 'Odśwież stronę i spróbuj jeszcze raz.'], 403);
    }
    if (!ped_prog('swieca', 30)) {
        return new WP_REST_Response(['ok' => false, 'blad' => 'Twoje światło już się pali. Pobądź przy nim chwilę.'], 429);
    }

    $diecezje = ped_diecezje();
    $kod = strtoupper(preg_replace('/[^A-Za-z]/', '', (string) $z->get_param('diecezja')));
    if (!isset($diecezje[$kod])) {
        return new WP_REST_Response(['ok' => false, 'blad' => 'Wybierz z listy strony, z których idziesz.'], 400);
    }

    $wybor = ped_losuj_fragment(
        sanitize_key((string) $z->get_param('watek')),
        sanitize_text_field((string) $z->get_param('poprzedni'))
    );

    global $wpdb;
    $wpdb->insert($wpdb->prefix . 'ped_swiece', [
        'diecezja' => $kod,
        'imie'     => ped_utnij(sanitize_text_field((string) $z->get_param('imie')), 0, 60),
        'intencja' => ped_utnij(sanitize_text_field((string) $z->get_param('intencja')), 0, 200),
        'sigla'    => $wybor['sigla'] ?? '',
        'zapalono' => current_time('mysql'),
    ]);

    return new WP_REST_Response([
        'ok' => true, 'diecezja' => $diecezje[$kod],
        'fragment' => $wybor, 'stat' => ped_statystyki(),
    ], 200);
}

/* Kolejny fragment na prośbę — bez zapalania drugiej świecy. Kto chce zostać
   przy Piśmie dłużej, nie musi w tym celu mnożyć świateł na mapie. Nic tu nie
   zapisujemy, więc i próg czasowy jest krótszy. */
function ped_kolejne_slowo(WP_REST_Request $z) {
    if (!wp_verify_nonce($z->get_header('X-WP-Nonce'), 'wp_rest')) {
        return new WP_REST_Response(['ok' => false, 'blad' => 'Odśwież stronę i spróbuj jeszcze raz.'], 403);
    }
    if (!ped_prog('slowo', 3)) {
        return new WP_REST_Response(['ok' => false, 'blad' => 'Zatrzymaj się przy tym słowie chwilę dłużej.'], 429);
    }
    return new WP_REST_Response(['ok' => true, 'fragment' => ped_losuj_fragment(
        sanitize_key((string) $z->get_param('watek')),
        sanitize_text_field((string) $z->get_param('poprzedni')),
        sanitize_key((string) $z->get_param('dla'))
    )], 200);
}

function ped_przyjmij_zgloszenie(WP_REST_Request $z) {
    if (!wp_verify_nonce($z->get_header('X-WP-Nonce'), 'wp_rest')) {
        return new WP_REST_Response(['ok' => false, 'blad' => 'Odśwież stronę i spróbuj jeszcze raz.'], 403);
    }
    if (!ped_prog('zglos', 60)) {
        return new WP_REST_Response(['ok' => false, 'blad' => 'Mamy już Twoją wiadomość. Kolejną możesz wysłać za chwilę.'], 429);
    }

    $nazwa = ped_utnij(sanitize_text_field((string) $z->get_param('nazwa')), 0, 200);
    if (ped_dlugosc($nazwa) < 3) {
        return new WP_REST_Response(['ok' => false, 'blad' => 'Napisz choć nazwę szkoły — resztę znajdziemy sami.'], 400);
    }

    global $wpdb;
    $wpdb->insert($wpdb->prefix . 'ped_zgloszenia', [
        'rodzaj'      => $z->get_param('rodzaj') === 'poprawka' ? 'poprawka' : 'nowa',
        'nazwa'       => $nazwa,
        'miasto'      => ped_utnij(sanitize_text_field((string) $z->get_param('miasto')), 0, 120),
        'adres'       => ped_utnij(sanitize_text_field((string) $z->get_param('adres')), 0, 200),
        'woj'         => ped_utnij(sanitize_text_field((string) $z->get_param('woj')), 0, 40),
        'diecezja'    => strtoupper(preg_replace('/[^A-Za-z]/', '', (string) $z->get_param('diecezja'))),
        'telefon'     => ped_utnij(sanitize_text_field((string) $z->get_param('telefon')), 0, 40),
        'email'       => sanitize_email((string) $z->get_param('email')),
        'www'         => esc_url_raw((string) $z->get_param('www')),
        'opis'        => ped_utnij(sanitize_textarea_field((string) $z->get_param('opis')), 0, 2000),
        'dotyczy'     => ped_utnij(sanitize_text_field((string) $z->get_param('dotyczy')), 0, 200),
        'zglaszajacy' => sanitize_email((string) $z->get_param('zglaszajacy')),
        'stan'        => 'nowe',
        'utworzono'   => current_time('mysql'),
    ]);

    // Powiadomienie administratora — zgłoszenie, o którym nikt nie wie, jest
    // tym samym co zgłoszenie niewysłane.
    wp_mail(get_option('admin_email'),
        'Nowe zgłoszenie szkoły — Pielgrzymka ED',
        "Zgłoszono: $nazwa\n\nRozpatrz w kokpicie: " . admin_url('admin.php?page=ped-zgloszenia'));

    return new WP_REST_Response(['ok' => true,
        'komunikat' => 'Dziękujemy. Sprawdzimy i dopiszemy — dzięki Tobie ktoś nie będzie szukał po omacku.'], 200);
}

/* ═══════════════════════════ Skróty ═════════════════════════════════════ */

function ped_zasoby() {
    wp_enqueue_style('ped-mapa', PED_URL . 'assets/pielgrzymka-mapa.css', [], PED_WERSJA);
    wp_enqueue_script('ped-mapa', PED_URL . 'assets/pielgrzymka-mapa.js', [], PED_WERSJA, true);
    wp_localize_script('ped-mapa', 'PED', [
        'rest'     => esc_url_raw(rest_url('ped/v1/')),
        'nonce'    => wp_create_nonce('wp_rest'),
        'kontury'  => PED_URL . 'assets/kontury.json',
        'logo'     => PED_URL . 'assets/logo-pionowe-ciemne.png',
        'diecezje' => ped_diecezje(),
        // Szkoły idą do przeglądarki od razu, a nie osobnym zapytaniem po kliknięciu.
        // To kilkadziesiąt kilobajtów, za to panel otwiera się natychmiast i działa
        // też wtedy, gdy łącze przycięło w połowie czytania.
        'szkolyWg'  => ped_szkoly_wg_diecezji(),
        'obrazyOpisy' => array_column(ped_obrazy(), 'nazwa'),
    ]);
}

/** [ped_mapa] — mapa modlitwy ze świecami, szkołami i statystykami. */
add_shortcode('ped_mapa', function ($a) {
    $a = shortcode_atts([
        'tytul'    => 'Idziemy razem na Jasną Górę',
        'wysokosc' => '540',
        'szkoly'   => 'tak',
        'udostepnianie' => 'tak',
        'watek'    => '',   // pusty = losujemy ze wszystkich pięciu wątków
        'logo'     => 'tak', // "nie" — gdy znak pielgrzymki jest już w nagłówku strony
        'piesn'    => 'tak', // pieśń pod modlitwą; "nie" ją zdejmuje
        'motyw'    => 'ciemny', // "jasny" — wersja bliższa stronie pielgrzymki
        'modlitwa' => 'tak', // modlitwa pielgrzymki pod mapą
    ], $a, 'ped_mapa');

    ped_zasoby();
    global $wpdb;
    $st = ped_statystyki();
    $swiece = $wpdb->get_results(
        "SELECT diecezja, COUNT(*) ile FROM {$wpdb->prefix}ped_swiece GROUP BY diecezja", ARRAY_A);
    $wg = [];
    foreach ($swiece as $s) { $wg[$s['diecezja']] = (int) $s['ile']; }

    $szkoly = [];
    if ($a['szkoly'] !== 'nie') {
        $szkoly = $wpdb->get_results(
            "SELECT diecezja, COUNT(*) ile FROM {$wpdb->prefix}ped_szkoly
              WHERE diecezja<>'' GROUP BY diecezja", ARRAY_A);
    }
    $wgSzkol = [];
    foreach ($szkoly as $s) { $wgSzkol[$s['diecezja']] = (int) $s['ile']; }

    $ostatnie = $wpdb->get_results(
        "SELECT imie, intencja, diecezja, zapalono FROM {$wpdb->prefix}ped_swiece
          WHERE intencja<>'' ORDER BY id DESC LIMIT 8", ARRAY_A);

    ob_start();
    include PED_KAT . 'widok-mapa.php';
    return ob_get_clean();
});

/** [ped_modlitwa] — modlitwa pielgrzymki. */
add_shortcode('ped_modlitwa', function () {
    ped_zasoby();
    ob_start();
    include PED_KAT . 'widok-modlitwa.php';
    return ob_get_clean();
});

/** [ped_piesn] — pieśń do modlitwy z przenikającymi się obrazami. */
add_shortcode('ped_piesn', function ($a) {
    $a = shortcode_atts(['tytul' => 'Zaśpiewajmy razem'], $a, 'ped_piesn');
    ped_zasoby();
    ob_start();
    include PED_KAT . 'widok-piesn.php';
    return ob_get_clean();
});

/** [ped_zglos] — sam formularz zgłoszenia szkoły, do wstawienia osobno. */
add_shortcode('ped_zglos', function ($a) {
    $a = shortcode_atts(['tytul' => 'Powiedz nam o szkole'], $a, 'ped_zglos');
    ped_zasoby();
    ob_start();
    include PED_KAT . 'widok-zglos.php';
    return ob_get_clean();
});

/** [ped_szkoly] — wykaz szkół z wyszukiwaniem, bez mapy. */
add_shortcode('ped_szkoly', function ($a) {
    $a = shortcode_atts(['woj' => '', 'ile' => '0'], $a, 'ped_szkoly');
    ped_zasoby();
    global $wpdb;
    $sql = "SELECT * FROM {$wpdb->prefix}ped_szkoly";
    $par = [];
    if ($a['woj']) { $sql .= ' WHERE woj=%s'; $par[] = $a['woj']; }
    $sql .= ' ORDER BY woj, miasto, nazwa';
    if ((int) $a['ile'] > 0) { $sql .= ' LIMIT ' . (int) $a['ile']; }
    $lista = $par ? $wpdb->get_results($wpdb->prepare($sql, $par), ARRAY_A)
                  : $wpdb->get_results($sql, ARRAY_A);
    ob_start();
    include PED_KAT . 'widok-szkoly.php';
    return ob_get_clean();
});

/* ═══════════════════════════ Kokpit administratora ══════════════════════ */

add_action('admin_menu', function () {
    add_menu_page('Pielgrzymka ED', 'Pielgrzymka ED', 'edit_pages', 'ped-zgloszenia',
        'ped_ekran_zgloszen', 'dashicons-location-alt', 30);
});

function ped_ekran_zgloszen() {
    if (!current_user_can('edit_pages')) { wp_die('Brak uprawnień.'); }
    global $wpdb;
    $tz = $wpdb->prefix . 'ped_zgloszenia';
    $ts = $wpdb->prefix . 'ped_szkoly';

    if (!empty($_POST['ped_akcja']) && check_admin_referer('ped_moderacja')) {
        $id = (int) $_POST['id'];
        $z = $wpdb->get_row($wpdb->prepare("SELECT * FROM $tz WHERE id=%d", $id), ARRAY_A);
        if ($z && $_POST['ped_akcja'] === 'zatwierdz') {
            // Poprawka aktualizuje istniejącą szkołę; zgłoszenie nowej ją dokłada.
            if ($z['rodzaj'] === 'poprawka' && $z['dotyczy']) {
                $wpdb->update($ts, array_filter([
                    'miasto' => $z['miasto'], 'adres' => $z['adres'], 'telefon' => $z['telefon'],
                    'email' => $z['email'], 'www' => $z['www'], 'niepewna' => 0,
                ]), ['nazwa' => $z['dotyczy']]);
            } else {
                $wpdb->insert($ts, [
                    'nazwa' => $z['nazwa'], 'miasto' => $z['miasto'], 'adres' => $z['adres'],
                    'woj' => $z['woj'], 'diecezja' => $z['diecezja'], 'telefon' => $z['telefon'],
                    'email' => $z['email'], 'www' => $z['www'], 'niepewna' => 0,
                    'zrodlo' => 'zgłoszenie', 'utworzono' => current_time('mysql'),
                ]);
            }
            $wpdb->update($tz, ['stan' => 'zatwierdzone', 'rozpatrzono' => current_time('mysql')], ['id' => $id]);
            echo '<div class="notice notice-success"><p>Zatwierdzone — szkoła jest na mapie.</p></div>';
        } elseif ($z && $_POST['ped_akcja'] === 'odrzuc') {
            $wpdb->update($tz, [
                'stan' => 'odrzucone', 'rozpatrzono' => current_time('mysql'),
                'uwaga_moderatora' => sanitize_text_field($_POST['uwaga'] ?? ''),
            ], ['id' => $id]);
            echo '<div class="notice notice-warning"><p>Odrzucone z uzasadnieniem.</p></div>';
        }
    }

    $nowe = $wpdb->get_results("SELECT * FROM $tz WHERE stan='nowe' ORDER BY utworzono", ARRAY_A);
    $st = ped_statystyki();
    include PED_KAT . 'widok-kokpit.php';
}
