package com.grigowashere.aismap;

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

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 android.widget.EditText editSearch;
    private final java.util.List<AISVesselEntity> fullList = new java.util.ArrayList<>();
    private String currentQuery = "";
    
    // Данные нашего корабля
    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);
        editSearch = findViewById(R.id.edit_search);
        recyclerView.setLayoutManager(new LinearLayoutManager(this));
        adapter = new AisTargetsAdapter(new ArrayList<>(), this);
        recyclerView.setAdapter(adapter);

        editSearch.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) { }

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
                currentQuery = s != null ? s.toString().trim() : "";
                applyFilterAndUpdate();
            }

            @Override
            public void afterTextChanged(Editable s) { }
        });

        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));
                }
                fullList.clear();
                if (entities != null) fullList.addAll(entities);
                applyFilterAndUpdate();
                
                // Обновляем данные нашего корабля в адаптере
                adapter.updateOurVesselData(ourLatitude, ourLongitude, ourCourse);
            }
        });

        // Тикер для обновления поля "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 applyFilterAndUpdate() {
        java.util.List<AISVesselEntity> filtered;
        if (currentQuery == null || currentQuery.isEmpty()) {
            filtered = new java.util.ArrayList<>(fullList);
        } else {
            String q = currentQuery.toLowerCase(java.util.Locale.ROOT);
            filtered = new java.util.ArrayList<>();
            for (AISVesselEntity e : fullList) {
                if (matchesQuery(e, q)) {
                    filtered.add(e);
                }
            }
        }
        adapter.submitList(filtered);
        int targetCount = filtered.size();
        textTargetCount.setText("AIS цели: " + targetCount);
        if (targetCount == 0) {
            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);
        }
    }

    private boolean matchesQuery(AISVesselEntity e, String q) {
        if (e == null) return false;
        // MMSI (строго строкой), имя, позывной, пункт назначения, IMO, тип судна
        if (e.mmsi != null && e.mmsi.toLowerCase(java.util.Locale.ROOT).contains(q)) return true;
        if (e.vesselName != null && e.vesselName.toLowerCase(java.util.Locale.ROOT).contains(q)) return true;
        if (e.callSign != null && e.callSign.toLowerCase(java.util.Locale.ROOT).contains(q)) return true;
        if (e.destination != null && e.destination.toLowerCase(java.util.Locale.ROOT).contains(q)) return true;
        if (e.vesselType != null && e.vesselType.toLowerCase(java.util.Locale.ROOT).contains(q)) return true;
        if (String.valueOf(e.imo).contains(q)) return true;
        return false;
    }
    
    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);
        }
    }
}


