package com.example.paginate;

import android.content.res.Configuration;
import android.os.Bundle;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.ActionBar;
import android.support.v7.app.ActionBarDrawerToggle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.FrameLayout;
import android.widget.Spinner;

import com.example.paginate.adapter.EnumAdapter;
import com.example.paginate.adapter.IntegerAdapter;

public abstract class BaseActivity extends AppCompatActivity {

    public enum LayoutManagerEnum {
        LINEAR,
        GRID,
        STAGGERED
    }

    public enum Orientation {
        VERTICAL,
        HORIZONTAL
    }

    public enum AbsListViewType {
        LIST_VIEW,
        GRID_VIEW
    }

    // Common options
    protected int threshold = 4;
    protected int totalPages = 3;
    protected int itemsPerPage = 10;
    protected long networkDelay = 2000;
    protected boolean addLoadingRow = true;
    protected boolean customLoadingListItem = false;

    // RecyclerView specific options
    protected LayoutManagerEnum layoutManagerEnum = LayoutManagerEnum.LINEAR;
    protected Orientation orientation = Orientation.VERTICAL;
    protected boolean reverseLayout = false;

    // AbsListView specific options
    protected AbsListViewType absListViewType = AbsListViewType.LIST_VIEW;
    protected boolean useHeaderAndFooter = false;

    private ActionBarDrawerToggle drawerToggle;
    private FrameLayout container;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.base_layout_container);
        container = (FrameLayout) findViewById(R.id.container);

        setupBasicUI();
        setupOptions();
    }

    protected ViewGroup getContainer() {
        return container;
    }

    protected abstract void setupPagination();

    @Override
    protected void onPostCreate(Bundle savedInstanceState) {
        super.onPostCreate(savedInstanceState);
        // Sync the toggle state after onRestoreInstanceState has occurred.
        drawerToggle.syncState();
    }

    @Override
    public void onConfigurationChanged(Configuration configuration) {
        super.onConfigurationChanged(configuration);
        // Pass any configuration change to the drawer toggle
        drawerToggle.onConfigurationChanged(configuration);
    }

    private void setupBasicUI() {
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        ActionBar actionBar = getSupportActionBar();
        actionBar.setDisplayHomeAsUpEnabled(true);
        actionBar.setHomeButtonEnabled(true);
        actionBar.setDisplayShowTitleEnabled(false);

        DrawerLayout drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
        drawerToggle = new ActionBarDrawerToggle(this, drawerLayout, toolbar, R.string.drawer_open, R.string.drawer_closed);
        drawerLayout.setDrawerListener(drawerToggle);
        drawerToggle.syncState();
    }

    private void setupOptions() {

        // Common options

        Spinner thresholdView = (Spinner) findViewById(R.id.spinner_threshold);
        final IntegerAdapter thresholdAdapter = new IntegerAdapter(this, new int[]{0, 1, 2, 3, 4, 5, 6, 7});
        thresholdView.setAdapter(thresholdAdapter);
        thresholdView.setSelection(thresholdAdapter.getPositionForValue(threshold));
        thresholdView.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> adapterView, View view, int position, long id) {
                int selected = thresholdAdapter.getItem(position);
                if (selected != threshold) {
                    threshold = selected;
                    setupPagination();
                }
            }

            @Override
            public void onNothingSelected(AdapterView<?> adapterView) {
            }
        });

        Spinner pagesView = (Spinner) findViewById(R.id.spinner_pages);
        final IntegerAdapter pagesAdapter = new IntegerAdapter(this, new int[]{1, 2, 3, 4, 5, 6, 7});
        pagesView.setAdapter(pagesAdapter);
        pagesView.setSelection(pagesAdapter.getPositionForValue(totalPages));
        pagesView.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> adapterView, View view, int position, long id) {
                int selected = pagesAdapter.getItem(position);
                if (selected != totalPages) {
                    totalPages = selected;
                    setupPagination();
                }
            }

            @Override
            public void onNothingSelected(AdapterView<?> adapterView) {
            }
        });

        Spinner itemsPerPageView = (Spinner) findViewById(R.id.spinner_items_per_page);
        final IntegerAdapter itemsPerPageAdapter = new IntegerAdapter(this, new int[]{2, 5, 10, 20, 30});
        itemsPerPageView.setAdapter(itemsPerPageAdapter);
        itemsPerPageView.setSelection(itemsPerPageAdapter.getPositionForValue(itemsPerPage));
        itemsPerPageView.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> adapterView, View view, int position, long id) {
                itemsPerPage = itemsPerPageAdapter.getItem(position);
            }

            @Override
            public void onNothingSelected(AdapterView<?> adapterView) {
            }
        });

        Spinner networkDelayView = (Spinner) findViewById(R.id.spinner_delay);
        final IntegerAdapter delayAdapter = new IntegerAdapter(this, new int[]{1000, 2000, 3000, 5000});
        networkDelayView.setAdapter(delayAdapter);
        networkDelayView.setSelection(delayAdapter.getPositionForValue(networkDelay));
        networkDelayView.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> adapterView, View view, int position, long id) {
                networkDelay = delayAdapter.getItem(position);
            }

            @Override
            public void onNothingSelected(AdapterView<?> adapterView) {
            }
        });

        CheckBox addLoadingRowCb = (CheckBox) findViewById(R.id.cb_add_loading_row);
        addLoadingRowCb.setChecked(addLoadingRow);
        addLoadingRowCb.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                if (addLoadingRow != isChecked) {
                    addLoadingRow = isChecked;
                    setupPagination();
                }
            }
        });

        CheckBox customLoadingListItemCb = (CheckBox) findViewById(R.id.cb_custom_row);
        customLoadingListItemCb.setChecked(customLoadingListItem);
        customLoadingListItemCb.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                if (customLoadingListItem != isChecked) {
                    customLoadingListItem = isChecked;
                    setupPagination();
                }
            }
        });

        // Recycler specific options

        Spinner layoutManagerView = (Spinner) findViewById(R.id.spinner_layout_mng);
        final EnumAdapter<LayoutManagerEnum> layoutManagerAdapter = new EnumAdapter<>(this, LayoutManagerEnum.class);
        layoutManagerView.setAdapter(layoutManagerAdapter);
        layoutManagerView.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> adapterView, View view, int position, long id) {
                LayoutManagerEnum selected = layoutManagerAdapter.getItem(position);
                if (selected != layoutManagerEnum) {
                    layoutManagerEnum = selected;
                    setupPagination();
                }
            }

            @Override
            public void onNothingSelected(AdapterView<?> adapterView) {
            }
        });

        Spinner orientationView = (Spinner) findViewById(R.id.spinner_orientation);
        final EnumAdapter<Orientation> orientationAdapter = new EnumAdapter<>(this, Orientation.class);
        orientationView.setAdapter(orientationAdapter);
        orientationView.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> adapterView, View view, int position, long id) {
                Orientation selected = orientationAdapter.getItem(position);
                if (selected != orientation) {
                    orientation = selected;
                    setupPagination();
                }
            }

            @Override
            public void onNothingSelected(AdapterView<?> adapterView) {
            }
        });

        CheckBox reverseLayoutCb = (CheckBox) findViewById(R.id.cb_reverse);
        reverseLayoutCb.setChecked(reverseLayout);
        reverseLayoutCb.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                if (reverseLayout != isChecked) {
                    reverseLayout = isChecked;
                    setupPagination();
                }
            }
        });

        // AbsListView specific options

        Spinner absListViewTypeView = (Spinner) findViewById(R.id.spinner_abs_list_type);
        final EnumAdapter<AbsListViewType> absListViewTypeAdapter = new EnumAdapter<>(this, AbsListViewType.class);
        absListViewTypeView.setAdapter(absListViewTypeAdapter);
        absListViewTypeView.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> adapterView, View view, int position, long id) {
                AbsListViewType selected = absListViewTypeAdapter.getItem(position);
                if (selected != absListViewType) {
                    absListViewType = selected;
                    setupPagination();
                }
            }

            @Override
            public void onNothingSelected(AdapterView<?> adapterView) {
            }
        });

        CheckBox userHeaderAndFooterCb = (CheckBox) findViewById(R.id.cb_header_and_footer);
        userHeaderAndFooterCb.setChecked(useHeaderAndFooter);
        userHeaderAndFooterCb.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                if (useHeaderAndFooter != isChecked) {
                    useHeaderAndFooter = isChecked;
                    setupPagination();
                }
            }
        });
    }

}