package com.grigowashere.aismap;

import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.recyclerview.widget.DiffUtil;
import androidx.recyclerview.widget.ListAdapter;
import androidx.recyclerview.widget.RecyclerView;

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

class AisTargetsAdapter extends ListAdapter<AISVesselEntity, AisTargetsAdapter.ViewHolder> {

    interface OnItemClickListener {
        void onMarinetrafficClick(String mmsi);
        void onCenterOnMapClick(String mmsi, double lat, double lon);
    }

    private final OnItemClickListener listener;

    protected AisTargetsAdapter(@NonNull DiffUtil.ItemCallback<AISVesselEntity> diffCallback, OnItemClickListener listener) {
        super(diffCallback);
        this.listener = listener;
    }

    public AisTargetsAdapter(java.util.List<AISVesselEntity> initial, OnItemClickListener listener) {
        this(DIFF_CALLBACK, listener);
        submitList(initial);
    }

    static final DiffUtil.ItemCallback<AISVesselEntity> DIFF_CALLBACK = new DiffUtil.ItemCallback<AISVesselEntity>() {
        @Override
        public boolean areItemsTheSame(@NonNull AISVesselEntity oldItem, @NonNull AISVesselEntity newItem) {
            return oldItem.mmsi.equals(newItem.mmsi);
        }

        @Override
        public boolean areContentsTheSame(@NonNull AISVesselEntity oldItem, @NonNull AISVesselEntity newItem) {
            return oldItem.latitude == newItem.latitude &&
                   oldItem.longitude == newItem.longitude &&
                   oldItem.course == newItem.course &&
                   oldItem.speed == newItem.speed &&
                   ((oldItem.vesselName == null && newItem.vesselName == null) || (oldItem.vesselName != null && oldItem.vesselName.equals(newItem.vesselName)));
            // Не проверяем lastUpdateEpochMs, чтобы избежать мигания при обновлении времени
        }
    };

    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_ais_target, parent, false);
        return new ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
        AISVesselEntity item = getItem(position);
        holder.bind(item, listener);
    }

    @Override
    public void onBindViewHolder(@NonNull ViewHolder holder, int position, @NonNull java.util.List<Object> payloads) {
        if (payloads.isEmpty()) {
            super.onBindViewHolder(holder, position, payloads);
        } else {
            // Частичное обновление только времени
            AISVesselEntity item = getItem(position);
            holder.updateTimeOnly(item);
        }
    }

    static class ViewHolder extends RecyclerView.ViewHolder {
        TextView tvTitle;
        TextView tvMmsi;
        TextView tvCoords;
        TextView tvCourseSpeed;
        TextView tvLastUpdate;
        TextView tvTimeAgo;
        Button btnMarineTraffic;
        Button btnCenterOnMap;

        ViewHolder(@NonNull View itemView) {
            super(itemView);
            tvTitle = itemView.findViewById(R.id.tv_title);
            tvMmsi = itemView.findViewById(R.id.tv_mmsi);
            tvCoords = itemView.findViewById(R.id.tv_coords);
            tvCourseSpeed = itemView.findViewById(R.id.tv_course_speed);
            tvLastUpdate = itemView.findViewById(R.id.tv_last_update);
            tvTimeAgo = itemView.findViewById(R.id.tv_time_ago);
            btnMarineTraffic = itemView.findViewById(R.id.btn_marine_traffic);
            btnCenterOnMap = itemView.findViewById(R.id.btn_center_on_map);
        }

        void bind(AISVesselEntity entity, OnItemClickListener listener) {
            String name = entity.vesselName != null && !entity.vesselName.isEmpty() ? entity.vesselName : "MMSI " + entity.mmsi;
            tvTitle.setText(name);
            tvMmsi.setText("MMSI: " + entity.mmsi);
            tvCoords.setText(String.format(java.util.Locale.getDefault(), "%.6f, %.6f", entity.latitude, entity.longitude));
            tvCourseSpeed.setText(String.format(java.util.Locale.getDefault(), "COG %.1f°  •  %.1f kn", entity.course, entity.speed));
            // Время последнего обновления и ago
            if (entity.lastUpdateEpochMs > 0) {
                java.text.SimpleDateFormat df = new java.text.SimpleDateFormat("dd.MM.yyyy HH:mm:ss", java.util.Locale.getDefault());
                String last = df.format(new java.util.Date(entity.lastUpdateEpochMs));
                tvLastUpdate.setText("Обновлено: " + last);
                long secondsAgo = (System.currentTimeMillis() - entity.lastUpdateEpochMs) / 1000L;
                tvTimeAgo.setText("" + secondsAgo + " сек назад");
            } else {
                tvLastUpdate.setText("Обновлено: --");
                tvTimeAgo.setText("-- сек назад");
            }
            btnMarineTraffic.setOnClickListener(v -> listener.onMarinetrafficClick(entity.mmsi));
            btnCenterOnMap.setOnClickListener(v -> {
                android.util.Log.i("AisTargetsAdapter", "Кнопка 'На карте' нажата для MMSI=" + entity.mmsi + ", lat=" + entity.latitude + ", lon=" + entity.longitude);
                listener.onCenterOnMapClick(entity.mmsi, entity.latitude, entity.longitude);
            });
        }

        void updateTimeOnly(AISVesselEntity entity) {
            // Обновляем только поля времени, чтобы избежать мигания всего элемента
            if (entity.lastUpdateEpochMs > 0) {
                java.text.SimpleDateFormat df = new java.text.SimpleDateFormat("dd.MM.yyyy HH:mm:ss", java.util.Locale.getDefault());
                String last = df.format(new java.util.Date(entity.lastUpdateEpochMs));
                tvLastUpdate.setText("Обновлено: " + last);
                long secondsAgo = (System.currentTimeMillis() - entity.lastUpdateEpochMs) / 1000L;
                tvTimeAgo.setText("" + secondsAgo + " сек назад");
            } else {
                tvLastUpdate.setText("Обновлено: --");
                tvTimeAgo.setText("-- сек назад");
            }
        }
    }
}


