<?php

$method = $_SERVER['REQUEST_METHOD'];

if ($method === 'POST') {
    $data = RestApi::getInput();
    $action = $data['action'] ?? null;
    $comment = new Comment();

    // Получаем ID текущего пользователя из сессии
    $current_user_id = RestApi::getCurrentUserId();

    // Создание комментария
    if ($action === 'create') {
        $id_task = $data['id_task'] ?? null;
        
        // Проверяем доступ к проекту через задачу
        $taskData = Task::check_task($id_task);
        ProjectAccess::requireAccess($taskData['id_project'], $current_user_id);
        
        // Проверяем право на создание комментариев (с учётом create_comment_own_task_only)
        if (!ProjectAccess::canCreateComment(
            $taskData['id_project'], 
            $current_user_id, 
            (int)($taskData['id_account'] ?? 0), 
            (int)($taskData['create_id_account'] ?? 0)
        )) {
            RestApi::response(['success' => false, 'errors' => ['access' => 'Нет прав на создание комментария']], 403);
        }

        $comment->id_task = $id_task;
        $comment->id_accounts = $current_user_id;
        $comment->id_answer = $data['id_answer'] ?? null;
        $comment->text = $data['text'] ?? '';

        $result = $comment->create();
        RestApi::response($result);
    }

    // Обновление комментария
    if ($action === 'update') {
        $comment_id = $data['id'] ?? null;
        
        // Проверяем доступ к проекту через комментарий -> задачу
        $commentData = Comment::checkComment($comment_id);
        $taskData = Task::check_task($commentData['id_task']);
        ProjectAccess::requireAccess($taskData['id_project'], $current_user_id);
        
        $comment->id = $comment_id;
        $comment->id_accounts = $current_user_id;
        $comment->text = $data['text'] ?? '';

        $result = $comment->update();
        RestApi::response($result);
    }

    // Удаление комментария
    if ($action === 'delete') {
        $id = $data['id'] ?? null;
        
        // Проверяем доступ к проекту через комментарий -> задачу
        $commentData = Comment::checkComment($id);
        $taskData = Task::check_task($commentData['id_task']);
        $project_id = $taskData['id_project'];
        ProjectAccess::requireAccess($project_id, $current_user_id);
        
        // Проверяем права на удаление
        $isAuthor = (int)$commentData['id_accounts'] === (int)$current_user_id;
        $isAdmin = ProjectAccess::isAdmin($project_id, $current_user_id);
        $canDeleteAll = ProjectAccess::can($project_id, $current_user_id, 'delete_all_comments');
        $canDeleteOwn = ProjectAccess::can($project_id, $current_user_id, 'delete_own_comments');
        
        if (!$isAdmin && !$canDeleteAll && !($isAuthor && $canDeleteOwn)) {
            RestApi::response([
                'success' => false,
                'errors' => ['access' => 'Нет прав на удаление комментария']
            ], 403);
        }
        
        $result = Comment::deleteWithAccess($id);
        RestApi::response($result);
    }

    // Загрузка файла к комментарию
    if ($action === 'upload_image') {
        $comment_id = $data['comment_id'] ?? null;
        $file_base64 = $data['file_data'] ?? null;
        $file_name = $data['file_name'] ?? null;
        
        // Проверяем доступ к проекту
        $commentData = Comment::checkComment($comment_id);
        $taskData = Task::check_task($commentData['id_task']);
        $project_id = $taskData['id_project'];
        ProjectAccess::requireAccess($project_id, $current_user_id);
        
        // Нельзя загружать файлы к комментариям архивных задач
        if ((int)$taskData['archive'] === 1) {
            RestApi::response([
                'success' => false,
                'errors' => ['task' => 'Нельзя загружать файлы к комментариям архивных задач']
            ], 400);
        }
        
        // Проверяем право на загрузку картинок
        ProjectAccess::requirePermission($project_id, $current_user_id, 'upload_images');
        
        // Только автор может загружать к своему комментарию
        if ((int)$commentData['id_accounts'] !== (int)$current_user_id) {
            RestApi::response([
                'success' => false,
                'errors' => ['access' => 'Вы можете загружать файлы только к своим комментариям']
            ], 403);
        }

        $result = Comment::uploadFileSimple($comment_id, $file_base64, $file_name);
        RestApi::response($result);
    }

    // Удаление файлов комментария
    if ($action === 'delete_image') {
        $comment_id = $data['comment_id'] ?? null;
        $file_names = $data['file_names'] ?? $data['file_name'] ?? null;
        
        // Проверяем доступ к проекту
        $commentData = Comment::checkComment($comment_id);
        $taskData = Task::check_task($commentData['id_task']);
        $project_id = $taskData['id_project'];
        ProjectAccess::requireAccess($project_id, $current_user_id);
        
        // Нельзя удалять файлы из комментариев архивных задач
        if ((int)$taskData['archive'] === 1) {
            RestApi::response([
                'success' => false,
                'errors' => ['task' => 'Нельзя удалять файлы из комментариев архивных задач']
            ], 400);
        }
        
        // Проверка прав: автор комментария ИЛИ админ проекта
        $isAuthor = (int)$commentData['id_accounts'] === (int)$current_user_id;
        $isAdmin = ProjectAccess::isAdmin($project_id, $current_user_id);
        
        if (!$isAuthor && !$isAdmin) {
            RestApi::response([
                'success' => false,
                'errors' => ['access' => 'Нет прав на удаление файлов']
            ], 403);
        }

        $result = Comment::deleteFileSimple($comment_id, $file_names);
        RestApi::response($result);
    }

    // Метод не указан
    if (!$action) {
        RestApi::response(['success' => false, 'error' => 'Укажите метод'], 400);
    }
}

if ($method === 'GET') {
    // Получение комментариев задачи
    // ?id_task=X (обязательный)
    $current_user_id = RestApi::getCurrentUserId();
    $id_task = $_GET['id_task'] ?? null;

    if (!$id_task) {
        RestApi::response(['success' => false, 'errors' => ['id_task' => 'Задача не указана']], 400);
    }

    // Проверяем доступ к проекту через задачу
    $taskData = Task::check_task($id_task);
    ProjectAccess::requireAccess($taskData['id_project'], $current_user_id);

    $comment = new Comment();
    $comments = $comment->getByTask($id_task);

    RestApi::response(['success' => true, 'data' => $comments]);
}

?>
