package com.grigowashere.aismap.controllers;

import android.content.Context;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;

import com.grigowashere.aismap.models.AISVessel;
import com.grigowashere.aismap.models.Vessel;
import com.grigowashere.aismap.utils.SettingsManager;

import java.util.List;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;

import static org.junit.Assert.*;
//import static org.mockito.Mockito.*;

/**
 * Тест для проверки исправления ConcurrentModificationException в AppCoordinator
 */
//@RunWith(MockitoJUnitRunner.class)
//public class AppCoordinatorConcurrencyTest {
//
//    @Mock
//    private Context mockContext;
//
//    @Mock
//    private SettingsManager mockSettingsManager;
//
//    private AppCoordinator appCoordinator;
//
//    @Before
//    public void setUp() {
//        when(mockContext.getApplicationContext()).thenReturn(mockContext);
//        appCoordinator = new AppCoordinator(mockContext);
//    }
//
//    @Test
//    public void testGetNearbyVesselsConcurrency() throws InterruptedException {
//        // Создаем несколько AIS судов для тестирования
//        AISVessel vessel1 = new AISVessel();
//        vessel1.setMmsi("123456789");
//        vessel1.setLatitude(55.7558);
//        vessel1.setLongitude(37.6176);
//
//        AISVessel vessel2 = new AISVessel();
//        vessel2.setMmsi("987654321");
//        vessel2.setLatitude(55.7559);
//        vessel2.setLongitude(37.6177);
//
//        // Добавляем суда
//        appCoordinator.onAISVesselChanged(vessel1);
//        appCoordinator.onAISVesselChanged(vessel2);
//
//        // Устанавливаем собственное судно
//        Vessel ownVessel = new Vessel();
//        ownVessel.setLatitude(55.7558);
//        ownVessel.setLongitude(37.6176);
//        appCoordinator.onOwnVesselChanged(ownVessel);
//
//        int threadCount = 10;
//        int iterationsPerThread = 100;
//        CountDownLatch latch = new CountDownLatch(threadCount);
//        ExecutorService executor = Executors.newFixedThreadPool(threadCount);
//
//        // Запускаем несколько потоков, которые одновременно вызывают getNearbyVessels
//        // и модифицируют коллекцию aisVessels
//        for (int i = 0; i < threadCount; i++) {
//            final int threadId = i;
//            executor.submit(() -> {
//                try {
//                    for (int j = 0; j < iterationsPerThread; j++) {
//                        // Вызываем getNearbyVessels через onCompassChanged
//                        appCoordinator.onCompassChanged(0.0f);
//
//                        // Добавляем новое судно
//                        AISVessel newVessel = new AISVessel();
//                        newVessel.setMmsi("thread" + threadId + "_vessel" + j);
//                        newVessel.setLatitude(55.7558 + (j * 0.001));
//                        newVessel.setLongitude(37.6176 + (j * 0.001));
//                        appCoordinator.onAISVesselChanged(newVessel);
//
//                        // Небольшая задержка для увеличения вероятности race condition
//                        Thread.sleep(1);
//                    }
//                } catch (Exception e) {
//                    fail("ConcurrentModificationException не должна возникать: " + e.getMessage());
//                } finally {
//                    latch.countDown();
//                }
//            });
//        }
//
//        // Ждем завершения всех потоков
//        boolean finished = latch.await(30, TimeUnit.SECONDS);
//        executor.shutdown();
//
//        assertTrue("Тест не завершился в течение 30 секунд", finished);
//
//        // Проверяем, что метод getAISVessels работает корректно
//        List<AISVessel> vessels = appCoordinator.getAISVessels();
//        assertNotNull("Список судов не должен быть null", vessels);
//        assertTrue("Должно быть добавлено несколько судов", vessels.size() > 0);
//    }
//}
