package com.yanzuoguang.dao.impl;

import com.yanzuoguang.dao.cond.SqlCond;
import com.yanzuoguang.dao.cond.SqlCondDefault;
import com.yanzuoguang.util.helper.StringHelper;

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

/**
 * SQL语句的字段
 *
 * @author 颜佐光
 */
public class SqlDataField {

    /**
     * 前台参数名称,当没有前台参数时,则把当前字段当常量代码片段处理
     */
    private SqlCond cond = null;
    /**
     * 是否根据前台参数自动添加,false时保持永久添加模式,
     * 1. true为条件模式,即前台不输入参数时,则不增加相关代码片段
     * 2. false为敞亮模式,不管前台是否输入,该参数和片段必然会增加到后台执行语句中
     */
    private boolean auto = true;
    /**
     * 代码片段
     */
    private List<String> codes = new ArrayList<String>();

    /**
     * 条件对象
     */
    public SqlDataField() {
    }

    /**
     * 构造函数
     *
     * @param paraName 前台输入字段
     */
    public SqlDataField(String paraName) {
        this(paraName, StringHelper.EMPTY);
    }

    /**
     * 构造函数
     *
     * @param paraName 前台输入字段
     * @param condSql  条件语句
     */
    public SqlDataField(String paraName, String condSql) {
        this(new SqlCondDefault(paraName), condSql);
    }

    /**
     * 条件
     *
     * @param cond
     */
    public SqlDataField(SqlCond cond) {
        this(cond, StringHelper.EMPTY);
    }

    /**
     * 条件
     *
     * @param cond
     * @param condSql
     */
    public SqlDataField(SqlCond cond, String condSql) {
        this.cond = cond;
        this.add(condSql);
    }

    /**
     * 添加条件
     *
     * @param condSql
     * @return
     */
    public SqlDataField add(String condSql) {
        return this.add("{WHERE}", condSql);
    }

    /**
     * 添加条件
     *
     * @param codeName  字段名称
     * @param codeValue 代码内容
     * @return
     */
    public SqlDataField add(String codeName, String codeValue) {
        if (StringHelper.isEmpty(codeValue)) {
            return this;
        }
        this.codes.add(codeName);
        this.codes.add(codeValue);
        return this;
    }

    /**
     * 复制实体
     *
     * @return
     */
    public SqlDataField copy() {
        SqlDataField to = new SqlDataField();
        if (this.cond != null) {
            to.cond = this.cond.copy();
        }
        to.auto = this.auto;
        to.codes.addAll(this.codes);
        return to;
    }

    /**
     * 清除所有的代码片段
     *
     * @return
     */
    public SqlDataField clear() {
        this.codes.clear();
        return this;
    }

    public SqlCond getCond() {
        if (this.cond == null) {
            this.cond = new SqlCondDefault(StringHelper.EMPTY);
        }
        return cond;
    }

    public void setCond(SqlCond cond) {
        this.cond = cond;
    }

    public boolean isAuto() {
        return auto;
    }

    public void setAuto(boolean auto) {
        this.auto = auto;
    }

    public List<String> getCodes() {
        return codes;
    }

    public void setCodes(List<String> codes) {
        this.codes = codes;
    }
}