package me.iacn.mbestyle.ui.activity;

import android.app.Fragment;
import android.app.FragmentManager;
import android.app.FragmentTransaction;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.design.internal.BottomNavigationItemView;
import android.support.design.internal.BottomNavigationMenuView;
import android.support.design.widget.BottomNavigationView;
import android.support.v4.content.ContextCompat;
import android.support.v4.view.ViewCompat;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.MenuItem;
import android.widget.ImageView;

import java.lang.reflect.Field;
import java.util.Arrays;
import java.util.List;

import me.iacn.mbestyle.R;
import me.iacn.mbestyle.ui.fragment.AboutFragment;
import me.iacn.mbestyle.ui.fragment.ApplyFragment;
import me.iacn.mbestyle.ui.fragment.IconFragment;
import me.iacn.mbestyle.ui.fragment.RequestFragment;
import me.iacn.mbestyle.util.ScreenUtils;
import me.iacn.mbestyle.util.StatusBarUtils;

/**
 * Created by iAcn on 2017/2/18
 * Email [email protected]
 */

public class MainActivity extends AppCompatActivity implements BottomNavigationView.OnNavigationItemSelectedListener {

    private Toolbar mToolbar;

    private int mCurrentIndex = -1;
    private List<Fragment> mFragments;
    private FragmentManager mFragmentManager;

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

        setContentView(R.layout.activity_main);
        StatusBarUtils.setColor(this, ContextCompat.getColor(this, R.color.colorPrimary));

        BottomNavigationView bottomView = (BottomNavigationView) findViewById(R.id.bottom_bar);
        bottomView.setOnNavigationItemSelectedListener(this);
        setBottomIconOriColor(bottomView);

        mToolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(mToolbar);

        mFragments = Arrays.asList(
                new IconFragment(),
                new ApplyFragment(),
                new RequestFragment(),
                new AboutFragment());

        mFragmentManager = getFragmentManager();

        switchFragment(0);
        handleToolbarElevation(0);
    }


    @Override
    public boolean onNavigationItemSelected(@NonNull MenuItem item) {
        int order = item.getOrder();

        if (order >= 0 && order <= 3) {
            handleToolbarElevation(order);
            switchFragment(order);
            return true;
        }

        return false;
    }

    @Override
    public void onBackPressed() {
        if (mCurrentIndex == 2) {
            // 调用申请 Fragment 的 onBackPressed()
            // 以处理有选中时的取消操作
            RequestFragment fragment = (RequestFragment) mFragments.get(2);
            fragment.onBackPressed();
        } else {
            super.onBackPressed();
        }
    }

    private void setBottomIconOriColor(BottomNavigationView bottomView) {
        try {
            Field mMenuViewField = BottomNavigationView.class.getDeclaredField("mMenuView");
            mMenuViewField.setAccessible(true);
            BottomNavigationMenuView mMenuView = (BottomNavigationMenuView) mMenuViewField.get(bottomView);

            Field mButtonsField = BottomNavigationMenuView.class.getDeclaredField("mButtons");
            mButtonsField.setAccessible(true);
            BottomNavigationItemView[] mButtons = (BottomNavigationItemView[]) mButtonsField.get(mMenuView);

            Field mIconField = BottomNavigationItemView.class.getDeclaredField("mIcon");
            mIconField.setAccessible(true);

            for (BottomNavigationItemView item : mButtons) {
                ImageView mIcon = (ImageView) mIconField.get(item);
                mIcon.setImageTintList(null);
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public void setToolbarTitle(String title) {
        mToolbar.setTitle(title);
    }

    private void handleToolbarElevation(int index) {
        // 只在图标 Fragment 隐藏阴影
        ViewCompat.setElevation(mToolbar, index == 0 ? 0 : ScreenUtils.dip2px(this, 2));
    }

    private void switchFragment(int index) {
        if (index == mCurrentIndex) return;

        Fragment fragment = mFragments.get(index);
        FragmentTransaction transaction =
                mFragmentManager
                        .beginTransaction()
                        .setCustomAnimations(R.animator.fragment_in, R.animator.fragment_out);

        String indexString = String.valueOf(index);
        Fragment targetFragment = mFragmentManager.findFragmentByTag(indexString);

        if (mCurrentIndex != -1) {
            // 不是首次启动
            transaction.hide(mFragments.get(mCurrentIndex));
        }

        if (targetFragment == null) {
            // 之前没有添加过
            transaction.add(R.id.fl_content, fragment, indexString);
        } else {
            transaction.show(targetFragment);
        }

        transaction.commit();
        mCurrentIndex = index;
    }
}