import {
  ApiRequest, ApiResponse, BaseController, Helper, HttpGet, HttpPost,
  InsertResult, Like, UpdateResult } from "synapseapi";
import { {0}Model } from "{2}models/{3}{1}_model";
import { UserSession, TokenData } from "{2}shared/user_session";

export class {0}Controller extends BaseController {
  @HttpPost({ route: '{4}/save' })
  save(req: ApiRequest<TokenData, UserSession>, res: ApiResponse): Promise<any> {
    return new Promise(async (resolve, reject) => {
      try {
        let {1}Model =
          req.request.body.{1}id ? await req.getIO().manager.findOne({0}Model, {
            where: { {1}id: req.request.body.{1}id }
          }) : new {0}Model(req);
        {1}Model.setData(req.request.body);
        await req.getIO().manager.save({0}Model, {1}Model)
        resolve({1}Model)
      } catch (error) {
        return reject(error)
      }
    })
  }
  @HttpGet({ route: '{4}/findkey' })
  findkey(req: ApiRequest<TokenData, UserSession>, res: ApiResponse): Promise<any> {
    return new Promise(async (resolve, reject) => {
      try {
        let {1}Model = await req.getIO().manager.findOne({0}Model, {
          where: { {1}id: req.request.query.{1}id ?? "" },
          withDeleted: Helper.find().withDeleted(req.request.query)
        })
        resolve({1}Model ?? {})
      } catch (error) {
        return reject(error)
      }
    })
  }
  @HttpPost({ route: '{4}/remove' })
  remove(req: ApiRequest<TokenData, UserSession>, res: ApiResponse): Promise<void> {
    return new Promise(async (resolve, reject) => {
      try {
        await req.getIO().manager.softDelete({0}Model, {
          {1}id: req.request.query.{1}id ?? ""
        });
        resolve()
      } catch (error) {
        return reject(error)
      }
    })
  }
  @HttpPost({ route: '{4}/restore' })
  restore(req: ApiRequest<TokenData, UserSession>, res: ApiResponse): Promise<void> {
    return new Promise(async (resolve, reject) => {
      try {
        await req.getIO().manager.restore({0}Model, {
          {1}id: req.request.query.{1}id ?? ""
        });
        resolve()
      } catch (error) {
        return reject(error)
      }
    })
  }
  @HttpGet({ route: '{4}/seek' })
  seek(req: ApiRequest<TokenData, UserSession>, res: ApiResponse): Promise<any> {
    return new Promise(async (resolve, reject) => {
      try {
        resolve(await req.getIO().manager.find({0}Model, {
          select: {
            {1}id: true,
            nome: true
          },
          where: { nome: Like(`%${req.request.query.nome ?? ""}%`) },
          withDeleted: Helper.find().withDeleted(req.request.query)
        }))
      } catch (error) {
        return reject(error)
      }
    })
  }
  @HttpGet({ route: '{4}/find' })
  find(req: ApiRequest<TokenData, UserSession>, res: ApiResponse): Promise<any> {
    return new Promise(async (resolve, reject) => {
      try {
        resolve(await req.getIO().manager.find({0}Model, {
          where: Helper.find().whereDef<{0}Model>(req.request.query),
          withDeleted: Helper.find().withDeleted(req.request.query)
        }))
      } catch (error) {
        return reject(error)
      }
    })
  }
}
