package dto

import (
	"github.com/gin-gonic/gin"
	"gorm.io/gorm"

	"go-admin/app/admin/models"
	"go-admin/common/dto"
	"go-admin/common/log"
	common "go-admin/common/models"
	"go-admin/tools"
)

type {{.ClassName}}Search struct {
	dto.Pagination     `search:"-"`
    {{ $tablename := .TBName -}}
    {{ range .Columns -}}
    {{$z := .IsQuery}}
    {{- if ($z) -}}
    {{.GoField}} {{.GoType}} `form:"{{.JsonField}}" search:"type:{{if eq .QueryType "EQ"}}exact{{ else if eq .QueryType "NE"}}iexact{{ else if eq .QueryType "LIKE"}}contains{{ else if eq .QueryType "GT"}}gt{{ else if eq .QueryType "GTE"}}gte{{ else if eq .QueryType "LT"}}lt{{ else if eq .QueryType "LTE"}}lte{{- end }};column:{{.ColumnName}};table:{{$tablename}}" comment:"{{.ColumnComment}}"`

    {{ end -}}
    {{- end }}
}

func (m *{{.ClassName}}Search) GetNeedSearch() interface{} {
	return *m
}

func (m *{{.ClassName}}Search) Bind(ctx *gin.Context) error {
    msgID := tools.GenerateMsgIDFromContext(ctx)
    err := ctx.ShouldBind(m)
    if err != nil {
    	log.Debugf("MsgID[%s] ShouldBind error: %s", msgID, err.Error())
    }
    return err
}

func (m *{{.ClassName}}Search) Generate() dto.Index {
	o := *m
	return &o
}

type {{.ClassName}}Control struct {
    {{ range .Columns -}}
    {{$x := .Pk}}
    {{- if ($x) }}
    {{.GoField}} uint `uri:"{{.JsonField}}" comment:"{{.ColumnComment}}"` // {{.ColumnComment}}
    {{- else if eq .GoField "CreatedAt" -}}
    {{- else if eq .GoField "UpdatedAt" -}}
    {{- else if eq .GoField "DeletedAt" -}}
    {{- else if eq .GoField "CreateBy" -}}
    {{- else if eq .GoField "UpdateBy" -}}

    {{- else }}

    {{.GoField}} {{.GoType}} `json:"{{.JsonField}}" comment:"{{.ColumnComment}}"`
    {{end -}}
    {{- end }}
}

func (s *{{.ClassName}}Control) Bind(ctx *gin.Context) error {
    msgID := tools.GenerateMsgIDFromContext(ctx)
    err := ctx.ShouldBindUri(s)
    if err != nil {
        log.Debugf("MsgID[%s] ShouldBindUri error: %s", msgID, err.Error())
        return err
    }
    err = ctx.ShouldBind(s)
    if err != nil {
        log.Debugf("MsgID[%s] ShouldBind error: %#v", msgID, err.Error())
    }
    return err
}

func (s *{{.ClassName}}Control) Generate() dto.Control {
	cp := *s
	return &cp
}

func (s *{{.ClassName}}Control) GenerateM() (common.ActiveRecord, error) {
	return &models.{{.ClassName}}{
	{{ range .Columns -}}
        {{$x := .Pk}}
        {{- if ($x) }}
        Model:     gorm.Model{ID: s.ID},
        {{- else if eq .GoField "CreatedAt" -}}
        {{- else if eq .GoField "UpdatedAt" -}}
        {{- else if eq .GoField "DeletedAt" -}}
        {{- else if eq .GoField "CreateBy" -}}


        {{- else if eq .GoField "UpdateBy" -}}
        {{- else }}
        {{.GoField}}:  s.{{.GoField}},
        {{- end }}
        {{- end }}
	}, nil
}

func (s *{{.ClassName}}Control) GetId() interface{} {
	return s.{{.PkGoField}}
}

type {{.ClassName}}ById struct {
	dto.ObjectById
}

func (s *{{.ClassName}}ById) Generate() dto.Control {
	cp := *s
	return &cp
}

func (s *{{.ClassName}}ById) GenerateM() (common.ActiveRecord, error) {
	return &models.{{.ClassName}}{}, nil
}
