<?php

declare(strict_types=1);

use PHPMailer\PHPMailer\Exception;
use PHPMailer\PHPMailer\PHPMailer;

header('Content-Type: application/json; charset=UTF-8');

require __DIR__ . '/vendor/autoload.php';

if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
    respond(405, false, 'Metodă invalidă. Folosește POST.');
}

$configFile = __DIR__ . '/mail-config.php';

if (!is_file($configFile)) {
    respond(500, false, 'Lipsește fișierul mail-config.php. Copiază mail-config.example.php și completează setările SMTP.');
}

$config = require $configFile;

function respond(int $statusCode, bool $success, string $message): void
{
    http_response_code($statusCode);
    echo json_encode([
        'success' => $success,
        'message' => $message,
    ], JSON_UNESCAPED_UNICODE);
    exit;
}

function post_value(string $key): string
{
    $value = $_POST[$key] ?? '';

    if (!is_string($value)) {
        return '';
    }

    return trim($value);
}

function escape_html(string $value): string
{
    return htmlspecialchars($value, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8');
}

function config_value(array $config, array $path, mixed $default = null): mixed
{
    $value = $config;

    foreach ($path as $segment) {
        if (!is_array($value) || !array_key_exists($segment, $value)) {
            return $default;
        }

        $value = $value[$segment];
    }

    return $value;
}

$requestType = post_value('requestType');
$fullName = post_value('fullName');
$email = post_value('email');
$phone = post_value('phone');
$organization = post_value('organization');
$deadline = post_value('deadline');
$message = post_value('message');
$consent = isset($_POST['consent']) ? 'Da' : 'Nu';

if ($fullName === '' || $email === '' || $message === '' || $consent !== 'Da') {
    respond(422, false, 'Completează câmpurile obligatorii și confirmă consimțământul.');
}

if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
    respond(422, false, 'Adresa de email nu este validă.');
}

$smtpHost = (string) config_value($config, ['mailer', 'host'], '');
$smtpPort = (int) config_value($config, ['mailer', 'port'], 0);
$smtpEncryption = (string) config_value($config, ['mailer', 'encryption'], '');
$smtpAuth = (bool) config_value($config, ['mailer', 'auth'], true);
$smtpUsername = (string) config_value($config, ['mailer', 'username'], '');
$smtpPassword = (string) config_value($config, ['mailer', 'password'], '');
$smtpTimeout = (int) config_value($config, ['mailer', 'timeout'], 15);

$fromEmail = (string) config_value($config, ['message', 'from_email'], '');
$fromName = (string) config_value($config, ['message', 'from_name'], 'Website');
$toEmail = (string) config_value($config, ['message', 'to_email'], '');
$toName = (string) config_value($config, ['message', 'to_name'], '');
$replyToFallback = (string) config_value($config, ['message', 'reply_to_fallback'], $fromEmail);

if ($smtpHost === '' || $smtpPort <= 0 || $fromEmail === '' || $toEmail === '') {
    respond(500, false, 'Configurația SMTP este incompletă. Verifică mail-config.php.');
}

if ($smtpAuth && ($smtpUsername === '' || $smtpPassword === '')) {
    respond(500, false, 'SMTP auth este activ, dar lipsesc username sau parola în mail-config.php.');
}

$subject = sprintf('[Formular site] %s - %s', $requestType !== '' ? $requestType : 'Mesaj general', $fullName);

$fields = [
    'Tip solicitare' => $requestType !== '' ? $requestType : 'Mesaj general',
    'Nume și prenume' => $fullName,
    'Email' => $email,
    'Telefon' => $phone !== '' ? $phone : 'Nespecificat',
    'Publicație / organizație' => $organization !== '' ? $organization : 'Nespecificat',
    'Termen limită' => $deadline !== '' ? $deadline : 'Nespecificat',
    'Consimțământ' => $consent,
    'Mesaj' => nl2br(escape_html($message)),
];

$rows = '';

foreach ($fields as $label => $value) {
    $formattedValue = $label === 'Mesaj' ? $value : escape_html((string) $value);
    $rows .= sprintf(
        '<tr><td style="padding:10px 12px;border:1px solid #d9dde3;font-weight:700;vertical-align:top;">%s</td><td style="padding:10px 12px;border:1px solid #d9dde3;">%s</td></tr>',
        escape_html($label),
        $formattedValue
    );
}

$htmlBody = sprintf(
    '<html><body style="font-family:Arial,sans-serif;color:#142233;background:#f8f6f2;padding:24px;"><h2 style="margin:0 0 16px;">Solicitare nouă din formularul site-ului</h2><table cellspacing="0" cellpadding="0" style="border-collapse:collapse;background:#ffffff;">%s</table></body></html>',
    $rows
);

$plainBody = implode(PHP_EOL, [
    'Solicitare nouă din formularul site-ului',
    '',
    'Tip solicitare: ' . ($requestType !== '' ? $requestType : 'Mesaj general'),
    'Nume și prenume: ' . $fullName,
    'Email: ' . $email,
    'Telefon: ' . ($phone !== '' ? $phone : 'Nespecificat'),
    'Publicație / organizație: ' . ($organization !== '' ? $organization : 'Nespecificat'),
    'Termen limită: ' . ($deadline !== '' ? $deadline : 'Nespecificat'),
    'Consimțământ: ' . $consent,
    '',
    'Mesaj:',
    $message,
]);

try {
    $mailer = new PHPMailer(true);
    $mailer->isSMTP();
    $mailer->Host = $smtpHost;
    $mailer->Port = $smtpPort;
    $mailer->SMTPAuth = $smtpAuth;
    $mailer->Username = $smtpUsername;
    $mailer->Password = $smtpPassword;
    $mailer->Timeout = $smtpTimeout;
    $mailer->CharSet = 'UTF-8';

    if ($smtpEncryption !== '') {
        $mailer->SMTPSecure = $smtpEncryption;
    }

    $mailer->setFrom($fromEmail, $fromName);
    $mailer->addAddress($toEmail, $toName);
    $mailer->addReplyTo($email, $fullName !== '' ? $fullName : $replyToFallback);
    $mailer->Subject = $subject;
    $mailer->isHTML(true);
    $mailer->Body = $htmlBody;
    $mailer->AltBody = $plainBody;

    $mailer->send();
} catch (Exception $exception) {
    respond(500, false, 'SMTP a respins mesajul: ' . $exception->getMessage());
}

respond(
    200,
    true,
    'Mesajul a fost trimis. Solicitările de presă și mesajele urgente sunt prioritizate în ordinea relevanței și a timpului disponibil.'
);
