package th.co.thekhaeng.nextzy.fighting.nongbeer.ui.main.beer;


import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.StaggeredGridLayoutManager;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

import com.thekhaeng.recyclerviewmargin.StaggeredGridLayoutMargin;

import java.util.List;

import th.co.thekhaeng.nextzy.fighting.nongbeer.R;
import th.co.thekhaeng.nextzy.fighting.nongbeer.ui.base.BaseMvpFragment;
import th.co.thekhaeng.nextzy.fighting.nongbeer.ui.base.adapter.BaseItem;
import th.co.thekhaeng.nextzy.fighting.nongbeer.ui.main.beer.adapter.BeerProductAdapter;
import th.co.thekhaeng.nextzy.fighting.nongbeer.ui.main.beer.adapter.item.BeerProductItem;
import th.co.thekhaeng.nextzy.fighting.nongbeer.ui.main.beer.adapter.item.BeerProductItemGroup;

/**
 * Created by TheKhaeng on 12/17/2016.
 */

public class BeerProductFragment extends
        BaseMvpFragment<BeerProductFragmentInterface.Presenter>
        implements BeerProductFragmentInterface.View{

    private static final int COLUMN = 2;
    public static final String KEY_BEER_GROUP = "key_beer_group";
    private RecyclerView rvBeer;
    private BeerProductAdapter beerAdapter;
    private View containerServiceUnavailable;
    private Button btnTryAgain;

    public BeerProductFragment(){
        super();
    }

    public static BeerProductFragment newInstance(){
        BeerProductFragment fragment = new BeerProductFragment();
        Bundle args = new Bundle();
        fragment.setArguments( args );
        return fragment;
    }

    @Override
    public BeerProductFragmentInterface.Presenter createPresenter(){
        return BeerProductFragmentPresenter.create();
    }

    @Override
    public int getLayoutView(){
        return R.layout.fragment_beer_product;
    }

    @Override
    public void bindView( View view ){
        rvBeer = (RecyclerView) view.findViewById( R.id.rv_beer );
        containerServiceUnavailable = view.findViewById( R.id.container_service_unavailable );
        btnTryAgain = (Button) view.findViewById( R.id.btn_try_again );
    }

    @Override
    public void setupInstance(){
        beerAdapter = new BeerProductAdapter();
        beerAdapter.setOnClickProductItem( onClickProduct() );
        beerAdapter.setOnLoadMoreListener( onLoadMore() );
    }

    @Override
    public void setupView(){
        int itemSpace = (int) getResources().getDimension( R.dimen.default_padding_margin );
        rvBeer.addItemDecoration( new StaggeredGridLayoutMargin( COLUMN, itemSpace ) );
        StaggeredGridLayoutManager layout = new StaggeredGridLayoutManager( COLUMN, StaggeredGridLayoutManager.VERTICAL );
        rvBeer.setLayoutManager( layout );
        rvBeer.setAdapter( beerAdapter );

        btnTryAgain.setOnClickListener( onClickTryAgain() );
    }


    @Override
    public void initialize(){
        beerAdapter.initDefaultItemForLoadmore();
    }

    @Override
    public void restoreView( Bundle savedInstanceState ){
        getPresenter().setBeerProductToAdapter( getPresenter().getBeerItemGroup() );
    }

    @Override
    public void onSaveInstanceState( Bundle outState ){
        super.onSaveInstanceState( outState );
        outState.putParcelable( KEY_BEER_GROUP, getPresenter().getBeerItemGroup() );
    }

    @Override
    public void onRestoreInstanceState( Bundle savedInstanceState ){
        super.onRestoreInstanceState( savedInstanceState );
        getPresenter().setBeerItemGroup(
                (BeerProductItemGroup) savedInstanceState.getParcelable( KEY_BEER_GROUP ) );
    }

    /** =========================== On presenter call ========================================== **/
    //<editor-fold desc="On presenter call folding">
    @Override
    public void setBeerProductItemToAdapter( List<BaseItem> beerItemFromResult , boolean isNextBeerAvailable){
        beerAdapter.setItems( beerItemFromResult, isNextBeerAvailable );
    }

    @Override
    public void onClearAddedButtonStateEvent( BeerProductItem item ){
        beerAdapter.clearAddedState(item);
    }

    @Override
    public void onClearAddedButtonAllStateEvent(){
        beerAdapter.clearAddedStateAll();
        rvBeer.smoothScrollToPosition(0);
    }

    @Override
    public List<BaseItem> getItemsFromAdapter(){
        return beerAdapter.getItems();
    }


    @Override
    public void showServiceUnavailableView(){
        rvBeer.setVisibility( View.GONE );
        containerServiceUnavailable.setVisibility( View.VISIBLE );
    }

    @Override
    public void showServiceAvailableView(){
        rvBeer.setVisibility( View.VISIBLE );
        containerServiceUnavailable.setVisibility( View.GONE );
    }
    //</editor-fold>

    @NonNull
    private BeerProductAdapter.OnClickBeerProductListener onClickProduct(){
        return new BeerProductAdapter.OnClickBeerProductListener(){
            @Override
            public void onClickItem( BeerProductItem item, int position ){
                Toast.makeText( getActivity(), "Item " + position, Toast.LENGTH_SHORT ).show();
            }

            @Override
            public void onClickAddToCart( BeerProductItem item, int position ){
                getPresenter().addBeerItemToCart( item );
            }

            @Override
            public void onClickAdded( BeerProductItem item, int position ){
                getPresenter().deleteBeerItemFromCart( item, position );
            }
        };
    }


    @NonNull
    private BeerProductAdapter.OnLoadMoreListener onLoadMore(){
        return new BeerProductAdapter.OnLoadMoreListener(){
            @Override
            public void onLoadMore(){
                getPresenter().requestBeerProduct();
            }
        };
    }

    @NonNull
    private View.OnClickListener onClickTryAgain(){
        return new View.OnClickListener(){
            @Override
            public void onClick( View v ){
                getPresenter().requestBeerProduct();
            }
        };
    }

}