package com.grigowashere.aismap;

import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.view.View;

import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.lifecycle.Observer;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import com.grigowashere.aismap.data.Repository;
import com.grigowashere.aismap.data.entity.AISVesselEntity;
import com.grigowashere.aismap.data.entity.VesselEntity;

import java.util.ArrayList;
import java.util.List;

public class AisTargetsActivity extends AppCompatActivity implements AisTargetsAdapter.OnItemClickListener {

    private Repository repository;
    private RecyclerView recyclerView;
    private AisTargetsAdapter adapter;
    private android.os.Handler tickerHandler;
    private Runnable tickerRunnable;
    private android.widget.TextView textEmptyState;
    private android.widget.TextView textTargetCount;
    
    // Данные нашего корабля
    private double ourLatitude = 0;
    private double ourLongitude = 0;
    private double ourCourse = 0;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_ais_targets);

        repository = new Repository(this);

        // Загружаем данные нашего корабля
        loadOurVesselData();

        recyclerView = findViewById(R.id.recycler_ais_targets);
        textEmptyState = findViewById(R.id.text_empty_state);
        textTargetCount = findViewById(R.id.text_target_count);
        recyclerView.setLayoutManager(new LinearLayoutManager(this));
        adapter = new AisTargetsAdapter(new ArrayList<>(), this);
        recyclerView.setAdapter(adapter);

        repository.observeAllAIS().observe(this, new Observer<List<AISVesselEntity>>() {
            @Override
            public void onChanged(List<AISVesselEntity> entities) {
                // Стабильная сортировка по MMSI для предсказуемого порядка
                if (entities != null) {
                    java.util.Collections.sort(entities, (a, b) -> a.mmsi.compareTo(b.mmsi));
                }
                adapter.submitList(entities);
                
                // Обновляем данные нашего корабля в адаптере
                adapter.updateOurVesselData(ourLatitude, ourLongitude, ourCourse);
                
                // Обновляем счетчик целей
                int targetCount = entities != null ? entities.size() : 0;
                textTargetCount.setText("AIS цели: " + targetCount);
                
                // Показываем/скрываем сообщение о пустом состоянии
                if (entities == null || entities.isEmpty()) {
                    textEmptyState.setVisibility(android.view.View.VISIBLE);
                    recyclerView.setVisibility(android.view.View.GONE);
                } else {
                    textEmptyState.setVisibility(android.view.View.GONE);
                    recyclerView.setVisibility(android.view.View.VISIBLE);
                }
            }
        });

        // Тикер для обновления поля "N сек назад"
        tickerHandler = new android.os.Handler(android.os.Looper.getMainLooper());
        tickerRunnable = new Runnable() {
            @Override
            public void run() {
                try {
                    // Обновляем только элементы с данными, чтобы избежать мигания
                    int itemCount = adapter.getItemCount();
                    for (int i = 0; i < itemCount; i++) {
                        adapter.notifyItemChanged(i, "time_update");
                    }
                } finally {
                    tickerHandler.postDelayed(this, 1000);
                }
            }
        };
        tickerHandler.postDelayed(tickerRunnable, 1000);
    }
    
    private void loadOurVesselData() {
        repository.getLatestOwnVesselAsync(new Repository.RepositoryCallback<VesselEntity>() {
            @Override
            public void onComplete(VesselEntity ourVessel) {
                // Переносим на UI поток для безопасности
                AisTargetsActivity.this.runOnUiThread(() -> {
                    if (ourVessel != null) {
                        ourLatitude = ourVessel.latitude;
                        ourLongitude = ourVessel.longitude;
                        ourCourse = ourVessel.course;
                        android.util.Log.i("AisTargetsActivity", "Данные нашего корабля загружены: lat=" + ourLatitude + 
                              ", lon=" + ourLongitude + ", course=" + ourCourse);
                        
                        // Обновляем адаптер с новыми данными
                        if (adapter != null) {
                            adapter.updateOurVesselData(ourLatitude, ourLongitude, ourCourse);
                        }
                    } else {
                        android.util.Log.w("AisTargetsActivity", "Данные нашего корабля не найдены в БД");
                    }
                });
            }

            @Override
            public void onError(Exception e) {
                android.util.Log.e("AisTargetsActivity", "Ошибка загрузки данных нашего корабля: " + e.getMessage(), e);
            }
        });
    }

    @Override
    public void onMarinetrafficClick(String mmsi) {
        String url = "https://www.marinetraffic.com/ru/ais/details/ships/mmsi:" + mmsi;
        Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
        startActivity(browserIntent);
    }

    @Override
    public void onCenterOnMapClick(String mmsi, double lat, double lon) {
        Intent intent = new Intent(this, MainActivity.class);
        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
        intent.putExtra("center_mmsi", mmsi);
        intent.putExtra("center_lat", lat);
        intent.putExtra("center_lon", lon);
        startActivity(intent);
        finish();
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        if (tickerHandler != null && tickerRunnable != null) {
            tickerHandler.removeCallbacks(tickerRunnable);
        }
    }
}


