package <%=packageRoot%>.controller.crud;

import <%=packageRoot%>.model.<%=name%>;
<% if( hasVO ) { -%>
import <%=packageRoot%>.vo.crud.<%=name%>VO;
<% } -%>
import net.ymate.platform.core.beans.support.PropertyStateSupport;
import net.ymate.platform.core.util.UUIDUtils;
import net.ymate.platform.persistence.Fields;
import net.ymate.platform.persistence.IResultSet;
import net.ymate.platform.persistence.Page;
import net.ymate.platform.persistence.Params;
import net.ymate.platform.persistence.jdbc.JDBC;
import net.ymate.platform.persistence.jdbc.annotation.Transaction;
import net.ymate.platform.persistence.jdbc.base.impl.BeanResultSetHandler;
import net.ymate.platform.persistence.jdbc.query.IDBLocker;
import net.ymate.platform.persistence.jdbc.query.SQL;
import net.ymate.platform.validation.validate.VRequired;
import net.ymate.platform.webmvc.annotation.Controller;
import net.ymate.platform.webmvc.annotation.RequestMapping;
import net.ymate.platform.webmvc.annotation.RequestParam;
import net.ymate.platform.webmvc.base.Type;
import net.ymate.platform.webmvc.util.WebResult;
import net.ymate.platform.webmvc.view.IView;
import org.apache.commons.lang.ArrayUtils;
import org.apache.commons.lang.StringUtils;

/**
 * 控制器
 * @author generate by <%=extra.author%> <%=extra.version%>
 * @date <%=extra.date%>
 * @version 1.0
 */
@Controller
@Transaction
@RequestMapping(value = "<%=routeName%>")
public class <%=className%> {

    /**
     * 根据条件检索列表
     *
     * @param keyword    检索关键字
    <%_ fields.forEach(function (p,i) { -%>
      <%_ if( p.isRegion) { -%>
     * @param begin<%= p.alias %> <%= p.comment %>最大值
     * @param end<%= p.alias %> <%= p.comment %>最小值
      <%_ } else { -%>
     * @param <%= p.name %> <%= p.comment %>
      <%_ } -%>
    <%_ }); -%>
    <%_ entityExtra.query.fields.forEach(function (p,i) { -%>
      <%_ if( p.isRegion ) { -%>
     * @param begin<%= p.relationAlias %> <%= p.comment %>最大值
     * @param end<%= p.relationAlias %> <%= p.comment %>最小值
      <%_ } else { -%>
     * @param <%= p.relationName %> <%= p.comment %>
      <%_ } -%>
    <%_ }); -%>
     * @param page       查询页号
     * @param pageSize   分页大小
     * @return           返回执行结果视图
     * @throws Exception 可能产生的任何异常
     */
    @RequestMapping(value = "/query", method = Type.HttpMethod.GET)
    public IView query(
            <%_ if(query.length > 0) { -%>
            @RequestParam final String keyword,
            <%_ } -%>
            <%_ fields.forEach(function (p,i) { -%>
              <%_ if( p.isRegion ) { -%>
            @RequestParam final <%= p.type %> begin<%= p.alias %>,
            @RequestParam final <%= p.type %> end<%= p.alias %>,
              <%_ } else { -%>
            @RequestParam final <%= p.type %> <%= p.name %>,
              <%_ } -%>
            <%_ }); -%>
            <%_ entityExtra.query.fields.forEach(function (p,i) { -%>
              <%_ if( p.isRegion ) { -%>
            @RequestParam final <%= p.type %> begin<%= p.relationAlias %>,
            @RequestParam final <%= p.type %> end<%= p.relationAlias %>,
              <%_ } else { -%>
            @RequestParam final <%= p.type %> <%= p.relationName %>,
              <%_ } -%>
            <%_ }); -%>
            @RequestParam final int page,
            @RequestParam final int pageSize
    ) throws Exception {
        IResultSet <<%=name%><% if( hasVO ) { %>VO<% } %>> resultSet = JDBC.get().openSession(session -> {
            String prefix = session.getConnectionHolder().getDataSourceCfgMeta().getTablePrefix();
            Params params = Params.create();
            String sql = "SELECT "
                <%_ entityExtra.query.fields.forEach(function (p,i) { -%>
                + "<%= p.tableAlias %>.<%= p.field %> <%= p.relationField %>,"
                <%_ }); -%>
                + "<% if(tableAlias){ %><%= tableAlias %>.<% } %>*"
                + " FROM "+prefix+"<%= table %> <%= tableAlias %>"
                <%_ entityExtra.query.conditions.forEach(function (p,i) { -%>
                + " <%= p.join %> JOIN "+prefix+"<%= p.table %> <%= p.tableAlias %> ON <%= p.conditions[0] %>=<%= p.conditions[1] %>"
                  <%_ for (var i = 2; i < p.conditions.length; i += 2) { -%>
                    <%_ if (i < p.conditions.length-1) { -%>
                + " AND <%- p.conditions[i] %>=<%- p.conditions[i+1] %>"
                    <%_ } -%>
                  <%_ } -%>
                <%_ }) -%>
                + " WHERE 1=1";
            <%_ entityExtra.query.params.forEach(function (p,i) { -%>
            params.add("<%=p%>");
            <%_ }) -%>
            <%_ if(query.length > 0) { -%>
            if (StringUtils.isNotBlank(keyword)) {
                sql += " AND (";
              <%_ query.forEach(function (p,i) { -%>
                sql += " <% if(tableAlias){ %><%= tableAlias %>.<% } %><%= p.field %> like ?<% if (i < query.length-1) { -%> OR<% } %>";
                params.add("%" + keyword + "%");
              <%_ }); -%>
                sql += ")";
            }
            <%_ } -%>
            <%_ fields.forEach(function (p,i) { -%>
              <%_ if( p.isRegion ) { -%>
            if (begin<%= p.alias %> != null && end<%= p.alias %> != null) {
                sql += " AND <% if(tableAlias){ %><%= tableAlias %>.<% } %><%= p.field %> BETWEEN ? END ?";
                params.add(begin<%= p.alias %>).add(end<%= p.alias %>);
            } else if (begin<%= p.alias %> != null) {
                sql += " AND <% if(tableAlias){ %><%= tableAlias %>.<% } %><%= p.field %>>=?";
                params.add(begin<%= p.alias %>);
            } else if (end<%= p.alias %> != null) {
                sql += " AND <% if(tableAlias){ %><%= tableAlias %>.<% } %><%= p.field %><=?";
                params.add(end<%= p.alias %>);
            }
              <%_ } else { -%>
            if (StringUtils.isNotBlank(<%= p.name %>)) {
                sql += " AND <% if(tableAlias){ %><%= tableAlias %>.<% } %><%= p.field %>=?";
                params.add(<%= p.name %>);
            }
              <%_ } -%>
            <%_ }); -%>
            return session.find(
                    SQL.create(sql).param(params),
                    new BeanResultSetHandler <>(<%=name%><% if( hasVO ) { %>VO<% } %>.class),
                    Page.createIfNeed(page, pageSize)
            );
        });
        return WebResult.succeed().data(resultSet).toJSON();
    }

    /**
     * 创建新记录
     *
<%_ fields.forEach(function (p,i) { -%>
  <%_ if (p.name!='id'){ -%>
     * @param <%= p.name %> <%= p.comment %>
  <%_ } -%>
<%_ }); -%>
     * @return 返回执行结果视图
     * @throws Exception 可能产生的任何异常
     */
    @RequestMapping(value = "/create", method = Type.HttpMethod.POST)
    public IView create(<% -%>
<%_ fields.forEach(function (p,i) { -%>
  <%_ if (p.name!='id'){ -%>
            @RequestParam final <%= p.type %> <%= p.name %><% -%>
        <%_ if (i < fields.length-1) { %>,<% } -%>
  <% }%>
<%_ });-%>
    ) throws Exception {
        String id = UUIDUtils.UUID();
        <%=name%>.builder()
                .id(id)
<%_ fields.forEach(function (p,i) { -%>
  <%_ if (p.name!='id'){ -%>
                .<%= p.name %>(<%= p.name %>)
  <%_ } -%>
<%_ }); -%>
                .build().save();
        return WebResult.succeed().toJSON();
    }

    /**
     * 根据标识修改数据
     *
<%_ fields.forEach(function (p,i) { -%>
     * @param <%= p.name %> <%= p.comment %>
<%_ }); -%>
     * @return 返回执行结果视图
     * @throws Exception 可能产生的任何异常
     */
    @Transaction
    @RequestMapping(value = "/modify", method = Type.HttpMethod.POST)
    public IView modify(<% -%>
    <%_ fields.forEach(function (p,i) { %>
            @RequestParam final <%= p.type %> <%= p.name %><% -%>
            <%_ if (i < fields.length-1) { %>,<% } -%>
    <%_ }); %>
    ) throws Exception {
        <%=name%> entity = <%=name%>.builder().id(id).build().load(IDBLocker.DEFAULT);
        PropertyStateSupport<<%=name%>> state = PropertyStateSupport.create(entity, true);
        state.bind().bind()
<%_ fields.forEach(function (p,i) { -%>
  <%_ if (p.name!='id'){ -%>
                .<%= p.name %>(<%= p.name %>)
  <%_ } -%>
<%_ }); -%>
                .build();
        String[] propNames = state.getChangedPropertyNames();
        if (ArrayUtils.isNotEmpty(propNames)) {
            state.unbind().update(Fields.create(propNames));
        }
        return WebResult.succeed().toJSON();
    }

    /**
     * 根据标识删除数据
     *
     * @param id 唯一标识
     * @return 返回执行结果视图
     * @throws Exception 可能产生的任何异常
     */
    @Transaction
    @RequestMapping(value = "/remove", method = Type.HttpMethod.POST)
    public IView remove(@VRequired @RequestParam String id) throws Exception {
        String[] ids = StringUtils.split(id, ',');
        JDBC.get().openSession(session -> session.delete(<%=name%>.class, ids));
        return WebResult.succeed().toJSON();
    }

    /**
     * 根据标识查询详情
     *
     * @param id 唯一标识
     * @return 返回执行结果视图
     * @throws Exception 可能产生的任何异常
     */
    @RequestMapping(value = "/detail", method = Type.HttpMethod.GET)
    public IView detail(@VRequired @RequestParam String id) throws Exception {
        <%_ if( hasVO ) { -%>
        <%=name%>VO entity = JDBC.get().openSession(session -> {
            String prefix = session.getConnectionHolder().getDataSourceCfgMeta().getTablePrefix();
            Params params = Params.create();
            String sql = "SELECT "
                <%_ entityExtra.query.fields.forEach(function (p,i) { -%>
                + "<%= p.tableAlias %>.<%= p.field %> <%= p.relationField %>,"
                <%_ }); -%>
                + "<% if(tableAlias){ %><%= tableAlias %>.<% } %>*"
                + " FROM "+prefix+"<%= table %> <%= tableAlias %>"
                <%_ entityExtra.query.conditions.forEach(function (p,i) { -%>
                + " <%= p.join %> JOIN "+prefix+"<%= p.table %> <%= p.tableAlias %> ON <%= p.conditions[0] %>=<%= p.conditions[1] %>"
                  <%_ for (var i = 2; i < p.conditions.length; i += 2) { -%>
                    <%_ if (i < p.conditions.length-1) { -%>
                + " AND <%- p.conditions[i] %>=<%- p.conditions[i+1] %>"
                    <%_ } -%>
                  <%_ } -%>
                <%_ }) -%>
                + " WHERE <% if(tableAlias){ %><%= tableAlias %>.<% } %>id=?";
            <%_ entityExtra.query.params.forEach(function (p,i) { -%>
            params.add("<%=p%>");
            <%_ }) -%>
            params.add(id);
            return session.findFirst(SQL.create(sql).param(params), new BeanResultSetHandler <>(<%=name%>VO.class));
        });
        <%_ } else { -%>
        <%=name%> entity = <%=name%>.builder().id(id).build().load();
        <%_ } -%>
        return WebResult.succeed().data(entity).toJSON();
    }
}
