import { <%= props.paschalName %> } from "@prisma/client";
import <%= props.artifactDatabaseName %> from "<%= props.artifactDatabaseLocation %>"

export class <%= props.paschalName %>Repository {
  public async create(params: any): Promise<<%= props.paschalName %>> {
    try {
      return await <%= props.artifactDatabaseName %>.<%= props.camelName %>.create({
        data: params,
      });
    } catch (error: any) {
      throw new Error(error.message);
    }
  }

  public async getById(params: { id: number }): Promise<<%= props.paschalName %> | null> {
    try {
      return await <%= props.artifactDatabaseName %>.<%= props.camelName %>.findFirst({
        where: {}
      })
    } catch (error: any) {
      throw new Error(error.message);
    }
  }

  public async update(params: any): Promise<<%= props.paschalName %>> {
    try {
      return await <%= props.artifactDatabaseName %>.<%= props.camelName %>.update({
        where: {},
        data: {},
      });
    } catch (error: any) {
      throw new Error(error.message);
    }
  }

  public async softDelete(params: any): Promise<void> {
    try {
      await <%= props.artifactDatabaseName %>.<%= props.camelName %>.update({
        where: {
          id: params.id
        },
        data: {},
      });
    } catch (error: any) {
      throw new Error(error.message);
    }
  }

  public async hardDelete(params: { id: number }): Promise<void> {
    try {
      await <%= props.artifactDatabaseName %>.<%= props.camelName %>.delete({
        where: {
          id: params.id
        }
      });
    } catch (error: any) {
      throw new Error(error.message);
    }
  }

  public async list(params: {
    take: number;
    page: number;
  }): Promise<<%= props.paschalName %>[]> {
    try {
      return await <%= props.artifactDatabaseName %>.<%= props.camelName %>.findMany({
        where: params,
        take: params.take,
        skip: params.page * params.take,
      });
    } catch (error: any) {
      throw new Error(error.message);
    }
  }

  public async count(params: any): Promise<number> {
    try {
      return await <%= props.artifactDatabaseName %>.<%= props.camelName %>.count({
        where: params
      });
    } catch (error: any) {
      throw new Error(error.message);
    }
  }
  
  public async verifyIfExist(params: any): Promise<<%= props.paschalName %> | null> {
    try {
      return await <%= props.artifactDatabaseName %>.<%= props.camelName %>.findFirst({
        where: params,
      });
    } catch (error: any) {
      throw new Error(error.message);
    }
  }

  public async verifyIfExistNotId(params: any): Promise<<%= props.paschalName %> | null> {
    try {
      return await <%= props.artifactDatabaseName %>.<%= props.camelName %>.findFirst({
        where: params,
      });
    } catch (error: any) {
      throw new Error(error.message);
    }
  }      
}
