<?php
session_start();

if (empty($_SESSION['csrf_token'])) {
    $_SESSION['csrf_token'] = bin2hex(random_bytes(32));
}

if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['ajax'])) {
    header('Content-Type: application/json');
    $response = ['success' => false, 'message' => ''];

    $csrf_token = $_POST['csrf_token'] ?? '';
    if (!hash_equals($_SESSION['csrf_token'], $csrf_token)) {
        $response['message'] = 'Ошибка безопасности. Обновите страницу и попробуйте снова.';
        echo json_encode($response);
        exit;
    }

    $ip = $_SERVER['REMOTE_ADDR'];
    $rateKey = 'rate_' . md5($ip);
    $now = time();
    $rateData = $_SESSION[$rateKey] ?? ['count' => 0, 'first' => $now];
    if ($now - $rateData['first'] > 60) {
        $rateData = ['count' => 0, 'first' => $now];
    }
    $rateData['count']++;
    $_SESSION[$rateKey] = $rateData;
    if ($rateData['count'] > 3) {
        $response['message'] = 'Слишком много запросов. Попробуйте через минуту.';
        echo json_encode($response);
        exit;
    }

    $name = trim($_POST['name'] ?? '');
    $phone = trim($_POST['phone'] ?? '');
    $message = trim($_POST['message'] ?? '');
    $agree = isset($_POST['agree']);

    if (!preg_match('/^[a-zA-Zа-яА-Я\s]{1,25}$/u', $name)) {
        $response['message'] = 'Имя должно содержать только буквы и пробелы, до 25 символов.';
        echo json_encode($response);
        exit;
    }
    if (!preg_match('/^8\s\(\d{3}\)\s\d{3}-\d{2}-\d{2}$/', $phone)) {
        $response['message'] = 'Введите корректный номер телефона.';
        echo json_encode($response);
        exit;
    }
    if ($message !== '' && !preg_match('/^.{1,500}$/u', $message)) {
        $response['message'] = 'Сообщение не должно превышать 500 символов.';
        echo json_encode($response);
        exit;
    }
    if (!$agree) {
        $response['message'] = 'Необходимо согласиться с обработкой данных.';
        echo json_encode($response);
        exit;
    }

    $dateTime = date('d.m.Y H:i:s');
    $serviceTitle = trim($_POST['service'] ?? '');
    $subject = SITE_MAIL_SUBJECT_PREFIX;
    if ($serviceTitle !== '') {
        $subject .= ' (' . $serviceTitle . ')';
    }
    $subject .= ' — ' . $dateTime;

    $body = "Услуга: " . ($serviceTitle !== '' ? $serviceTitle : 'Главная страница') . "\n";
    $body .= "Имя: " . strip_tags($name) . "\n";
    $body .= "Телефон: " . strip_tags($phone) . "\n";
    $body .= "Сообщение: " . strip_tags($message) . "\n";
    $body .= "Согласие на обработку данных: Да\n";
    $body .= "Страница: " . ($_SERVER['HTTP_REFERER'] ?? 'неизвестно') . "\n";

    $headers = "From: " . SITE_MAIL_FROM . "\r\n";
    $headers .= "Reply-To: " . SITE_MAIL_FROM . "\r\n";
    $headers .= "Content-Type: text/plain; charset=UTF-8\r\n";

    $mailSent = mail(SITE_MAIL_TO, $subject, $body, $headers);

    if ($mailSent) {
        $response['success'] = true;
        $response['message'] = 'Спасибо! Ваша заявка отправлена. Мы свяжемся с вами в ближайшее время.';
    } else {
        $response['message'] = 'Ошибка при отправке. Пожалуйста, попробуйте ещё раз.';
    }
    echo json_encode($response);
    exit;
}
