<?php

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

function bibldare_dd($data): void
{
    error_log(print_r($data, true));
    die();
}


function bibldare_get_formatted_georgian_date($day_index, $lang, $tz_string = null)
{
    $tz_string = $tz_string ?: get_option('bibldare_bible_timezone', 'Asia/Tbilisi');
    $timezone = new DateTimeZone($tz_string);
    $now = new DateTime('now', $timezone);
    $year = $now->format('Y');

    $date = DateTime::createFromFormat('d.m.Y', '01.01.' . $year, $timezone);

    if ($day_index > 1) {
        $date->modify('+' . ($day_index - 1) . ' days');
    }
    
    $formatter = new IntlDateFormatter(
        $lang === 'geo' ? 'ka_GE' : 'en',
        IntlDateFormatter::FULL,
        IntlDateFormatter::NONE,
        $timezone->getName(),
        IntlDateFormatter::GREGORIAN,
        'EEEE, d MMMM, y'
    );

    return $formatter->format($date);
}


function bibldare_get_today_index($tz_string = null)
{
    $tz_string = $tz_string ?: get_option('bibldare_bible_timezone', 'Asia/Tbilisi');
    $timezone = new DateTimeZone($tz_string);
    $now = new DateTime('now', $timezone);

    return (int) $now->format('z') + 1;
}

function bibldare_fetch_bible_data($url)
{
    $response = wp_remote_get($url, [
        'timeout' => 15,
        'sslverify' => false,
        'headers' => [
            'Referer' => home_url(),
            'User-Agent' => 'WordPress Bible Plugin; ' . home_url()
        ]
    ]);

    if (is_wp_error($response)) {
        return null;
    }

    $response_code = wp_remote_retrieve_response_code($response);
    if ($response_code != 200) {
        return null;
    }

    $body = wp_remote_retrieve_body($response);
    return json_decode($body, true);
}

// Get schedule data from database
function bibldare_get_schedule_data()
{
    $data = get_option('bibldare_schedule_data', null);

    if ($data === null) {
        $data = bibldare_get_default_schedule_data();
        update_option('bibldare_schedule_data', $data);
    }

    return $data;
}

function bibldare_get_bible_books($language = 'eng')
{
    $books = [
        'eng' => [
            1 => 'Genesis',
            2 => 'Exodus',
            3 => 'Leviticus',
            4 => 'Numbers',
            5 => 'Deuteronomy',
            6 => 'Joshua',
            7 => 'Judges',
            8 => 'Ruth',
            9 => '1 Samuel',
            10 => '2 Samuel',
            11 => '1 Kings',
            12 => '2 Kings',
            13 => '1 Chronicles',
            14 => '2 Chronicles',
            15 => 'Ezra',
            16 => 'Nehemiah',
            17 => 'Esther',
            18 => 'Job',
            19 => 'Psalms',
            20 => 'Proverbs',
            21 => 'Ecclesiastes',
            22 => 'Song of Songs',
            23 => 'Isaiah',
            24 => 'Jeremiah',
            25 => 'Lamentations',
            26 => 'Ezekiel',
            27 => 'Daniel',
            28 => 'Hosea',
            29 => 'Joel',
            30 => 'Amos',
            31 => 'Obadiah',
            32 => 'Jonah',
            33 => 'Micah',
            34 => 'Nahum',
            35 => 'Habakkuk',
            36 => 'Zephaniah',
            37 => 'Haggai',
            38 => 'Zechariah',
            39 => 'Malachi',
            40 => 'Matthew',
            41 => 'Mark',
            42 => 'Luke',
            43 => 'John',
            44 => 'Acts',
            45 => 'Romans',
            46 => '1 Corinthians',
            47 => '2 Corinthians',
            48 => 'Galatians',
            49 => 'Ephesians',
            50 => 'Philippians',
            51 => 'Colossians',
            52 => '1 Thessalonians',
            53 => '2 Thessalonians',
            54 => '1 Timothy',
            55 => '2 Timothy',
            56 => 'Titus',
            57 => 'Philemon',
            58 => 'Hebrews',
            59 => 'James',
            60 => '1 Peter',
            61 => '2 Peter',
            62 => '1 John',
            63 => '2 John',
            64 => '3 John',
            65 => 'Jude',
            66 => 'Revelation',
        ],
        'geo' => [
            1 => 'დაბადება',
            2 => 'გამოსვლა',
            3 => 'ლევიანები',
            4 => 'რიცხვნი',
            5 => 'მეორე რჯული',
            6 => 'იესო ნავესი',
            7 => 'მსაჯულნი',
            8 => 'რუთი',
            9 => 'პირველი სამუელი',
            10 => 'მეორე სამუელი',
            11 => 'პირველი მეფეთა',
            12 => 'მეორე მეფეთა',
            13 => 'პირველი ნეშტთა',
            14 => 'მეორე ნეშტთა',
            15 => 'ეზრა',
            16 => 'ნეემია',
            17 => 'ესტერი',
            18 => 'იობი',
            19 => 'ფსალმუნები',
            20 => 'იგავნი',
            21 => 'ეკლესიასტე',
            22 => 'ქებათა ქება',
            23 => 'ესაია',
            24 => 'იერემია',
            25 => 'გოდება იერემიასი',
            26 => 'ეზეკიელი',
            27 => 'დანიელი',
            28 => 'ოსია',
            29 => 'იოველი',
            30 => 'ამოსი',
            31 => 'აბდია',
            32 => 'იონა',
            33 => 'მიქა',
            34 => 'ნაუმი',
            35 => 'ჰაბაკუკი',
            36 => 'სოფონია',
            37 => 'ჰაგაი',
            38 => 'ზაქარია',
            39 => 'მალაქია',
            40 => 'მათე',
            41 => 'მარკოზი',
            42 => 'ლუკა',
            43 => 'იოანე',
            44 => 'საქმეები',
            45 => 'რომაელთა',
            46 => 'კორინთელთა პირველი',
            47 => 'კორინთელთა მეორე',
            48 => 'გალატელთა',
            49 => 'ეფესელთა',
            50 => 'ფილიპელთა',
            51 => 'კოლასელთა',
            52 => 'თესალონიკელთა პირველი',
            53 => 'თესალონიკელთა მეორე',
            54 => 'ტიმოთეს პირველი',
            55 => 'ტიმოთეს მეორე',
            56 => 'ტიტეს',
            57 => 'ფილემონის',
            58 => 'ებრაელთა',
            59 => 'იაკობის',
            60 => 'პეტრეს პირველი',
            61 => 'პეტრეს მეორე',
            62 => 'იოანეს პირველი',
            63 => 'იოანეს მეორე',
            64 => 'იოანეს მესამე',
            65 => 'იუდასი',
            66 => 'გამოცხადება',
        ],
    ];

    return $books[$language] ?? $books['eng'];
}


function bibldare_get_book_name_by_index($bookIndex, $language)
{
    static $books = null;

    if ($books === null) {
        $books = bibldare_get_bible_books($language);
    }

    return $books[$bookIndex] ?? 'Unknown';
}

function bibldare_format_chapters(array $chapters): string
{
    sort($chapters);

    if (count($chapters) === 1) {
        return (string) $chapters[0];
    }

    return $chapters[0] . '–' . end($chapters);
}

// Save schedule data to database
function bibldare_save_schedule_data($data)
{
    return update_option('bibldare_schedule_data', $data);
}

// Get default schedule data
function bibldare_get_default_schedule_data()
{
    // Load from the backup file in plugin directory (read-only)
    $backup_file = plugin_dir_path(BIBLDARE_PLUGIN_PATH) . 'data/data_backup.php';

    if (file_exists($backup_file)) {
        $data = include $backup_file;
        if (is_array($data)) {
            return $data;
        }
    }

    // Fallback: return empty array or basic structure
    return [];
}

function bibldare_validate_and_sanitize_schedule($data)
{
    if (!is_array($data)) {
        return new WP_Error('invalid_root', __('Root must be an array.', 'bibldare'));
    }

    $sanitized = [];


    foreach ($data as $day_key => $day_readings) {
        // ----- Day key -------------------------------------------------
        $day_key = intval($day_key);
        if ($day_key < 1 || $day_key > 366) { // allow leap-year plans
            return new WP_Error(
                'invalid_day',
                sprintf(__('Day %d is out of range (1-366).', 'bibldare'), $day_key)
            );
        }

        if (!is_array($day_readings) || empty($day_readings)) {
            return new WP_Error(
                'empty_day',
                sprintf(__('Day %d has no readings.', 'bibldare'), $day_key)
            );
        }

        $clean_day = [];

        foreach ($day_readings as $reading_idx => $reading) {
            // ----- Reading block ----------------------------------------
            if (!is_array($reading)) {
                return new WP_Error(
                    'invalid_reading',
                    sprintf(__('Reading %d on day %d is not an array.', 'bibldare'), $reading_idx + 1, $day_key)
                );
            }

            // bookIndex – must be int 1-66
            $book_index = isset($reading['bookIndex']) ? intval($reading['bookIndex']) : 0;
            if ($book_index < 1 || $book_index > 66) {
                return new WP_Error(
                    'invalid_book',
                    sprintf(__('Invalid bookIndex %d on day %d.', 'bibldare'), $book_index, $day_key)
                );
            }

            // chapters – must be non-empty array
            if (empty($reading['chapters']) || !is_array($reading['chapters'])) {
                return new WP_Error(
                    'missing_chapters',
                    sprintf(__('No chapters defined for reading %d on day %d.', 'bibldare'), $reading_idx + 1, $day_key)
                );
            }

            $clean_chapters = [];
            foreach ($reading['chapters'] as $chap_idx => $chap) {
                if (!is_array($chap)) {
                    return new WP_Error(
                        'invalid_chapter',
                        sprintf(__('Chapter entry %d on day %d is malformed.', 'bibldare'), $chap_idx + 1, $day_key)
                    );
                }

                // chapter (required int)
                $chapter = isset($chap['chapter']) ? intval($chap['chapter']) : 0;
                if ($chapter < 1) {
                    return new WP_Error(
                        'invalid_chapter_num',
                        sprintf(__('Invalid chapter number %d on day %d.', 'bibldare'), $chapter, $day_key)
                    );
                }

                // from / to – optional int or null
                $from = isset($chap['from']) ? ($chap['from'] === null ? null : intval($chap['from'])) : null;
                $to = isset($chap['to']) ? ($chap['to'] === null ? null : intval($chap['to'])) : null;

                // Basic range sanity (optional – you can tighten per book later)
                if ($from !== null && $from < 1) {
                    $from = null;
                }
                if ($to !== null && $to < 1) {
                    $to = null;
                }

                $clean_chapters[] = [
                    'chapter' => $chapter,
                    'from' => $from,
                    'to' => $to,
                ];
            }

            $clean_day[] = [
                'bookIndex' => $book_index,
                'chapters' => $clean_chapters,
            ];
        }

        $sanitized[$day_key] = $clean_day;
    }

    return $sanitized;
}
