package com.common.lib_base.base;

import android.content.Context;
import android.content.Intent;
import android.graphics.Color;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.Fragment;

import com.common.lib_base.utils.LogUtils;
import com.gyf.immersionbar.ImmersionBar;

/**
 * Date: 2022/5/31 0031 11:01
 * Description:
 */
public abstract class BaseFragment extends Fragment {

    // 当前类名
    public String mTag = getClass().getSimpleName()+"--";


    public View rootView = null;

    // 延迟加载相关
    public boolean isViewCreated;
    public boolean isFirstVisible = true;
    public boolean isFragmentVisible;

    public Context mContext;
    public AppCompatActivity mActivity;

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {

        if (rootView == null) {
            rootView = inflater.inflate(setLayout(), container, false);
        }

        mContext = getActivity();
        mActivity = (AppCompatActivity) getActivity();

        isViewCreated = true;

        setStatusBar();

        initView(rootView);

        initData();

        initListener(rootView);

        initLoginListener();


        //Adapter 默认展示的那个 Fragment ，或者隔 tab 选中的时候，
        //由于没有预加载tab 在 setUserVisibleHint 中 isVisibleToUser = true 的时候 view 还没创建成功
        //即 isViewCreated = false 所以该 tab 的请求延迟到了 view 创建完成了
        //但是已经缓存的 Fragment 就不可以走这里了因为预加载 Fragment 在 onCreateView 中 isFragmentVisible 为 false
        if (isFragmentVisible && isFirstVisible) {
            LogUtils.e(mTag+"Adapter 默认展示的那个 Fragment ，或者隔 tab 选中的时候  requestFirstData 推迟到 onCreateView 后 ");
            requestFirstData();
            isFirstVisible = false;
        }


        return rootView;
    }


    protected void initLoginListener(){

    }


    /**
     * 延迟加载
     * @param isVisibleToUser
     */
    @Override
    public void setUserVisibleHint(boolean isVisibleToUser) {
        super.setUserVisibleHint(isVisibleToUser);

        isFragmentVisible = isVisibleToUser;

        //当 View 创建完成切 用户可见的时候请求 且仅当是第一次对用户可见的时候请求自动数据
        if (isVisibleToUser && isViewCreated && isFirstVisible) {
            LogUtils.e(mTag+"创建view时，只有自动请求一次数据  requestData");
            requestFirstData();
            isFirstVisible = false;
        }

        // 由于每次可见都需要刷新所以我们只需要判断  Fragment 展示在用户面面前了，view 初始化完成了 然后即可以请求数据了
        if (isVisibleToUser && isViewCreated) {
            LogUtils.e(mTag+"切换时可见  requestDataFragmentVisible");
            requestDataFragmentVisible();
        }

        if (!isVisibleToUser && isViewCreated) {
            LogUtils.e(mTag+"不可见  stopRefresh");
            stopRefresh();
        }
    }

    /**
     * 只有在 Fragment 第一次对用户可见的时候才去请求
     */
    public void requestFirstData() {

    }

    /**
     * 每次 Fragment 对用户可见都会去请求
     */
    public void requestDataFragmentVisible() {

    }

    /**
     * 当 Fragment 不可见的时候停止某些轮询请求的时候调用该方法停止请求
     */
    public void stopRefresh() {

    }


    public void setStatusBar() {

        if (ImmersionBar.isSupportStatusBarDarkFont()) {
            // 状态栏字体颜色为深色(android6.0以上或者miuiv6以上或者flymeOS4+)
            ImmersionBar.with(this)
//                    .fitsSystemWindows(true)
                    .statusBarDarkFont(true)
                    .init();
        } else {
            ImmersionBar.with(this)
//                    .fitsSystemWindows(true)
                    .statusBarColorInt(Color.BLACK)
                    .navigationBarColorInt(Color.BLACK)
                    .autoDarkModeEnable(true)
                    .init();
        }

    }


    public abstract int setLayout();

    public abstract void initView(View view);

    public abstract void initData();

    public abstract void initListener(View view);



    /**
     * 跳转到指定的Activity
     *
     * @param cls 指定页面
     */
    public void startActivity(Class<?> cls) {
        startActivity(new Intent(mContext, cls));
    }


    public void startActivityAndFinish(Class c) {
        Intent intent = new Intent(mActivity, c);
        intent.addFlags(intent.FLAG_ACTIVITY_CLEAR_TOP & intent.FLAG_ACTIVITY_NEW_TASK);
        startActivity(intent);

        mActivity.finish();
    }
}
