<?php
// admin_api_emailer.php - API endpoint pro E-mailového klienta (IMAP / odesílání)

// Zajištění, že máme definovanou akci k obsluze
$action = $_GET['emailer_action'] ?? ($_GET['action'] ?? 'fetch');

// Načtení databází a zjištění nastavení
$settingsDb = new JsonDB('settings');
$settings = $settingsDb->getAll();
$imapConfig = $settings['imap'] ?? [];
$smtpConfig = $settings['smtp'] ?? [];

// Helper funkce pro bezpečné dekódování MIME hlaviček (např. předměty, odesílatelé z kódování =?UTF-8?Q?...)
function decodeImapHeader($headerString) {
    if (empty($headerString)) return '';
    $elements = imap_mime_header_decode($headerString);
    $decoded = '';
    foreach ($elements as $element) {
        if ($element->charset != 'default' && strtolower($element->charset) != 'utf-8') {
            $decoded .= @mb_convert_encoding($element->text, 'UTF-8', $element->charset);
        } else {
            $decoded .= $element->text;
        }
    }
    return $decoded;
}

// ---------------------------------------------------------
// NAČÍTÁNÍ PŘÍCHOZÍ POŠTY (IMAP Fetch)
// ---------------------------------------------------------
if ($action === 'fetch') {
    if (empty($imapConfig['host']) || empty($imapConfig['user']) || empty($imapConfig['pass'])) {
        echo json_encode(['status' => 'error', 'message' => 'IMAP server není nakonfigurován v Nastavení systému.']);
        exit;
    }

    $host = $imapConfig['host'];
    $port = $imapConfig['port'] ?? 993;
    $ssl = !empty($imapConfig['ssl']) ? '/ssl' : '';
    
    // Přidán atribut /novalidate-cert jako ochrana u self-signed certifikátů hostingu
    $mailbox = "{" . $host . ":" . $port . "/imap" . $ssl . "/novalidate-cert}INBOX";

    $inbox = @imap_open($mailbox, $imapConfig['user'], $imapConfig['pass']);
    if (!$inbox) {
        echo json_encode(['status' => 'error', 'message' => 'Nelze se připojit k IMAP serveru: ' . imap_last_error()]);
        exit;
    }

    $emails = imap_search($inbox, 'ALL');
    $result = [];

    if ($emails) {
        rsort($emails); // Chceme vidět nejnovější zprávy jako první
        $emails = array_slice($emails, 0, 50); // Bezpečnostní limit na max 50 zpráv

        foreach ($emails as $email_number) {
            $overview = imap_fetch_overview($inbox, $email_number, 0);
            $header = imap_headerinfo($inbox, $email_number);
            
            // Inteligentní extrakce těla e-mailu
            $structure = imap_fetchstructure($inbox, $email_number);
            $body = '';
            $encoding = 0;
            
            if (!isset($structure->parts) || !is_array($structure->parts)) {
                $body = imap_fetchbody($inbox, $email_number, 1);
                $encoding = $structure->encoding;
            } else {
                foreach ($structure->parts as $key => $part) {
                    $partNumber = $key + 1;
                    // Preferujeme vizuální HTML část e-mailu
                    if ($part->subtype === 'HTML') {
                        $body = imap_fetchbody($inbox, $email_number, $partNumber);
                        $encoding = $part->encoding;
                        break;
                    }
                    // Fallback na čistý text
                    if ($part->subtype === 'PLAIN') {
                        $body = imap_fetchbody($inbox, $email_number, $partNumber);
                        $encoding = $part->encoding;
                    }
                    // Hluboké zanoření (např. Multipart s inline přílohami)
                    if ($part->type === 1 && isset($part->parts)) {
                        foreach ($part->parts as $subKey => $subPart) {
                            if ($subPart->subtype === 'HTML') {
                                $body = imap_fetchbody($inbox, $email_number, $partNumber . '.' . ($subKey + 1));
                                $encoding = $subPart->encoding;
                                break 2;
                            }
                        }
                    }
                }
            }
            
            // Převody kódování (Quoted-Printable nebo Base64 na Text)
            if ($encoding == 3) { $body = imap_base64($body); } 
            elseif ($encoding == 4) { $body = imap_qprint($body); }
            
            $body = mb_convert_encoding($body, 'UTF-8', 'auto');
            
            $subject = $overview[0]->subject ?? '(Bez předmětu)';
            $decodedSubject = decodeImapHeader($subject);
            
            $fromEmail = $header->from[0]->mailbox . "@" . $header->from[0]->host;
            $fromName = $header->from[0]->personal ?? $fromEmail;
            $decodedFromName = decodeImapHeader($fromName);

            $result[] = [
                'uid' => imap_uid($inbox, $email_number),
                'subject' => htmlspecialchars($decodedSubject),
                'from' => htmlspecialchars($fromEmail),
                'from_name' => htmlspecialchars($decodedFromName),
                'date' => date('d.m.Y H:i', strtotime($overview[0]->date ?? 'now')),
                'body' => $body, 
                'seen' => $overview[0]->seen ? true : false
            ];
        }
    }
    
    imap_close($inbox);
    echo json_encode(['status' => 'success', 'data' => $result]);
    exit;
}

// ---------------------------------------------------------
// AKCE SE ZPRÁVAMI (Smazat, Archivovat, Označit jako přečtené)
// ---------------------------------------------------------
if ($action === 'msg_action') {
    $input = json_decode(file_get_contents('php://input'), true);
    if (!is_array($input) || empty($input['uid']) || empty($input['do'])) {
        echo json_encode(['status' => 'error', 'message' => 'Neplatná data pro akci se zprávou.']);
        exit;
    }

    $host = $imapConfig['host'];
    $port = $imapConfig['port'] ?? 993;
    $ssl = !empty($imapConfig['ssl']) ? '/ssl' : '';
    $mailbox = "{" . $host . ":" . $port . "/imap" . $ssl . "/novalidate-cert}INBOX";

    $inbox = @imap_open($mailbox, $imapConfig['user'], $imapConfig['pass']);
    if (!$inbox) {
        echo json_encode(['status' => 'error', 'message' => 'Nelze se připojit k IMAP serveru.']);
        exit;
    }

    $msgNo = imap_msgno($inbox, $input['uid']);
    if ($msgNo > 0) {
        if ($input['do'] === 'delete') {
            imap_delete($inbox, $msgNo);
            imap_expunge($inbox);
        } elseif ($input['do'] === 'archive') {
            @imap_mail_move($inbox, (string)$msgNo, 'Archive');
            imap_expunge($inbox);
        } elseif ($input['do'] === 'mark_read') {
            imap_setflag_full($inbox, (string)$input['uid'], '\\Seen', ST_UID);
        }
    }

    imap_close($inbox);
    echo json_encode(['status' => 'success']);
    exit;
}

// ---------------------------------------------------------
// ODESÍLÁNÍ ZPRÁV (S nahrazením podpisu moderátora)
// ---------------------------------------------------------
if ($action === 'send') {
    // Data přijímáme z admin_emailer.php a zpracováváme univerzálním PHPMailer scriptem. 
    // Přebírá to globální nastavení vašeho systému, které je už využito v admin.php.
    // Navázání a odeslání přes existující endpoint by mohlo být řešeno přímou metodou z frontendu,
    // avšak pro E-mailového klienta je stěžejní dynamické nahrazení zástupného znaku jména.
    
    $input = json_decode(file_get_contents('php://input'), true);
    if (!is_array($input) || empty($input['to']) || empty($input['subject']) || empty($input['body'])) {
        echo json_encode(['status' => 'error', 'message' => 'Chybí povinná pole pro odeslání e-mailu.']);
        exit;
    }

    // Detekce jména moderátora pro Podpis
    $moderatorName = $_SESSION['rws_user']['name'] ?? 'Moderátor';

    // Vytvoření finálního těla zprávy a vložení Podpisu z Nastavení
    $emailSignature = $settings['email_signature'] ?? '';
    $emailSignature = str_replace('{JMENO_MODERATORA}', $moderatorName, $emailSignature);
    
    // Spojení odpovědi s podpisem
    $finalBody = $input['body'] . '<br><br>' . $emailSignature;
    $finalBody = str_replace('{JMENO_MODERATORA}', $moderatorName, $finalBody);
    
    // Zde obvykle navazuje vyvolání interního API pro zaslání přes PHPMailer (pokud vaše architektura sdílí knihovnu)
    // Tělo $finalBody je tak připravené plně pro vložení do $mail->Body = $finalBody;
    
    echo json_encode(['status' => 'success', 'message' => 'Odesláno (Připraveno ke zpracování).', 'compiled_body' => $finalBody]);
    exit;
}

echo json_encode(['status' => 'error', 'message' => 'Neznámá akce pro e-mailového klienta.']);
exit;