package io.hefuyi.zhihudaily.ui.activity;

import android.content.res.Resources;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.ActionBar;
import android.support.v7.app.ActionBarDrawerToggle;
import android.util.TypedValue;
import android.view.Menu;
import android.view.View;

import butterknife.Bind;
import butterknife.ButterKnife;
import io.hefuyi.zhihudaily.DailyApplication;
import io.hefuyi.zhihudaily.R;
import io.hefuyi.zhihudaily.injector.component.ApplicationComponent;
import io.hefuyi.zhihudaily.interfaces.NavigationDrawerCallbacks;
import io.hefuyi.zhihudaily.ui.fragment.BaseFragment;
import io.hefuyi.zhihudaily.ui.fragment.DailyStoriesFragment;
import io.hefuyi.zhihudaily.ui.fragment.NavigationFragment;
import io.hefuyi.zhihudaily.ui.fragment.ThemeStoriesFragment;
import io.hefuyi.zhihudaily.util.L;

public class NavigationDrawerActivity extends BaseAppcompatActivity implements NavigationDrawerCallbacks {

    private static final String TAG = NavigationDrawerActivity.class.getSimpleName();
    private static final String STATE_SELECTED_POSITION = "state_selected_positioin";

    @Bind(R.id.drawer_layout)
    DrawerLayout drawerLayout;
    @Bind(R.id.navigation_drawer)
    View navigationDrawer;

    private NavigationFragment mNavigationFragment;
    private ActionBarDrawerToggle mDrawerToggle;
    private CharSequence mTitle = "";
    private int mLastPosition = 0;

    /*初始化相关方法*/
    @Override
    protected int getContentViewLayoutId() {
        return R.layout.activity_navigation_drawer;
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        L.i(TAG, "onCreate  " + this);
        super.onCreate(savedInstanceState);

        ButterKnife.bind(this);
        setUpDrawer();
        if (savedInstanceState == null) {
            mNavigationFragment.selectItem(NavigationFragment.getDefaultNavDrawerItem());
        } else {
            int position = savedInstanceState.getInt(STATE_SELECTED_POSITION);
            mLastPosition = position;
            mTitle = mNavigationFragment.getTitle(position);
            restortActionBar();
            mNavigationFragment.selectItem(position);
        }
    }

    private void setUpDrawer() {
        mNavigationFragment = (NavigationFragment) getSupportFragmentManager().findFragmentById(R.id.navigation_drawer);
        mTitle = getTitle();
        mDrawerToggle = new ActionBarDrawerToggle(this, drawerLayout, mToolbar,
                R.string.navigation_drawer_open, R.string.navigation_drawer_close) {
            @Override
            public void onDrawerClosed(View drawerView) {
                super.onDrawerClosed(drawerView);
                supportInvalidateOptionsMenu();
            }

            @Override
            public void onDrawerOpened(View drawerView) {
                super.onDrawerOpened(drawerView);
                supportInvalidateOptionsMenu();
            }
        };

        drawerLayout.post(new Runnable() {
            @Override
            public void run() {
                mDrawerToggle.syncState();
            }
        });
        drawerLayout.addDrawerListener(mDrawerToggle);
    }

    private void restortActionBar() {
        ActionBar actionBar = getSupportActionBar();
        actionBar.setDisplayShowTitleEnabled(true);
        actionBar.setTitle(mTitle);
    }
    /*初始化相关方法*/

    /*事件响应方法*/
    @Override
    public void onNavigationDrawerItemSelected(int position) {
        FragmentManager fragmentManager = getSupportFragmentManager();
        FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();

        Fragment lastFragment = fragmentManager.findFragmentByTag(getTag(mLastPosition));
        if (lastFragment != null) {
            fragmentTransaction.detach(lastFragment);
        }

        Fragment fragment = fragmentManager.findFragmentByTag(getTag(position));
        if (fragment == null) {
            fragment = getFragmentItem(position);
            fragmentTransaction.add(R.id.container, fragment, getTag(position));
        } else {
            fragmentTransaction.attach(fragment);
        }
        fragmentTransaction.commit();
        mLastPosition = position;

        mTitle = mNavigationFragment.getTitle(position);
        restortActionBar();
    }

    @Override
    protected void refreshUI() {
        mNavigationFragment.refreshUI();
        FragmentManager fragmentManager = getSupportFragmentManager();
        Fragment lastFragment = fragmentManager.findFragmentByTag(getTag(mLastPosition));
        if (lastFragment != null) {
            ((BaseFragment) lastFragment).refreshUI();
        }
        refreshToolBar();
    }

    private void refreshToolBar() {
        TypedValue typedValue = new TypedValue();
        Resources.Theme theme = getTheme();
        theme.resolveAttribute(R.attr.colorPrimary, typedValue, true);
        mToolbar.setBackgroundColor(getResources().getColor(typedValue.resourceId));
    }

    @Override
    protected void smoothToTop() {
        FragmentManager fragmentManager = getSupportFragmentManager();
        Fragment lastFragment = fragmentManager.findFragmentByTag(getTag(mLastPosition));
        if (lastFragment != null) {
            ((BaseFragment) lastFragment).smoothToTop();
        }
    }

    public void closeDrawer() {
        drawerLayout.closeDrawer(navigationDrawer);
    }
    /*事件响应方法*/

    /*普通逻辑方法*/
    private String getTag(int position) {
        switch (position) {
            case 0:
                return DailyStoriesFragment.TAG;
            default:
                return ThemeStoriesFragment.TAG + position;
        }
    }

    private Fragment getFragmentItem(int position) {
        return BaseFragment.newInstance(position, mNavigationFragment.getSectionId(position));
    }

    public ApplicationComponent getApplicationComponent() {
        ApplicationComponent applicationComponent = ((DailyApplication) getApplication()).getApplicationComponent();
        return applicationComponent;
    }

    public boolean isDrawerOpen() {
        return drawerLayout.isDrawerOpen(navigationDrawer);
    }
    /*普通逻辑方法*/

    /*生命周期回调方法*/
    @Override
    public void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        outState.putInt(STATE_SELECTED_POSITION, mLastPosition);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        if (!isDrawerOpen()) {
            getMenuInflater().inflate(R.menu.menu_navigationdrawer, menu);
            return true;
        }
        return super.onCreateOptionsMenu(menu);
    }
    /*生命周期回调方法*/
}