package com.sodastudio.jun.spotify_demo.ui;

import android.annotation.SuppressLint;
import android.app.Fragment;
import android.app.FragmentManager;
import android.app.FragmentTransaction;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.view.ViewCompat;
import android.support.v4.view.ViewPropertyAnimatorListener;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.TextView;

import com.sodastudio.jun.spotify_demo.R;
import com.sodastudio.jun.spotify_demo.manager.PlaybackManager;
import com.sodastudio.jun.spotify_demo.manager.ListManager;
import com.sodastudio.jun.spotify_demo.model.ArtistSearch;

import java.util.List;

import iammert.com.view.scalinglib.ScalingLayout;
import iammert.com.view.scalinglib.ScalingLayoutListener;
import iammert.com.view.scalinglib.State;

/**
 * Created by jun on 12/28/17.
 */

public class SearchFragment extends Fragment{

    private static final String TAG = "Spotify SearchFragment";

    private TextView textViewSearch;
    private EditText editTextSearch;
    private ScalingLayout scalingLayout;
    private RecyclerView searchListView;
    private ArtistListAdapter mAdapter;

    FragmentManager fragmentManager;

    @SuppressLint("ResourceType")
    public static SearchFragment getFragmentInstance(FragmentManager fm, String tag){
        SearchFragment fragment = (SearchFragment)fm.findFragmentByTag(tag);

        if(fragment == null){
            fragment = new SearchFragment();

            FragmentTransaction ft = fm.beginTransaction();
            ft.replace(R.id.fragment, fragment, tag).commitAllowingStateLoss();
        }
        return fragment;
    }

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) {

        // check if the previous state is SearchResultFragment
        PlaybackManager manager = PlaybackManager.getInstance();
        if(manager.isSearchResultFragmentAdded())
        {
            fragmentManager = getFragmentManager();
            FragmentTransaction ft = fragmentManager.beginTransaction();
            ft.add(R.id.fragment, SearchResultFragment.newInstance("empty"))
                    .addToBackStack(TAG)
                    .commit();
        }

        final View view = inflater.inflate(R.layout.fragment_search, container, false);

        textViewSearch = view.findViewById(R.id.textViewSearch);
        final RelativeLayout searchLayout = view.findViewById(R.id.searchLayout);
        final ImageButton searchButton = view.findViewById(R.id.search_text_button);

        editTextSearch = view.findViewById(R.id.editTextSearch);
        searchButton.setOnClickListener(mListener);
        scalingLayout = view.findViewById(R.id.scalingLayout);
        searchListView = view.findViewById(R.id.Artist_search_list);

        searchListView.setLayoutManager(new LinearLayoutManager(getContext()));

        mAdapter = new ArtistListAdapter(ListManager.getInstance().getArtists());
        searchListView.setAdapter(mAdapter);

        scalingLayout.setListener(new ScalingLayoutListener() {
            @Override
            public void onCollapsed() {
                ViewCompat.animate(textViewSearch).alpha(1).setDuration(150).start();
                ViewCompat.animate(searchLayout).alpha(0).setDuration(150).setListener(new ViewPropertyAnimatorListener() {
                    @Override
                    public void onAnimationStart(View view) {
                        textViewSearch.setVisibility(View.VISIBLE);
                    }

                    @Override
                    public void onAnimationEnd(View view) {
                        searchLayout.setVisibility(View.INVISIBLE);
                    }

                    @Override
                    public void onAnimationCancel(View view) {

                    }
                }).start();
            }

            @Override
            public void onExpanded() {
                ViewCompat.animate(textViewSearch).alpha(0).setDuration(200).start();
                ViewCompat.animate(searchLayout).alpha(1).setDuration(200).setListener(new ViewPropertyAnimatorListener() {
                    @Override
                    public void onAnimationStart(View view) {
                        searchLayout.setVisibility(View.VISIBLE);
                    }

                    @Override
                    public void onAnimationEnd(View view) {
                        textViewSearch.setVisibility(View.INVISIBLE);
                    }

                    @Override
                    public void onAnimationCancel(View view) {

                    }
                }).start();
            }

            @Override
            public void onProgress(float progress) {

            }
        });

        scalingLayout.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (scalingLayout.getState() == State.COLLAPSED) {
                    scalingLayout.expand();
                }
            }
        });

        view.findViewById(R.id.rootLayout).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (scalingLayout.getState() == State.EXPANDED) {
                    scalingLayout.collapse();

                    if(editTextSearch.getText().toString().equals(""))
                        textViewSearch.setText("Search");
                }
            }
        });

        return view;
    }

    View.OnClickListener mListener = new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            switch (view.getId()){
                case R.id.search_text_button:
                    String query = editTextSearch.getText().toString();

                    Log.d(TAG, "Query: " + query);

                    scalingLayout.collapse();

                    if(query.equals("")){
                        textViewSearch.setText("Search");
                    } else {

                        fragmentManager = getFragmentManager();
                        FragmentTransaction ft = fragmentManager.beginTransaction();
                        ft.add(R.id.fragment, SearchResultFragment.newInstance(query))
                                .addToBackStack(TAG)
                                .commit();



                        textViewSearch.setText(query);
                    }

                    break;
            }
        }
    };

    public void refresh(){
        mAdapter.notifyDataSetChanged();
    }

    private class ArtistListHolder extends RecyclerView.ViewHolder
    {
        private TextView artistName;
        private ImageView artistImage;
        private ArtistSearch artistSearch;

        private ArtistListHolder(View itemView) {
            super(itemView);

            artistImage = itemView.findViewById(R.id.search_artist_image_field);
            artistName = itemView.findViewById(R.id.search_artist_name);
        }

        private void bindArtist(ArtistSearch search)
        {
            artistSearch = search;

            artistName.setText(artistSearch.getName());
            artistImage.setImageBitmap(artistSearch.getImage());
        }
    }

    private class ArtistListAdapter extends RecyclerView.Adapter<ArtistListHolder>
    {
        private List<ArtistSearch> artistSearchList;

        private ArtistListAdapter(List<ArtistSearch> list){
            artistSearchList = list;
        }

        @Override
        public ArtistListHolder onCreateViewHolder(ViewGroup parent, int viewType) {

            LayoutInflater layoutInflater = LayoutInflater.from(getActivity());

            View view = layoutInflater.inflate(R.layout.artist_search, parent, false);

            return new ArtistListHolder(view);
        }

        @Override
        public void onBindViewHolder(ArtistListHolder holder, int position) {
            holder.bindArtist(artistSearchList.get(position));
        }

        @Override
        public int getItemCount() {
            return artistSearchList.size();
        }
    }
}