package  ${packageName}

import grails.plugin.springsecurity.SpringSecurityUtils
import grails.validation.ValidationException

class ${saClassName}Controller extends grails.plugin.springsecurity.ui.AbstractS2UiDomainController {

     ${saClassName}Service ${camelCaseSaName}Service
    
     static allowedMethods = [save: "POST", update: "POST", delete: "POST"]
     static defaultAction = 'index'

     def search() { redirect action: "index", method: "GET" }

    protected Class<?> getClazz() { ${saClassName} }
    protected String getClassLabelCode() { '${camelCaseSaName}.label' }
    protected Map model(${camelCaseSaName}, String action) {
                    [ ${camelCaseSaName}: ${camelCaseSaName}]
    }
    
    def index(Integer max) {
        params.max = Math.min(max ?: 10, 100)
        params.offset = Math.max(params.offset ? params.int('offset') : 0, 0)
        def model = [:]
        model.results = ${camelCaseSaName}Service.list(params)
        model.totalCount = ${camelCaseSaName}Service.count()
        addQueryParamsToModelForPaging(model,
          <% for(int i=1; i <= numberOfQuestions.toInteger(); i++) {  %>'myQuestion${i}','myAnswer${i}',<%  } %>
        'id', '${userPropName}.id'
        )
        render view: 'index', model: model
    }
    
    def show(Long id) {
        redirect action: 'edit', id: id
    }
    
    def create() {
        respond new ${saClassName}(params), model : ['users': ${userPropName.capitalize()}.list(),'lookupProp':SpringSecurityUtils.securityConfig.userLookup.usernamePropertyName]
    }
    
    def save(${saClassName} ${camelCaseSaName}) {
        withForm {
            if (${camelCaseSaName} == null) {
                notFound()
                return
            }

            try {
                ${camelCaseSaName}Service.save(${camelCaseSaName})
            } catch (ValidationException e) {
                respond ${camelCaseSaName}.errors, view:'create', model : ['users': ${userPropName.capitalize()}.list(),'lookupProp':SpringSecurityUtils.securityConfig.userLookup.usernamePropertyName]
                return
            }

            request.withFormat {
                form multipartForm {
                    flashCreated(${camelCaseSaName}.id)
                    redirect action:"index", method:"GET"
                }
                '*' { respond ${camelCaseSaName}, [status: CREATED] }
            }
        }.invalidToken {
            doSaveWithInvalidToken()
        }
    }
    
    def edit(Long id) {
        respond ${camelCaseSaName}Service.get(id), model : ['users': ${userPropName.capitalize()}.list(),'lookupProp':SpringSecurityUtils.securityConfig.userLookup.usernamePropertyName]
    }
    
    def update(${saClassName} ${camelCaseSaName}) {
        withForm {
            if (${camelCaseSaName} == null) {
                notFound()
                return
            }

            try {
                ${camelCaseSaName}Service.save(${camelCaseSaName})
            } catch (ValidationException e) {
                respond ${camelCaseSaName}.errors, view:'edit'
                return
            }

            request.withFormat {
                form multipartForm {
                   flashUpdated()
                   redirect action:"index", method:"GET"
                }
                '*'{ respond ${camelCaseSaName}, [status: OK] }
            }
        }.invalidToken {
             doUpdateWithInvalidToken()
        }
    }
    
    def delete(Long id) {
        withForm {
            if (id == null) {
                notFound()
                return
            }

            ${camelCaseSaName}Service.delete(id)

            request.withFormat {
                form multipartForm {
                    flashDeleted()
                    redirect action:"index", method:"GET"
                }
                '*'{ render status: NO_CONTENT }
            }
        }.invalidToken {
            doDeleteWithInvalidToken()
        }
    }
    
    protected void notFound() {
        request.withFormat {
            form multipartForm {
                flashNotFound()
                redirect action: "index", method: "GET"
            }
            '*'{ render status: NOT_FOUND }
        }
    }
}