package app.fedilab.fedilabtube.drawer;
/* Copyright 2020 Thomas Schneider
 *
 * This file is a part of TubeLab
 *
 * This program is free software; you can redistribute it and/or modify it under the terms of the
 * GNU General Public License as published by the Free Software Foundation; either version 3 of the
 * License, or (at your option) any later version.
 *
 * TubeLab is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even
 * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
 * Public License for more details.
 *
 * You should have received a copy of the GNU General Public License along with TubeLab; if not,
 * see <http://www.gnu.org/licenses>. */

import android.app.AlertDialog;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.widget.TextView;

import androidx.appcompat.widget.PopupMenu;
import androidx.lifecycle.LifecycleOwner;
import androidx.lifecycle.ViewModelProvider;
import androidx.lifecycle.ViewModelStoreOwner;

import java.util.List;

import app.fedilab.fedilabtube.AllPlaylistsActivity;
import app.fedilab.fedilabtube.PlaylistsActivity;
import app.fedilab.fedilabtube.R;
import app.fedilab.fedilabtube.client.APIResponse;
import app.fedilab.fedilabtube.client.data.PlaylistData.Playlist;
import app.fedilab.fedilabtube.helper.Helper;
import app.fedilab.fedilabtube.viewmodel.PlaylistsVM;


public class PlaylistAdapter extends BaseAdapter {

    private List<Playlist> playlists;
    private LayoutInflater layoutInflater;
    private Context context;
    private RelativeLayout textviewNoAction;

    public PlaylistAdapter(Context context, List<Playlist> lists, RelativeLayout textviewNoAction) {
        this.playlists = lists;
        layoutInflater = LayoutInflater.from(context);
        this.context = context;
        this.textviewNoAction = textviewNoAction;
    }

    @Override
    public int getCount() {
        return playlists.size();
    }

    @Override
    public Object getItem(int position) {
        return playlists.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }


    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {

        final Playlist playlist = playlists.get(position);
        final ViewHolder holder;
        if (convertView == null) {
            convertView = layoutInflater.inflate(R.layout.drawer_playlist, parent, false);
            holder = new ViewHolder();
            holder.preview_title = convertView.findViewById(R.id.preview_title);
            holder.preview_visibility = convertView.findViewById(R.id.preview_visibility);
            holder.preview_description = convertView.findViewById(R.id.preview_description);
            holder.playlist_container = convertView.findViewById(R.id.playlist_container);
            holder.preview_playlist = convertView.findViewById(R.id.preview_playlist);
            holder.playlist_more = convertView.findViewById(R.id.playlist_more);
            convertView.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }

        Helper.loadGiF(context, playlist.getThumbnailPath(), holder.preview_playlist);

        holder.preview_title.setText(playlist.getDisplayName());
        if (playlist.getDescription() != null && playlist.getDescription().trim().compareTo("null") != 0 && playlist.getDescription().length() > 0) {
            holder.preview_description.setText(playlist.getDescription());
            holder.preview_description.setVisibility(View.VISIBLE);
        } else {
            holder.preview_description.setVisibility(View.GONE);
        }
        holder.preview_visibility.setText(playlist.getPrivacy().getLabel());

        holder.playlist_container.setOnClickListener(v -> {
            Intent intent = new Intent(context, PlaylistsActivity.class);
            Bundle b = new Bundle();
            b.putParcelable("playlist", playlist);
            intent.putExtras(b);
            context.startActivity(intent);
        });

        if (playlist.getDisplayName().compareTo("Watch later") == 0) {
            holder.playlist_more.setVisibility(View.GONE);
        } else {
            holder.playlist_more.setVisibility(View.VISIBLE);
        }

        holder.playlist_more.setOnClickListener(v -> {
            PopupMenu popup = new PopupMenu(context, holder.playlist_more);
            popup.getMenuInflater()
                    .inflate(R.menu.playlist_menu, popup.getMenu());
            popup.setOnMenuItemClickListener(item -> {
                switch (item.getItemId()) {
                    case R.id.action_delete:
                        AlertDialog.Builder builder = new AlertDialog.Builder(context);
                        builder.setTitle(context.getString(R.string.action_lists_delete) + ": " + playlist.getDisplayName());
                        builder.setMessage(context.getString(R.string.action_lists_confirm_delete));
                        builder.setIcon(android.R.drawable.ic_dialog_alert)
                                .setPositiveButton(R.string.yes, (dialog, which) -> {
                                    playlists.remove(playlist);
                                    notifyDataSetChanged();
                                    PlaylistsVM viewModel = new ViewModelProvider((ViewModelStoreOwner) context).get(PlaylistsVM.class);
                                    viewModel.manage(PlaylistsVM.action.DELETE_PLAYLIST, playlist, null).observe((LifecycleOwner) context, apiResponse -> manageVIewPlaylists(PlaylistsVM.action.DELETE_PLAYLIST, apiResponse));

                                    if (playlists.size() == 0 && textviewNoAction != null && textviewNoAction.getVisibility() == View.GONE)
                                        textviewNoAction.setVisibility(View.VISIBLE);
                                    dialog.dismiss();
                                })
                                .setNegativeButton(R.string.no, (dialog, which) -> dialog.dismiss())
                                .show();
                        break;
                    case R.id.action_edit:
                        if (context instanceof AllPlaylistsActivity) {
                            ((AllPlaylistsActivity) context).manageAlert(playlist);
                        }
                        break;
                }
                return true;
            });
            popup.show();

        });
        return convertView;
    }

    @SuppressWarnings({"unused", "RedundantSuppression"})
    public void manageVIewPlaylists(PlaylistsVM.action actionType, APIResponse apiResponse) {

    }

    private static class ViewHolder {
        LinearLayout playlist_container;
        ImageView preview_playlist;
        TextView preview_title, preview_visibility, preview_description;
        ImageButton playlist_more;
    }


}