import { PrismaClient } from '@prisma/client'
import { Request, Response } from 'express'
import { onError, onSuccess } from 'reboot-solutions-cms'
import {{MODEL_NAME}}Service from './{{MODULE_NAME}}-service'

export default class {{MODEL_NAME}}Controller {
  private readonly service: {{MODEL_NAME}}Service 

  constructor(public prismaClient: PrismaClient) {
    this.service = new {{MODEL_NAME}}Service(prismaClient)
  }

  public async index(request: Request, response: Response) {
    try {
      const {{MODULE_NAME}}s = await this.service.fetchAll()

      return onSuccess(response, 200, {{MODULE_NAME}}s)
    } catch (error: any) {
      return onError(response, error)
    }
  }

  public async show(request: Request, response: Response) {
    try {
      const {{MODULE_NAME}}Id = parseInt(request.params.id)
      const {{MODULE_NAME}} = await this.service.fetchById({{MODULE_NAME}}Id)

      return onSuccess(response, 200, {{MODULE_NAME}})
    } catch (error: any) {
      return onError(response, error)
    }
  }

  public async store(request: Request, response: Response) {
    try {
      const {{MODULE_NAME}} = await this.service.store(request.body)
      
      return onSuccess(response, 200, {{MODULE_NAME}})
    } catch (error: any) {
      return onError(response, error)
    }
  }

  public async update(request: Request, response: Response) {
    try {
      const {{MODULE_NAME}}Id = parseInt(request.params.id)
      const {{MODULE_NAME}} = await this.service.update({{MODULE_NAME}}Id, request.body)
      
      return onSuccess(response, 200, {{MODULE_NAME}})
    } catch (error: any) {
      return onError(response, error)
    }
  }

  public async destroy(request: Request, response: Response) {
    try {
      const {{MODULE_NAME}}Id = parseInt(request.params.id)
      const {{MODULE_NAME}} = await this.service.destroy({{MODULE_NAME}}Id)

      return onSuccess(response, 200, {{MODULE_NAME}})
    } catch (error: any) {
      return onError(response, error)
    }
  }
}
