package com.nasageek.utexasutilities.activities;

import android.content.SharedPreferences;
import android.os.Bundle;
import android.os.Parcel;
import android.os.Parcelable;
import android.preference.PreferenceManager;
import android.support.design.widget.TabLayout;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.support.v4.view.ViewCompat;
import android.support.v4.view.ViewPager;
import android.view.Menu;
import android.view.MenuItem;

import com.commonsware.cwac.pager.PageDescriptor;
import com.commonsware.cwac.pager.v4.ArrayPagerAdapter;
import com.nasageek.utexasutilities.BuildConfig;
import com.nasageek.utexasutilities.MyBus;
import com.nasageek.utexasutilities.R;
import com.nasageek.utexasutilities.adapters.MultiPanePagerAdapter;
import com.nasageek.utexasutilities.fragments.DataSourceSelectionFragment;
import com.nasageek.utexasutilities.fragments.TransactionsFragment;
import com.nasageek.utexasutilities.fragments.TransactionsFragment.TransactionType;
import com.nasageek.utexasutilities.model.SimplePageDescriptor;
import com.squareup.otto.Subscribe;

import java.util.ArrayList;
import java.util.List;

public class BalanceActivity extends BaseActivity implements ArrayPagerAdapter.RetentionStrategy {

    private TransactionsPagerAdapter mPagerAdapter;
    private ViewPager pager;
    private int pagesDisplayed;
    private static final String TRANSACTIONS_URL =
            "https://utdirect.utexas.edu/hfis/transactions.WBX";

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.balance_layout);
        pager = (ViewPager) findViewById(R.id.viewpager);
        pagesDisplayed = getResources().getInteger(R.integer.balance_num_visible_pages);
        initialisePaging();
        setupActionBar();
        actionBar.setElevation(0);
    }

    @Override
    public void onStart() {
        super.onStart();
        MyBus.getInstance().register(this);
    }

    @Override
    public void onStop() {
        MyBus.getInstance().unregister(this);
        super.onStop();
    }

    private void initialisePaging() {
        List<PageDescriptor> pages = new ArrayList<>();
        pages.add(new TransactionsPageDescriptor("Dine In", TransactionType.Dinein,
                TRANSACTIONS_URL));
        pages.add(new TransactionsPageDescriptor("Bevo Bucks", TransactionType.Bevo,
                TRANSACTIONS_URL));
        mPagerAdapter = new TransactionsPagerAdapter(getSupportFragmentManager(), pages, this);
        mPagerAdapter.setPagesDisplayed(pagesDisplayed);

        pager.setAdapter(this.mPagerAdapter);
        pager.setPageMargin(getResources().getDimensionPixelSize(R.dimen.pager_margin));
        // TODO: reimplement selectAll hack with design support library
//        if (pagesDisplayed > 1) {
//            tabIndicator.setSelectAll(true);
//        }
        ((TabLayout) findViewById(R.id.tabs)).setupWithViewPager(pager);
        float elevationPx = getResources().getDimensionPixelSize(R.dimen.actionbar_elevation);
        ViewCompat.setElevation(findViewById(R.id.tabs), elevationPx);

        SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this);
        pager.setCurrentItem(Integer.parseInt(sp.getString("default_balance_tab", "0")));
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        int id = item.getItemId();
        switch (id) {
            // tightly coupling the activity to the fragments for the sake of graphical consistency
            // was getting weird disappearing menu buttons when I had them in the fragments
            // TODO: should at least do this with an interface
            case R.id.balance_refresh:
                if (pagesDisplayed > 1) {
                    mPagerAdapter.getExistingFragment(0).refresh();
                    mPagerAdapter.getExistingFragment(1).refresh();
                } else {
                    // if the viewpager is only showing 1 page at a time only
                    // refresh the fragment currently in view
                    mPagerAdapter.getCurrentFragment().refresh();
                }
                break;
            case R.id.data_sources:
                DataSourceSelectionFragment
                        .newInstance("test_html/transactions",
                                "https://utdirect.utexas.edu/hfis/transactions.WBX")
                        .show(getSupportFragmentManager(),
                                DataSourceSelectionFragment.class.getSimpleName());
                break;
            default:
                return super.onOptionsItemSelected(item);
        }
        return true;
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        super.onCreateOptionsMenu(menu);
        getMenuInflater().inflate(R.menu.balance_menu, menu);
        if (BuildConfig.DEBUG) {
            getMenuInflater().inflate(R.menu.data_sources, menu);
        }
        return true;
    }

    @Subscribe
    public void onDataSourceSelected(DataSourceSelectionFragment.DataSourceSelectedEvent event) {
        mPagerAdapter.remove(1);
        mPagerAdapter.remove(0);
        mPagerAdapter.add(new TransactionsPageDescriptor("Dine In", TransactionType.Dinein,
                event.url));
        mPagerAdapter.add(new TransactionsPageDescriptor("Bevo Bucks", TransactionType.Bevo,
                event.url));
    }

    @Override
    public void attach(Fragment fragment, FragmentTransaction fragmentTransaction) {
        fragmentTransaction.attach(fragment);
    }

    @Override
    public void detach(Fragment fragment, FragmentTransaction fragmentTransaction) {
        fragmentTransaction.remove(fragment);
    }

    static class TransactionsPagerAdapter extends MultiPanePagerAdapter<TransactionsFragment> {

        @Override
        protected TransactionsFragment createFragment(PageDescriptor pageDescriptor) {
            TransactionsPageDescriptor page = (TransactionsPageDescriptor) pageDescriptor;
            return TransactionsFragment.newInstance(page.getTransactionType(), page.getUrl());
        }

        public TransactionsPagerAdapter(FragmentManager fm, List<PageDescriptor> pages,
                                        RetentionStrategy strategy) {
            super(fm, pages, strategy);
        }
    }

    static class TransactionsPageDescriptor extends SimplePageDescriptor {

        private TransactionType type;
        private String url;

        public static final Parcelable.Creator<TransactionsPageDescriptor> CREATOR =
                new Parcelable.Creator<TransactionsPageDescriptor>() {
                    public TransactionsPageDescriptor createFromParcel(Parcel in) {
                        return new TransactionsPageDescriptor(in);
                    }

                    public TransactionsPageDescriptor[] newArray(int size) {
                        return new TransactionsPageDescriptor[size];
                    }
                };

        public TransactionsPageDescriptor(String title, TransactionType type, String url) {
            super(title, title);
            this.type = type;
            this.url = url;
        }

        protected TransactionsPageDescriptor(Parcel in) {
            super(in);
            type = (TransactionType) in.readSerializable();
            url = in.readString();
        }

        public TransactionType getTransactionType() {
            return type;
        }

        public String getUrl() {
            return url;
        }

        @Override
        public void writeToParcel(Parcel out, int flags) {
            super.writeToParcel(out, flags);
            out.writeSerializable(type);
            out.writeString(url);
        }

        @Override
        public int describeContents() {
            return 0;
        }
    }
}