package com.yanzuoguang.dao.cond;

import com.yanzuoguang.dao.impl.SqlCodeParameter;
import com.yanzuoguang.dao.impl.SqlDataField;
import com.yanzuoguang.util.base.ObjectHelper;
import com.yanzuoguang.util.helper.ArrayHelper;
import com.yanzuoguang.util.helper.StringHelper;

import java.util.Arrays;
import java.util.List;

/**
 * 包含的值字段
 *
 * @author 颜佐光
 */
public class SqlCondDefault extends SqlCondBase<SqlCondDefault> {

    public SqlCondDefault(String... field) {
        this(Arrays.asList(field));
    }

    public SqlCondDefault(List<String> fields) {
        this(null, fields);
    }

    public SqlCondDefault(Runnable debugRunnable, String... field) {
        this(debugRunnable, Arrays.asList(field));
    }

    public SqlCondDefault(Runnable debugRunnable, List<String> fields) {
        super(fields);
        super.debugRunnable = debugRunnable;
    }


    /**
     * 当前条件是否相等
     *
     * @return
     */
    @Override
    protected int getCondType(Object model, SqlDataField sqlField) {
        return getCondType(fields, model, sqlField);
    }

    /**
     * 获取sql类型该
     *
     * @param fields
     * @param model
     * @param sqlField
     * @return
     */
    public static int getCondType(List<String> fields, Object model, SqlDataField sqlField) {
        // 判断是否包含输入参数
        boolean isInputField = !fields.isEmpty();
        // 判断是否属于条件
        boolean isCond = sqlField.getCodes().size() > 0 && sqlField.isAuto();
        boolean isConst = sqlField.getCodes().size() > 0 && !sqlField.isAuto();
        if (isInputField && isCond) {
            for (String field : fields) {
                // 获取值
                Object val = ObjectHelper.get(model, field);
                if (StringHelper.isEmpty(val) || StringHelper.isEmptyArray(val)) {
                    continue;
                }
                // 代码片段
                if (val instanceof SqlCodeParameter && ArrayHelper.isEmpty(((SqlCodeParameter) val).getLatitude())) {
                    continue;
                }
                // 只要有值不为空,则条件满足
                return COND_TYPE_CODE_COND;
            }
        } else if (isConst) {
            // 常量SQL语句
            return COND_TYPE_CODE_COND;
        } else if (isInputField && !isConst && !isCond) {
            // 前台输入参数,直接参数对接到SQL语句中
            return COND_TYPE_CONST_ONLY_PARA;
        }
        return COND_TYPE_NONE;
    }

    /**
     * 将当前条件复制为新的对象
     *
     * @return
     */
    @Override
    public SqlCondDefault copy() {
        SqlCondDefault cond = new SqlCondDefault(this.debugRunnable, this.fields);
        return cond;
    }
}