<?php
// Константы
define('STORAGE_FILE', 'phone_storage.json');
define('EXPIRATION_TIME', 60); // 60 секунд

// Функция для нормализации номера телефона
function normalizePhone($phone) {
    if (empty($phone)) return null;
    
    // Удаляем все нецифровые символы, кроме +
    $phone = preg_replace('/[^0-9+]/', '', $phone);
    
    // Если номер начинается с 8, заменяем на +7
    if (strpos($phone, '8') === 0 && strlen($phone) == 11) {
        $phone = '+7' . substr($phone, 1);
    }
    
    // Если номер начинается с 7 (без +), добавляем +
    if (strpos($phone, '7') === 0 && strlen($phone) == 11 && $phone[0] != '+') {
        $phone = '+' . $phone;
    }
    
    // Убедимся, что номер начинается с +7
    if (strpos($phone, '+7') !== 0) {
        return null;
    }
    
    // Проверяем длину (должно быть 12 символов: +7 и 10 цифр)
    if (strlen($phone) == 12) {
        return $phone;
    }
    
    return null;
}

// Функция для работы с хранилищем
function getStorage() {
    if (!file_exists(STORAGE_FILE)) {
        return ['pending' => [], 'authenticated' => []];
    }
    
    $data = file_get_contents(STORAGE_FILE);
    $storage = json_decode($data, true);
    
    if (!is_array($storage)) {
        return ['pending' => [], 'authenticated' => []];
    }
    
    return $storage;
}

function saveStorage($storage) {
    // Очищаем просроченные данные перед сохранением
    $current_time = time();
    
    foreach ($storage['pending'] as $phone => $timestamp) {
        if ($current_time - $timestamp > EXPIRATION_TIME) {
            unset($storage['pending'][$phone]);
        }
    }
    
    // Очищаем старые авторизации (старше 10 секунд)
    foreach ($storage['authenticated'] as $phone => $timestamp) {
        if ($current_time - $timestamp > 10) {
            unset($storage['authenticated'][$phone]);
        }
    }
    
    file_put_contents(STORAGE_FILE, json_encode($storage, JSON_PRETTY_PRINT));
    return $storage;
}

// Проверяем, это запрос от Asterisk
$isAsteriskRequest = isset($_GET['callerid']) || 
                     (isset($_SERVER['HTTP_USER_AGENT']) && 
                      strpos($_SERVER['HTTP_USER_AGENT'], 'asterisk') !== false);

// Обработка GET запроса с callerid (от Asterisk)
if ($isAsteriskRequest && isset($_GET['callerid'])) {
    $callerid = $_GET['callerid'];
    $normalizedCallerid = normalizePhone($callerid);
    
    header('Content-Type: application/json');
    
    if ($normalizedCallerid) {
        $storage = getStorage();
        $current_time = time();
        
        // Ищем номер среди ожидающих
        if (isset($storage['pending'][$normalizedCallerid])) {
            $timestamp = $storage['pending'][$normalizedCallerid];
            
            // Проверяем, не просрочен ли номер
            if ($current_time - $timestamp <= EXPIRATION_TIME) {
                // Сохраняем в авторизованных
                $storage['authenticated'][$normalizedCallerid] = $current_time;
                
                // Удаляем из ожидающих
                unset($storage['pending'][$normalizedCallerid]);
                
                saveStorage($storage);
                
                // Логируем успешное подтверждение
                error_log("Номер подтвержден Asterisk: $normalizedCallerid");
                
                echo json_encode([
                    'success' => true, 
                    'phone' => $normalizedCallerid,
                    'message' => 'Номер подтвержден'
                ]);
                exit;
            } else {
                // Удаляем просроченный номер
                unset($storage['pending'][$normalizedCallerid]);
                saveStorage($storage);
                error_log("Номер просрочен: $normalizedCallerid");
            }
        } else {
            // Логируем для отладки
            error_log("Номер не найден в ожидающих: $normalizedCallerid");
            error_log("Ожидающие номера: " . implode(', ', array_keys($storage['pending'] ?? [])));
        }
        
        echo json_encode([
            'success' => false, 
            'error' => 'Номер не найден или время истекло'
        ]);
        exit;
    } else {
        echo json_encode([
            'success' => false, 
            'error' => 'Неверный формат номера'
        ]);
        exit;
    }
}

// Обработка AJAX POST запросов от браузера
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['action'])) {
    header('Content-Type: application/json');
    
    $storage = getStorage();
    
    if ($_POST['action'] === 'store_phone') {
        $phone = $_POST['phone'] ?? '';
        $normalizedPhone = normalizePhone($phone);
        
        if ($normalizedPhone) {
            $timestamp = time();
            
            // Сохраняем номер с временной меткой
            $storage['pending'][$normalizedPhone] = $timestamp;
            saveStorage($storage);
            
            // Логируем для отладки
            error_log("Номер сохранен: $phone (нормализован: $normalizedPhone)");
            
            echo json_encode(['success' => true]);
        } else {
            echo json_encode(['success' => false, 'error' => 'Invalid phone number']);
        }
        exit;
    }
    
    if ($_POST['action'] === 'check_auth') {
        $phone = $_POST['phone'] ?? '';
        $normalizedPhone = normalizePhone($phone);
        
        if ($normalizedPhone) {
            // Проверяем, авторизован ли номер в течение последних 5 секунд
            $current_time = time();
            $authenticated = false;
            
            if (isset($storage['authenticated'][$normalizedPhone])) {
                $authTimestamp = $storage['authenticated'][$normalizedPhone];
                
                // Проверяем, что авторизация была не более 10 секунд назад
                if ($current_time - $authTimestamp <= 10) {
                    $authenticated = true;
                    
                    // Удаляем из авторизованных после подтверждения
                    unset($storage['authenticated'][$normalizedPhone]);
                    saveStorage($storage);
                    
                    error_log("Авторизация подтверждена для браузера: $normalizedPhone");
                }
            }
            
            echo json_encode(['authenticated' => $authenticated]);
        } else {
            echo json_encode(['authenticated' => false]);
        }
        exit;
    }
    
    if ($_POST['action'] === 'clear_expired') {
        // Эта функция автоматически вызывается в saveStorage()
        $storage = saveStorage($storage);
        echo json_encode(['success' => true]);
        exit;
    }
    
    if ($_POST['action'] === 'debug_storage') {
        // Для отладки: возвращаем текущее состояние хранилища
        echo json_encode([
            'success' => true,
            'storage' => $storage
        ]);
        exit;
    }
    
    echo json_encode(['success' => false, 'error' => 'Unknown action']);
    exit;
}

// Получаем текущее состояние из параметров URL
$phone = $_GET['phone'] ?? '';
$state = $_GET['state'] ?? 'input'; // input, waiting, timeout, success, goodbye
$countdown = 60;

// Если это не API запрос, отображаем HTML страницу
?>
<!DOCTYPE html>
<html lang="ru">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Регистрация в приложении</title>
    <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
    <style>
        * {
            box-sizing: border-box;
            margin: 0;
            padding: 0;
            font-family: Arial, sans-serif;
        }
        
        body {
            display: flex;
            justify-content: center;
            align-items: center;
            min-height: 100vh;
            background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
            padding: 20px;
        }
        
        .container {
            background: white;
            border-radius: 20px;
            box-shadow: 0 20px 60px rgba(0,0,0,0.3);
            padding: 40px;
            width: 100%;
            max-width: 500px;
            text-align: center;
        }
        
        h1 {
            color: #333;
            margin-bottom: 30px;
            font-size: 24px;
            line-height: 1.4;
        }
        
        .phone-input {
            width: 100%;
            padding: 15px;
            font-size: 18px;
            border: none;
            border-bottom: 3px solid #ccc;
            outline: none;
            text-align: center;
            letter-spacing: 1px;
            transition: border-color 0.3s;
        }
        
        .phone-input.valid {
            border-bottom-color: #4CAF50;
        }
        
        .phone-input.invalid {
            border-bottom-color: #f44336;
        }
        
        .submit-btn {
            margin-top: 30px;
            padding: 15px 40px;
            font-size: 18px;
            background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
            color: white;
            border: none;
            border-radius: 50px;
            cursor: pointer;
            transition: transform 0.3s, box-shadow 0.3s;
        }
        
        .submit-btn:hover {
            transform: translateY(-2px);
            box-shadow: 0 10px 20px rgba(0,0,0,0.2);
        }
        
        .submit-btn:disabled {
            opacity: 0.5;
            cursor: not-allowed;
            transform: none;
            box-shadow: none;
        }
        
        .timer {
            font-size: 48px;
            font-weight: bold;
            color: #333;
            margin: 30px 0;
        }
        
        .call-number {
            font-size: 24px;
            margin: 20px 0;
        }
        
        .call-number a {
            color: #667eea;
            text-decoration: none;
            font-weight: bold;
        }
        
        .call-number a:hover {
            text-decoration: underline;
        }
        
        .buttons {
            display: flex;
            justify-content: center;
            gap: 20px;
            margin-top: 30px;
        }
        
        .btn {
            padding: 12px 30px;
            font-size: 16px;
            border: none;
            border-radius: 50px;
            cursor: pointer;
            transition: all 0.3s;
        }
        
        .btn-yes {
            background: #4CAF50;
            color: white;
        }
        
        .btn-no {
            background: #f44336;
            color: white;
        }
        
        .btn:hover {
            opacity: 0.9;
            transform: translateY(-2px);
        }
        
        .message {
            font-size: 20px;
            color: #333;
            margin: 20px 0;
            line-height: 1.6;
        }
        
        .hidden {
            display: none;
        }
        
        .debug-info {
            margin-top: 20px;
            padding: 10px;
            background: #f5f5f5;
            border-radius: 5px;
            font-size: 12px;
            color: #666;
            text-align: left;
        }
    </style>
</head>
<body>
    <div class="container">
        <?php if ($state === 'input' || $state === ''): ?>
            <h1>Для регистрации в приложении введите свой номер телефона</h1>
            <input type="tel" 
                   id="phoneInput" 
                   class="phone-input" 
                   maxlength="16"
                   placeholder="+7 ___ ___ ____">
            <button id="submitBtn" class="submit-btn" disabled>Отправить запрос</button>
            
        <?php elseif ($state === 'waiting'): ?>
            <h1>Для авторизации в приложении в течение одной минуты сделайте звонок на номер:</h1>
            <div class="call-number">
                <a href="tel:88007000355">8 800 700-03-55</a>
            </div>
            <div class="timer" id="timer">01:00</div>
            <div class="message" id="statusMessage">Ожидаем подтверждения...</div>
            <div class="debug-info" id="debugInfo" style="display: none;">
                <div>Номер: <span id="debugPhone"></span></div>
                <div>Нормализованный: <span id="debugNormalized"></span></div>
                <div>Время: <span id="debugTime"></span></div>
            </div>
            
        <?php elseif ($state === 'timeout'): ?>
            <h1>Время для регистрации вышло. Попробовать ещё раз?</h1>
            <div class="buttons">
                <button class="btn btn-yes" onclick="location.href='index.php?state=input'">Да</button>
                <button class="btn btn-no" onclick="location.href='index.php?state=goodbye'">Нет</button>
            </div>
            
        <?php elseif ($state === 'success'): ?>
            <h1>Добро пожаловать в приложении!</h1>
            <div class="message">Регистрация успешно завершена.</div>
            
        <?php elseif ($state === 'goodbye'): ?>
            <h1>Всего хорошего, до свидания!</h1>
            <div class="message">Будем рады видеть вас снова.</div>
            
        <?php endif; ?>
    </div>

    <script>
        $(document).ready(function() {
            <?php if ($state === 'input' || $state === ''): ?>
                // Инициализация поля ввода телефона
                const phoneInput = $('#phoneInput');
                const submitBtn = $('#submitBtn');
                
                // Устанавливаем начальное значение
                phoneInput.val('+7 ');
                
                // Функция для проверки валидности номера
                function isValidPhoneNumber(value) {
                    // Удаляем все нецифровые символы, кроме +
                    const cleanValue = value.replace(/[^\d+]/g, '');
                    
                    // Проверяем, что:
                    // 1. Начинается с +7
                    // 2. Общая длина цифр 11 (+7 и 10 цифр номера)
                    return cleanValue.startsWith('+7') && cleanValue.replace(/\D/g, '').length === 11;
                }
                
                // Функция для форматирования номера
                function formatPhoneNumber(value) {
                    // Удаляем все, кроме цифр и +
                    let cleanValue = value.replace(/[^\d+]/g, '');
                    
                    // Обеспечиваем начало с +7
                    if (!cleanValue.startsWith('+7')) {
                        cleanValue = '+7' + cleanValue.replace(/^[^7]*/, '').replace('+', '');
                    }
                    
                    // Ограничиваем длину цифр до 11 (код страны + 10 цифр)
                    let digits = cleanValue.replace(/\D/g, '');
                    if (digits.length > 11) {
                        digits = digits.substring(0, 11);
                    }
                    
                    // Форматирование
                    let formatted = '+7';
                    if (digits.length > 1) {
                        const numberPart = digits.substring(1);
                        if (numberPart.length > 0) {
                            formatted += ' ' + numberPart.substring(0, 3);
                        }
                        if (numberPart.length > 3) {
                            formatted += ' ' + numberPart.substring(3, 6);
                        }
                        if (numberPart.length > 6) {
                            formatted += ' ' + numberPart.substring(6, 10);
                        }
                    }
                    
                    return formatted;
                }
                
                // Функция для нормализации номера (как на сервере)
                function normalizePhone(phone) {
                    // Удаляем все нецифровые символы, кроме +
                    let clean = phone.replace(/[^\d+]/g, '');
                    
                    // Если номер начинается с 8, заменяем на +7
                    if (clean.startsWith('8') && clean.length === 11) {
                        clean = '+7' + clean.substring(1);
                    }
                    
                    // Если номер начинается с 7 (без +), добавляем +
                    if (clean.startsWith('7') && clean.length === 11 && !clean.startsWith('+')) {
                        clean = '+' + clean;
                    }
                    
                    return clean;
                }
                
                // Обработчик ввода
                phoneInput.on('input', function(e) {
                    let value = $(this).val();
                    let originalValue = value;
                    
                    // Форматируем номер
                    value = formatPhoneNumber(value);
                    
                    if (value !== originalValue) {
                        $(this).val(value);
                    }
                    
                    // Проверка валидности
                    const isValid = isValidPhoneNumber(value);
                    
                    // Обновляем стиль и состояние кнопки
                    $(this).removeClass('valid invalid');
                    if (isValid) {
                        $(this).addClass('valid');
                        submitBtn.prop('disabled', false);
                    } else {
                        $(this).addClass('invalid');
                        submitBtn.prop('disabled', true);
                    }
                });
                
                // Обработка нажатия клавиш
                phoneInput.on('keydown', function(e) {
                    // Разрешаем: backspace, delete, tab, escape, enter, home, end, стрелки
                    if ([8, 9, 13, 27, 35, 36, 37, 38, 39, 40, 46].includes(e.keyCode)) {
                        return;
                    }
                    
                    // Разрешаем цифры и + (только если его еще нет)
                    const currentValue = $(this).val();
                    
                    // Если пытаемся ввести +, но он уже есть в начале
                    if ((e.keyCode === 107 || e.keyCode === 187) && currentValue.startsWith('+')) {
                        e.preventDefault();
                        return;
                    }
                    
                    // Разрешаем только цифры
                    if ((e.keyCode < 48 || e.keyCode > 57) && (e.keyCode < 96 || e.keyCode > 105)) {
                        e.preventDefault();
                    }
                });
                
                // Обработка вставки из буфера обмена
                phoneInput.on('paste', function(e) {
                    e.preventDefault();
                    const pastedText = (e.originalEvent.clipboardData || window.clipboardData).getData('text');
                    
                    // Очищаем вставленный текст
                    let cleanText = pastedText.replace(/[^\d+]/g, '');
                    
                    // Если текст начинается с 7 или 8, заменяем на +7
                    if (cleanText.startsWith('7')) {
                        cleanText = '+' + cleanText;
                    } else if (cleanText.startsWith('8')) {
                        cleanText = '+7' + cleanText.substring(1);
                    }
                    
                    // Вставляем отформатированный текст
                    const newValue = formatPhoneNumber(cleanText);
                    $(this).val(newValue);
                    
                    // Триггерим событие input для валидации
                    $(this).trigger('input');
                });
                
                // Обработка отправки формы
                submitBtn.on('click', function() {
                    const phone = phoneInput.val();
                    
                    $.ajax({
                        url: 'index.php',
                        method: 'POST',
                        data: {
                            action: 'store_phone',
                            phone: phone
                        },
                        success: function(response) {
                            if (response.success) {
                                // Переходим на страницу ожидания
                                location.href = 'index.php?state=waiting&phone=' + encodeURIComponent(phone);
                            } else {
                                alert('Ошибка: неверный номер телефона');
                            }
                        },
                        error: function() {
                            alert('Ошибка при отправке запроса');
                        }
                    });
                });
                
                // Фокус на поле ввода при загрузке
                phoneInput.focus();
                phoneInput[0].setSelectionRange(phoneInput.val().length, phoneInput.val().length);
                
                // Инициализируем валидацию для начального значения
                phoneInput.trigger('input');
                
            <?php elseif ($state === 'waiting'): ?>
                // Обратный отсчет и проверка авторизации
                const phone = '<?php echo htmlspecialchars($phone, ENT_QUOTES); ?>';
                const normalizedPhone = normalizePhone(phone);
                let timeLeft = <?php echo $countdown; ?>;
                const timerElement = $('#timer');
                const statusMessage = $('#statusMessage');
                const debugInfo = $('#debugInfo');
                const debugPhone = $('#debugPhone');
                const debugNormalized = $('#debugNormalized');
                const debugTime = $('#debugTime');
                
                // Показываем отладочную информацию
                debugPhone.text(phone);
                debugNormalized.text(normalizedPhone);
                debugTime.text(new Date().toLocaleTimeString());
                debugInfo.show();
                
                // Функция для нормализации номера (как на сервере)
                function normalizePhone(phone) {
                    // Удаляем все нецифровые символы, кроме +
                    let clean = phone.replace(/[^\d+]/g, '');
                    
                    // Если номер начинается с 8, заменяем на +7
                    if (clean.startsWith('8') && clean.length === 11) {
                        clean = '+7' + clean.substring(1);
                    }
                    
                    // Если номер начинается с 7 (без +), добавляем +
                    if (clean.startsWith('7') && clean.length === 11 && !clean.startsWith('+')) {
                        clean = '+' + clean;
                    }
                    
                    return clean;
                }
                
                // Функция обновления таймера
                function updateTimer() {
                    const minutes = Math.floor(timeLeft / 60);
                    const seconds = timeLeft % 60;
                    timerElement.text(
                        minutes.toString().padStart(2, '0') + ':' + 
                        seconds.toString().padStart(2, '0')
                    );
                    
                    if (timeLeft <= 0) {
                        clearInterval(countdownInterval);
                        clearInterval(checkInterval);
                        location.href = 'index.php?state=timeout';
                    }
                    
                    timeLeft--;
                    debugTime.text(new Date().toLocaleTimeString());
                }
                
                // Функция проверки авторизации
                function checkAuth() {
                    console.log('Проверка авторизации для номера:', phone, 'нормализованный:', normalizedPhone);
                    
                    $.ajax({
                        url: 'index.php',
                        method: 'POST',
                        data: {
                            action: 'check_auth',
                            phone: phone
                        },
                        success: function(response) {
                            console.log('Ответ от сервера:', response);
                            
                            if (response.authenticated) {
                                clearInterval(countdownInterval);
                                clearInterval(checkInterval);
                                statusMessage.text('Авторизация подтверждена! Перенаправляем...');
                                setTimeout(function() {
                                    location.href = 'index.php?state=success';
                                }, 500);
                            }
                        },
                        error: function(xhr, status, error) {
                            console.log('Ошибка при проверке авторизации:', error);
                        }
                    });
                    
                    // Периодически очищаем просроченные номера
                    if (Math.random() < 0.2) { // Примерно каждый 5-й раз
                        $.ajax({
                            url: 'index.php',
                            method: 'POST',
                            data: {
                                action: 'clear_expired'
                            }
                        });
                    }
                }
                
                // Функция для отладки хранилища
                function debugStorage() {
                    $.ajax({
                        url: 'index.php',
                        method: 'POST',
                        data: {
                            action: 'debug_storage'
                        },
                        success: function(response) {
                            if (response.success && response.storage) {
                                console.log('Хранилище:', response.storage);
                                
                                const pendingCount = Object.keys(response.storage.pending || {}).length;
                                const authCount = Object.keys(response.storage.authenticated || {}).length;
                                
                                console.log(`Ожидающих: ${pendingCount}, Авторизованных: ${authCount}`);
                                
                                // Проверяем, есть ли наш номер в ожидающих
                                if (response.storage.pending && response.storage.pending[normalizedPhone]) {
                                    console.log('Наш номер в ожидающих:', response.storage.pending[normalizedPhone]);
                                }
                                
                                // Проверяем, есть ли наш номер в авторизованных
                                if (response.storage.authenticated && response.storage.authenticated[normalizedPhone]) {
                                    console.log('Наш номер в авторизованных:', response.storage.authenticated[normalizedPhone]);
                                    statusMessage.text('Номер найден в авторизованных!');
                                }
                            }
                        }
                    });
                }
                
                // Запускаем таймер и проверку
                updateTimer(); // Первый вызов
                countdownInterval = setInterval(updateTimer, 1000);
                checkInterval = setInterval(checkAuth, 500); // Проверка каждые 500 мс
                
                // Для отладки: периодически проверяем состояние хранилища
                setInterval(debugStorage, 2000);
                
                // Первая проверка сразу
                setTimeout(checkAuth, 100);
                setTimeout(debugStorage, 500);
                
            <?php endif; ?>
        });
    </script>
</body>
</html>
