/**
 * 生成器职能
 * 1.生成最基础的restful 风格的curd  
 *   store： 创建
 *   index：该模型的所有记录
 *   show： 该模型的某条记录 根据主键
 *   destory：模型删除 根据主键
 *   update： 模型更新 根据主键
 *   默认查找，操作规则以主键为条件 mysql主键默认为 id， mongodb默认组件为_id
 * 
 * 2.根据外键生成外键的查找代码 如 课程表上有外键teacher_id，则自动生成 根据teacher_id查找出所有课程记录
 * 3.多条件查询 根据多条件查询字段生成api
 * 4.扩展系统的 curd api
 * 
 * 3.支持多条件查询
 *   支持配置 label、placeholder,默认input组为inline类型
 *   3.1 根据该模型的自有字段进行过滤
 *   3.2 外键过滤
 *   3.3 过滤的类型可能为
 *     字符串：当前模型自有字段进行过滤
 *     时间：指定当前模型的时间字段进行过滤
 *     类型：使用 element ui 的 select 标签
 *          自定义类型：用户自定义类型值 用户需要指定label,自定义类型值映射到数据库的字段，自定义类型映射
 *          或者在用户定义模型的时候，如果为类别属性，则让用户输入 类型值 与 具体值的映射关系 
 *          如 {  
 *               couponType: String, 
 *               label: '优惠券类型',
 *               placeholder: '请选择优惠券类型',
 *               formType: {
 *                  type:'type', 
 *                  chineseMap: { 1: '免费优惠券', 2: '收费优惠券'  }
 *                } 
 *            }
 * 多条件查询支持的类型：
 * text：like 取键为字段
 * select：in 
 *   自定义映射 取键为字段
 *   外键： 取对应外键的key为字段
 * singleDate：== 取键为字段
 * betweenDate: between 取start和end属性为字段如不指定默认系统自带的createAt和updatedAt
 * 时间类型存储格式默认 年月日
 *
 *                  
 * 4.excel导入导出  
 * 
 * 5.关于api的中间件权限默认配置
 * store: loginrequired
 * index
 * show： 
 * destory：loginrequired
 * update： loginrequired 
 * 查询相关 默认没有权限认证
 */


/***
 * 命令行
 * app: generator app <app-name | 项目名称>
 * model: generator make:model -m <必填 | 模型名称 > -s < 可选 | 生成测试数据 >
 * api：generator make:api -m <可选 | 模型名称 | 默认全部>
 * view: generator make:view -m <可选 | 模型名称 | 默认全部>
 */
module.exports = {
    tableHide:[],
    modelName: '优惠券',
    // 关联数据表，默认 文件名去除.js
    table:'test',
    // 数据表字段
    fields: {
        couponName: {
            type: 'string', // 数据库类型
            comment: '优惠券名称',
            // meta 可选 在生成表单，表格时可用来美好
            meta: {
                formType: 'input', // 可选 element ui 表单类型 输入，时间，开关等，默认 input
                   /**
             * 映射关系
             * input=>el-input
             * inputNumber=>el-input-number
             * switch=>el-switch 值必须为0或1
             * date=>el-date-picker
             * time=>el-time-select
             * image=>el-upload
             * select=>el-select
             * text=>vue-qull-editor 富文本编辑器
             */
                isInline: false, // 可选，默认表单inline类型
                inputType: 'text', // 可选 ， HTML 原生类型 如 text password 等 默认 text
                placeholder: '' // 可选 表单提示文字

            },
            noRequired:true // 标识该字段不是必填，在生成基础验证规则时有用
        },
        startTime: {
            type: 'date',
            comment: '发放时间',
            meta: {
                formType: 'date',
                placeholder: '请选择发放时间'

            }
        },
        product: {
            type: 'number',
            comment: '适用产品',
            meta: {
                formType: 'select',
                placeholder: '请选择适用产品',
                chineseMap: {
                    1: '全平台通用',
                    2: '城际客运',
                    3: '线路包车'
                }
            }
        },
         // 关联表的select
        roadLine: {
            type: 'string',
            comment: '适用线路',
            meta: {
                formType: 'select',
                // 如果是select类型 则需要使用到el-option el-option默认遍历的变量名称是 键+Options 如roadLineOptions
                isManySel: true, // 是否为多选，默认false
                chineseMap: {
                    useForeign: 'coupon_road' // 根据外键生成 select
                }
            }
        },
        userId: {
            type: 'number',
            comment: '添加人',
            meta: {
                formType: 'text',
                inputType: 'hidden',
                chineseMap: {
                    useForeign: 'coupon_user'
                }
            }
        },
        disCount: {
            type: 'number',
            comment: '折扣',
            meta: {
                formType: 'inputNumber', // 计数器
                min: '',
                max: '',
                step: '',
                size: '',
                controlsPosition: 'right'
            }
        },
        status: {
            type: 'number',
            comment: '状态',
            meta: {
                formType: 'switch',
                activeText: '禁用',
                inactiveText: '启用',
                activeValue: 1,
                inactiveValue: 0
            }
        },
        cover: {
            type: 'string',
            comment: '封面',
            meta: {
                formType: 'image',// 图片组件
                uploadUrl: '' // 可选 ，默认使用系统的文件上传服务器 
            } 

        },
        detail: {
            type: 'text',
            comment: '营销富文本详情',
            meta: {
                formType: 'richText',
                uploadUrl: '' // 富文本文件上传地址 
            }
        }
    },
    // 除了系统自带的 添加、编辑表单，用户可以通过该选项添加其他表单
    // 目前 用户或者的form里面的按钮不会自动生成事件处理函数
    extendForm: {
        couponHandle: {
            size: 'mini',
            title: '优惠券', // 添加状态为 添加优惠券 ，编辑状态为编辑优惠券
            fields: {
                // 如果不指定 label 默认使用绑定字段的comment 如果都没有 则直接使用字段名称
                // fields的属性 映射的 fields 中
                couponName: {
                    label: '优惠券名称', // 可选
                    placeholder: '请输入优惠券名称', // 可选，默认使用 '请输入'+label
                    isInline: false, // 可选，默认表单inline类型
                    type: 'input', // 必选 element ui 表单类型 输入，时间，开关等
                    formType: 'text' // 可选 原生表单类型 text, textarea, password, number 等  
                },
                startTime: {
                    label: '发放时间',
                    placeholder: '发放时间',
                    type: {
                        type: 'date',
                        dataFormat: 'u' // 保存数据库的时间格式
                    }
                },
                product: {
                    label: '适用产品',
                    placeholder: '请选择适用产品',
                    type: {
                        type: 'select',
                        chineseMap: {
                            1: '全平台通用',
                            2: '城际客运',
                            3: '线路包车'
                        }
                    }
                },
                // 关联表的select
                roadLine: {
                    label: '适用线路',
                    type: {
                        type: 'select',
                        isManySel: true, // 是否为多选，默认false
                        chineseMap: {
                            useForeign: 'coupon_road' // 根据外键生成 select
                        }
                    }
                },
                disCount: {
                    label: '折扣',
                    type: {
                        type: 'inputNumber', // 计数器
                        min: '',
                        max: '',
                        step: '',
                        size: '',
                        controlsPosition: 'right'
                    }
                },
                status: {
                    label: '状态',
                    type: {
                        type: 'switch',
                        activeText: '禁用',
                        inactiveText: '启用',
                        activeValue: 1,
                        inactiveValue: 0
                    }
                },
                cover: {
                    label: '封面',
                    type: 'image', // 图片组件

                },
                detail: {
                    label: '营销富文本详情',
                    type: 'richText', // 富文本组件
                }

            },
            // 表单验证规则
            rules: {
                couponName: [
                    { required: true, message: '请输入活动名称', trigger: 'blur' },
                    { min: 3, max: 5, message: '长度在 3 到 5 个字符', trigger: 'blur' },
                    { validator: (rule, value, callback) => { if (value == '') { callback(new Error('请输入优惠券名称')) } }, trigger: 'blur' }
                ],
            },
            showCancel: true, // 默认 true
            canCelText: '取消', // 默认取消
            sureText: '确定', // 默认确定
            sureType: 'danger',

        },

    },
    // 表单的验证规则 键：表单名称，值表单规则 systemForm 为系统自带表单
    formRules:{
        systemForm: {
            couponName: [
                { required: true, message: '请输入活动名称', trigger: 'blur' },
                { min: 3, max: 5, message: '长度在 3 到 5 个字符', trigger: 'blur' },
                { validator: (rule, value, callback) => { if (value == '') { callback(new Error('请输入优惠券名称')) } }, trigger: 'blur' }
            ],
        },
        // 自定义的表单验证规则
        couponHandle: [

        ]

    },
    // 多条件查询
    /**
     * text like 取键为字段
     * select/manyselect in 取键为字段
     * singleDate 字段取键
     * doubleDate 字段取键 日期之间的字段 取 start属性和end属性 start和end如果不指定默认为startTime和endTime
     * 
     */
    filters: {
        couponName: {
            label: '优惠券名称',
            type: 'text',
        },
        person: {
            label: '适用人群',
            type: {
                type: 'select',

                chineseMap: [
                    {
                        label:"男",
                        value:1
                    },
                    {
                        label:"女",
                        value:1
                    }
                ]
            }
        },
        createTime: {
            label: '开始月份',
            type: 'date'
        },
        roadLine: {
            label: '请选择线路',
            type: {
                type: 'select',
                chineseMap: {
                    useForeign: 'coupon_road'
                }
            }
        }
    },
    // 表格配置 可选，
    // 除了系统自带的表格，用户可以通过该选项自定义其他表格，系统自带表格默认显示规则为 默认直接显示出隐藏属性之外的所有属性
    // 通过systemTable 对系统表格进行修改
    // 扩展表格的关联查询，目前只是添加接口进行映射效率较低，正确做法表格的数据应该全部由后端返回
    extendTable: {
        systemTable: {
            product: {
                comment: '所属产品',
                valueMap: {
                    1: '城际客运,success',
                    2: '线路包车,warning',
                }
            },
            // 默认系统表格的操作栏 有 编辑和删除按钮 通过 handles进行扩展或删除
            // 添加的按钮，默认绑定事件为按钮名称 如 changePrice, 事件处理函数默认内容为 console.log('changePrice click') ，回显form数据操作
            // 请自行前往 页面补充处理函数
            // 在操作列中，某按钮被点击会将当前列的数据回显在关联的表单中，如果他们的数据是对应的
            handles: {
                editBtn: null,
                delBtn: null, 
                addBtn:null, // 删除自带添加、编辑和删除按钮
                changePrice: {
                    text: '改价',
                    type: 'primary', // 按钮类型
                    // 按钮控制某个表单显示时有用 在 这个为例 在 vue 中 会生成 couponHandleShow 变量控制 couponHandle表单是否显示
                    // 改按钮被点击时会让 couponHandleShow 为 true
                    showForm: 'couponHandle', 
                }
            }
        }
    },
    // 其他操作，用户在页面添加其他按钮 系统会将其展示在filters的下面，表格的上面，系统已有按钮的后面
    otherHandle:{
        changePrice: {
            text: '改价',
            type: 'primary', // 按钮类型
            showForm: 'couponHandle', 
        }
    },
    // 外键配置 目前不会在数据库生成外键，主要用于关联查询！,目前暂不支持多对多
    // key 表示外键名称
    foreign: {
        couponUser: {
            key: 'user_id', // 当前模型的外键字段
            refer: 'id', // 关联表的字段
            referLabel: 'userName', // 关联表用于展示的字段，主要用于 table,form的展示
            onTable: 'user', // 关联的数据表
            foreignDesc: '外键描述'
        },
    },
    // 扩展系统的 curd
    extendActions:{
        // create,update 会根据 guarde/fillable进行赋值，这里暂不支持用户手动配置
        show: {
            // 除了系统自带的方法，这个配置会生成 findCouponByCouponName,findCouponByUserId,findCouponByUserIdAndId 模型、控制器方法
            by: ['couponName', 'user_id', 'user_id,id']
        },
        destory: {
            // 同理
            by: ['couponName', 'user_id', 'user_id,id']
        },
        update: {
            by: ['']
        }

    },
    importExcel: true, // 导入excel
    exportExcel: true, // 导出excel
    primaryKey: 'id', // 主键 mysql默认 id ,mongodb 默认_id
    timestamps: false, // 是否主动维护时间 created_at updated_at deleted_at 第二阶段
    dateFormat: 'U',  // 日期属性在数据库的存储方式
    fillable: ['name'], // 允许批量赋值字段 第二阶段
    guarded: [], // 不能被批量赋值的字段 为空表示全部允许批量赋值 第二阶段
    softDelete: true, // 是否使用软删除 第二阶段
    hidden: [], // 隐藏的属性
    middlewares:['loginRequired','permissionRequired'], // 该模型需要登录，权限认证
    isForm:true ,// 表示该模型使用表单管理
}