package cn.chenzhongjin.greendao.sample.ui.fragment;

import android.os.Bundle;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import com.dreamliner.lib.util.ValidateUtil;
import com.flyco.tablayout.listener.OnTabSelectListener;

import org.greenrobot.greendao.query.WhereCondition;

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

import cn.chenzhongjin.greendao.sample.R;
import cn.chenzhongjin.greendao.sample.database.User;
import cn.chenzhongjin.greendao.sample.database.UserDao;
import cn.chenzhongjin.greendao.sample.database.UserDao.Properties;
import cn.chenzhongjin.greendao.sample.databinding.FraOperationBinding;
import cn.chenzhongjin.greendao.sample.entity.OperationUser;
import cn.chenzhongjin.greendao.sample.eventbus.SelectEvent;
import cn.chenzhongjin.greendao.sample.eventbus.UserChangeEvent;
import cn.chenzhongjin.greendao.sample.ui.fragment.base.BaseFragment;

import static cn.chenzhongjin.greendao.sample.ui.fragment.DaoOperationFragment.BD_DAO_OPERATION_TYPE_KEY;
import static cn.chenzhongjin.greendao.sample.ui.fragment.DaoOperationFragment.DAO_OPERATION_INSERT_TYPE;
import static cn.chenzhongjin.greendao.sample.ui.fragment.DaoOperationFragment.DAO_OPERATION_SELECT_TYPE;
import static cn.chenzhongjin.greendao.sample.ui.fragment.DaoOperationFragment.DAO_OPERATION_UPDATE_TYPE;

public class OperationFragment extends BaseFragment {

    private FraOperationBinding mBinding;

    private OperationUser mOperationUser = new OperationUser();

    public static final String BD_USER_KEY = "user";

    private User mUser;

    public static OperationFragment newInstance(int type) {
        return newInstance(type, null);
    }

    public static OperationFragment newInstance(int type, User user) {
        Bundle args = new Bundle();
        args.putInt(BD_DAO_OPERATION_TYPE_KEY, type);
        args.putSerializable(BD_USER_KEY, user);
        OperationFragment fragment = new OperationFragment();
        fragment.setArguments(args);
        return fragment;
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        mBinding = FraOperationBinding.inflate(inflater, container, false);
        view = mBinding.getRoot();
        return view;
    }

    @Override
    protected void initViews(View view) {
        mBinding.setFra(this);

        mUser = (User) getArguments().getSerializable(BD_USER_KEY);
        if (null != mUser) {
            mOperationUser = new OperationUser(mUser.getName(), mUser.getSex(), mUser.getPhone());
        } else {
            mOperationUser.setSex("男");
        }
        mBinding.setUser(mOperationUser);

        mBinding.segmentTabLayout.setTabData(new String[]{"男", "女"});
        mBinding.segmentTabLayout.setOnTabSelectListener(new OnTabSelectListener() {
            @Override
            public void onTabSelect(int position) {
                mOperationUser.setSex(position == 0 ? "男" : "女");
            }

            @Override
            public void onTabReselect(int position) {
            }
        });
        if (!TextUtils.isEmpty(mOperationUser.getSex())) {
            mBinding.segmentTabLayout.setCurrentTab(mOperationUser.getSex().equals("男") ? 0 : 1);
        }
    }

    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.cancel_bt:
                pop();
                break;
            case R.id.sure_bt:
                switch (mType) {
                    case DAO_OPERATION_INSERT_TYPE:
                    case DAO_OPERATION_UPDATE_TYPE:
                        insertOrUpdate();
                        break;
                    case DAO_OPERATION_SELECT_TYPE:
                        select();
                        break;
                }
                break;
        }
    }

    private void insertOrUpdate() {
        if (TextUtils.isEmpty(mOperationUser.getName())) {
            showToast("请输入姓名");
            return;
        }
        if (TextUtils.isEmpty(mOperationUser.getPhone()) || !ValidateUtil.isValidate(ValidateUtil.PHONE_NUM, mOperationUser.getPhone())) {
            showToast("请输入正确的手机号码");
            return;
        }
        if (TextUtils.isEmpty(mOperationUser.getSex())) {
            showToast("请选择性别");
            return;
        }
        if (null == mUser) {
            mUser = new User();
        }
        mUser.setName(mOperationUser.getName());
        mUser.setSex(mOperationUser.getSex());
        mUser.setPhone(mOperationUser.getPhone());
        mUser.setTime(System.currentTimeMillis());
        mUserDao.insertOrReplace(mUser);
        postEvent(new UserChangeEvent());
        pop();
    }

    private String getContent(String content) {
        if (TextUtils.isEmpty(content)) {
            return "";
        }
        return content;
    }

    private void select() {
        List<WhereCondition> whereConditionList = new ArrayList<>();

        //模糊匹配姓名
        whereConditionList.add(Properties.Name.like("%" + getContent(mOperationUser.getName()) + "%"));
        //模糊匹配电话号码
        whereConditionList.add(Properties.Phone.like("%" + getContent(mOperationUser.getPhone()) + "%"));
        //精确匹配男/女
        if (!TextUtils.isEmpty(mOperationUser.getSex())) {
            whereConditionList.add(UserDao.Properties.Sex.eq(getContent(mOperationUser.getSex())));
        }
        postEvent(new SelectEvent(mUserDao.queryBuilder().where(Properties.Time.isNotNull(),
                whereConditionList.toArray(new WhereCondition[]{})).list()));
        pop();
    }
}