package com.lemenzo.gallery.albums;

import android.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import androidx.recyclerview.widget.GridLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import com.lemenzo.gallery.R;
import com.lemenzo.gallery.model.Album;
import com.lemenzo.gallery.ui.RecyclerTuning;
import com.lemenzo.gallery.util.BackgroundExecutors;

import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Future;

public final class AlbumsFragment extends Fragment {
    private AlbumsAdapter adapter;
    private RecyclerView grid;
    private View empty;
    private AlbumsViewModel viewModel;
    private ExecutorService executor;
    private Future<?> loadTask;
    private int loadGeneration;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle state) {
        View view = inflater.inflate(R.layout.fragment_albums, container, false);
        grid = view.findViewById(R.id.albums_grid);
        empty = view.findViewById(R.id.empty_state);
        viewModel = new AlbumsViewModel(getActivity());
        executor = BackgroundExecutors.single("LemenzoGalleryAlbums");
        adapter = new AlbumsAdapter(getActivity(),
                album -> startActivity(AlbumActivity.intent(getActivity(), album)));
        grid.setLayoutManager(new GridLayoutManager(getActivity(), 2));
        grid.setAdapter(adapter);
        RecyclerTuning.applyAlbumGrid(grid);
        load();
        return view;
    }

    public void refresh() {
        load();
    }

    private void load() {
        ExecutorService current = executor;
        if (current == null || current.isShutdown()) return;
        if (loadTask != null) loadTask.cancel(true);
        final int generation = ++loadGeneration;
        loadTask = current.submit(() -> {
            List<Album> albums = viewModel.load();
            if (Thread.currentThread().isInterrupted() || getActivity() == null) return;
            getActivity().runOnUiThread(() -> {
                if (generation != loadGeneration || adapter == null || grid == null || empty == null) return;
                adapter.submit(albums);
                empty.setVisibility(albums.isEmpty() ? View.VISIBLE : View.GONE);
                grid.setVisibility(albums.isEmpty() ? View.GONE : View.VISIBLE);
            });
        });
    }

    @Override
    public void onDestroyView() {
        if (adapter != null) adapter.close();
        adapter = null;
        loadGeneration++;
        if (loadTask != null) loadTask.cancel(true);
        loadTask = null;
        if (executor != null) executor.shutdownNow();
        executor = null;
        grid = null;
        empty = null;
        super.onDestroyView();
    }
}
