напиши апи  в виде Html Документа с описание и примерами Json <?php

// Подключение к базе данных
$host = 'localhost';
$db = 'u2812027_books';
$charset = 'utf8mb4';
$user = 'u2812027_mazhar';
$pass = 'strongPasswordReg$@';

$dsn = "mysql:host=$host;dbname=$db;charset=$charset";
$options = [
    PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
    PDO::ATTR_EMULATE_PREPARES   => false,
];

try {
    $pdo = new PDO($dsn, $user, $pass, $options);
} catch (\PDOException $e) {
    http_response_code(500);
    echo json_encode(['status' => 'Database connection failed', 'error' => $e->getMessage()]);
    exit();
}

// Функция для проверки и создания клиента
function checkAndCreateClient($pdo, $client_email) {
    $stmt = $pdo->prepare('SELECT id FROM clients WHERE email = ?');
    $stmt->execute([$client_email]);

    if ($stmt->rowCount() == 0) {
        // Вставляем нового клиента без info_cod
        $stmt = $pdo->prepare('INSERT INTO clients (email) VALUES (?)');
        $stmt->execute([$client_email]);
        return $pdo->lastInsertId();
    } else {
        return $stmt->fetchColumn();
    }
}

// Функция для проверки существования диалога с указанной темой
function checkOrCreateDialog($pdo, $client_id, $topic) {
    $stmt = $pdo->prepare('SELECT id FROM dialogs WHERE client_id = ? AND topic = ?');
    $stmt->execute([$client_id, $topic]);

    if ($stmt->rowCount() == 0) {
        $stmt = $pdo->prepare('INSERT INTO dialogs (client_id, topic) VALUES (?, ?)');
        $stmt->execute([$client_id, $topic]);
        return $pdo->lastInsertId();
    } else {
        return $stmt->fetchColumn();
    }
}

// Функция для добавления сообщения в диалог
function addMessageToDialog($pdo, $dialog_id, $message, $sender) {
    $stmt = $pdo->prepare('INSERT INTO messages (dialog_id, message, sender, is_read) VALUES (?, ?, ?, 0)');
    $stmt->execute([$dialog_id, $message, $sender]);
}

// Функция для получения всех сообщений в диалоге
function getMessagesFromDialog($pdo, $dialog_id) {
    $stmt = $pdo->prepare('SELECT * FROM messages WHERE dialog_id = ? ORDER BY created_at ASC');
    $stmt->execute([$dialog_id]);
    return $stmt->fetchAll();
}

// Функция для получения всех тем диалогов клиента вместе с их ID
function getClientTopics($pdo, $client_email) {
    $stmt = $pdo->prepare('
        SELECT id, topic 
        FROM dialogs 
        WHERE client_id = (SELECT id FROM clients WHERE email = ?)
    ');
    $stmt->execute([$client_email]);
    return $stmt->fetchAll();
}

// Функция для получения info_code из таблицы info
function getInfoCode($pdo) {
    $stmt = $pdo->prepare('SELECT info_code FROM info LIMIT 1');
    $stmt->execute();
    return $stmt->fetchColumn() ?: 'Ожидайте ответа';
}

// Функция для удаления диалога и его сообщений по ID темы
function deleteDialogAndMessages($pdo, $dialog_id) {
    // Сначала удаляем все сообщения, связанные с диалогом
    $stmt = $pdo->prepare('DELETE FROM messages WHERE dialog_id = ?');
    $stmt->execute([$dialog_id]);

    // Затем удаляем сам диалог
    $stmt = $pdo->prepare('DELETE FROM dialogs WHERE id = ?');
    $stmt->execute([$dialog_id]);
}

// Обработка запросов
$method = $_SERVER['REQUEST_METHOD'];

if ($method === 'POST') {
    $data = json_decode(file_get_contents('php://input'), true);

    if (isset($data['client_email'], $data['id_topics'], $data['tools']) && $data['tools'] === 'delet') {
        // Удаление темы и связанных с ней сообщений
        $stmt = $pdo->prepare('
            SELECT d.id 
            FROM dialogs d 
            JOIN clients c ON d.client_id = c.id 
            WHERE c.email = ? AND d.id = ?
        ');
        $stmt->execute([$data['client_email'], $data['id_topics']]);
        $dialog_id = $stmt->fetchColumn();

        if ($dialog_id) {
            deleteDialogAndMessages($pdo, $dialog_id);
            echo json_encode(['status' => 'Dialog and messages deleted']);
        } else {
            echo json_encode(['status' => 'Dialog not found']);
        }
    } elseif (isset($data['client_email'], $data['topic'], $data['message'])) {
        // Проверка и создание клиента, если не существует
        $client_id = checkAndCreateClient($pdo, $data['client_email']);
        // Проверка существования диалога с указанной темой или создание нового
        $dialog_id = checkOrCreateDialog($pdo, $client_id, $data['topic']);
        // Вставка сообщения в найденный или созданный диалог
        addMessageToDialog($pdo, $dialog_id, $data['message'], 'client');
        
        echo json_encode([
            'status' => 'Message sent',
            'dialog_id' => $dialog_id
        ]);

    } elseif (isset($data['client_email']) && empty($data['topic']) && empty($data['message'])) {
        // Получение всех тем диалогов для данного клиента
        $topics = getClientTopics($pdo, $data['client_email']);
        
        // Получение info_code из таблицы info
        $info_code = getInfoCode($pdo);
        
        // Формирование ответа с темами и их ID
        $response = [
            'status' => 'Success',
            'topics' => array_column($topics, 'topic'),
            'infoCod' => $info_code,
            'id_topics' => array_column($topics, 'id')
        ];
        
        echo json_encode($response);
    } else {
        http_response_code(400);
        echo json_encode(['status' => 'Invalid data']);
    }
} elseif ($method === 'GET') {
    if (isset($_GET['dialog_id'])) {
        // Получение всех сообщений по ID диалога
        $messages = getMessagesFromDialog($pdo, $_GET['dialog_id']);
        echo json_encode($messages);
    } elseif (isset($_GET['client_email'])) {
        // Получение всех диалогов клиента
        $stmt = $pdo->prepare('SELECT * FROM dialogs WHERE client_id = (SELECT id FROM clients WHERE email = ?)');
        $stmt->execute([$_GET['client_email']]);
        $dialogs = $stmt->fetchAll();
        echo json_encode($dialogs);
    } else {
        http_response_code(400);
        echo json_encode(['status' => 'Invalid request']);
    }
} else {
    http_response_code(405);
    echo json_encode(['status' => 'Invalid request method']);
}

?>