package com.zone.lib.utils.activity_fragment_ui;


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

import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentActivity;
import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentTransaction;

/**
 * Created by Zone on 2016/1/25.
 */
public class FragmentSwitcher {
    public static final String TAG="FragmentSwitcher";
    private final FragmentActivity frameActivity;
    private final int frameId;
    private BackStatue allowBack=BackStatue.NO_BACK;
    private FragmentManager manager;
    private List<FragmentEntity> fragmentEntityList=new ArrayList<FragmentEntity>();
    private FragmentEntity nowFragmentEntity=null;
    private boolean isFirst=true;

    public enum BackStatue{
        NO_BACK,BACK;
    }
    public static class FragmentEntity{
        public Fragment fragment;
        public String tag=null;
        public int ani_in=-1;
        public int ani_out=-1;
    }
    public void initFragment(Fragment... fragments){
        for (int i = 0; i < fragments.length; i++) {
            FragmentEntity entity = new FragmentEntity();
            entity.fragment=fragments[i];
            if(!(ani_in_pri!=-1||ani_out_pri!=-1)){
                entity.ani_in=ani_in_pri;
                entity.ani_out=ani_out_pri;
            }
            entity.tag=TAG+i;
            fragmentEntityList.add(entity);
        }
        init=true;
    }
    public void initFragment(FragmentEntity... fragments){
        for (int i = 0; i < fragments.length; i++) {
            if(fragments[i].fragment==null){
                throw new IllegalArgumentException("FragmentEntity里的fragment 不能为null");
            }
            fragmentEntityList.add(fragments[i]);
        }
        init=true;
    }
    public void initFragment(Class... fragments){
        for (int i = 0; i < fragments.length; i++) {
            Class fragment = fragments[i];
            if(!Fragment.class.isAssignableFrom(fragment))
                throw new IllegalArgumentException("类型不是frament 不能展示");
            else{
                FragmentEntity entity = new FragmentEntity();
                entity.fragment=Fragment.instantiate(frameActivity,fragment.getName());
                if((ani_in_pri!=-1||ani_out_pri!=-1)){
                    entity.ani_in=ani_in_pri;
                    entity.ani_out=ani_out_pri;
                }
                entity.tag=TAG+i;
                fragmentEntityList.add(entity);
            }
        }
        init=true;
    }
    private boolean init=false;
    /**
     *
     * @param frameActivity
     * @param frameId  被替换的frame
     * @param allowBack  是否允许回退
     */
    public FragmentSwitcher(FragmentActivity frameActivity, int frameId,BackStatue allowBack) {
        this.frameActivity = frameActivity;
        this.frameId = frameId;
        this.allowBack=allowBack;
    }
    /**
     * 默认:不允许 回退
     * @param frameActivity
     * @param frameId
     */
    public FragmentSwitcher(FragmentActivity frameActivity, int frameId) {
        this(frameActivity,frameId,BackStatue.NO_BACK);
    }


    //全局动画
    private static int ani_in=-1;
    private static int ani_out=-1;
    public static void setDefaultAnimal(int ani_in,int ani_out){
        FragmentSwitcher.ani_in=ani_in;
        FragmentSwitcher.ani_out=ani_out;
    }
    //个体动画
    private  int ani_in_pri=-1;
    private  int ani_out_pri=-1;
    public  void setPriDefaultAnimal(int ani_in_pri,int ani_out_pri){
        if(init)
            throw new IllegalStateException("this method must be used  before init");
        this.ani_in_pri=ani_in_pri;
        this.ani_out_pri=ani_out_pri;
    }

    private void checkAni(FragmentTransaction tran, FragmentEntity entity){
        if (entity!=null) {
            if((entity.ani_in!=-1||entity.ani_out!=-1)){
                tran.setCustomAnimations(entity.ani_in,entity.ani_out);
    //			tran.setCustomAnimations(android.R.anim.fade_in,android.R.anim.fade_out);
            }else{
                if((ani_in!=-1||ani_out!=-1)){
                    tran.setCustomAnimations(ani_in,ani_out);
                }
            }
        }else{
            if((ani_in_pri!=-1||ani_out_pri!=-1)){
                tran.setCustomAnimations(ani_in_pri,ani_out_pri);
                //			tran.setCustomAnimations(android.R.anim.fade_in,android.R.anim.fade_out);
            }else{
                if((ani_in!=-1||ani_out!=-1)){
                    tran.setCustomAnimations(ani_in,ani_out);
                }
            }
        }
    }

    public void switchPage(int  index){
        switchPage(fragmentEntityList.get(index));
    }
    public void switchToNull(){
        switchPage(null);
    }
    private void switchPage(FragmentEntity entity) {
        manager = frameActivity.getSupportFragmentManager();
        FragmentTransaction tran = manager.beginTransaction();
        checkAni(tran, entity);
        if(!isFirst){
            if (entity!=null) {
                if (nowFragmentEntity != null) {
                    if (nowFragmentEntity.equals(entity)) {
                        // 还是这个页面
                        return;
                    }
                    Fragment targetFm = null;
                    if(manager.getFragments()!=null){
                        for (Fragment item : manager.getFragments()) {
                            if (item!=null&&item.equals(entity.fragment)) {
                                // 如果有直接控制 显隐
                                tran.hide(nowFragmentEntity.fragment);
                                targetFm=nowFragmentEntity.fragment;
                                tran.show(entity.fragment);
                                nowFragmentEntity=entity;
                            }
                        }
                    }
                    if (targetFm == null) {
                        // 没有则 生成 然后显示隐藏
                        tran.hide(nowFragmentEntity.fragment);
                        tran.add(frameId, entity.fragment, entity.tag).show(entity.fragment);
                        nowFragmentEntity=entity;
                    }
                }else{
                    //nowFragmentEntity 是null
                    Fragment targetFm = null;
                    if(manager.getFragments()!=null){
                        for (Fragment item : manager.getFragments()) {
                            if (item!=null&&item.equals(entity.fragment)) {
                                tran.show(entity.fragment);
                                nowFragmentEntity=entity;
                                targetFm=nowFragmentEntity.fragment;
                            }
                        }
                    }
                    if (targetFm == null) {
                        // 没有则 生成 然后显示隐藏
                        tran.add(frameId, entity.fragment, entity.tag).show(entity.fragment);
                        nowFragmentEntity=entity;
                    }
                }
            }else{
                //切换到 nullframent
                if(nowFragmentEntity!=null){
                    tran.hide(nowFragmentEntity.fragment);
                    nowFragmentEntity=null;
                }else{
                    return;
                }
            }
        }else{
            //第一次的时候
            if (entity!=null) {
                tran.add(frameId, entity.fragment,entity.tag).show(entity.fragment);
                nowFragmentEntity=entity;
            }else{
                return ;
            }
        }

        tranCommit(tran);
    }

    private void tranCommit(FragmentTransaction tran) {
        //第一次不可以回退  即第二次以后 通过allowBack 是否添加回退
        switch (allowBack) {
            case BACK:
                tran.addToBackStack(null);
                break;
            case NO_BACK:

                break;
            default:
                break;
        }
        tran.commit();
        isFirst=false;
    }


    public FragmentEntity getNowFragmentEntity() {
        return nowFragmentEntity;
    }

    public FragmentManager getManager() {
        return manager;
    }

    public List<FragmentEntity> getFragmentEntityList() {
        return fragmentEntityList;
    }


}