import { <%= entityClass %> }  from '../model/<%= entityFileName %>.model';
import { <%= entityClass %>Repository } from '../repository/<%= entityFileName %>.repository';
<%_
const pkType = getPkType(databaseType) === 'Long' ? 'number' : 'string';
_%>

export class <%= entityClass %>Interactor {
  constructor(private <%= asEntity(entityInstance) %>Repository: <%= entityClass %>Repository) {}

  async findById(id: <%= pkType %>): Promise<<%= entityClass %> | undefined> {
    return this.<%= asEntity(entityInstance) %>Repository.findOne(id);
  }

  async findAndCount({ skip, take, order }): Promise<[<%= entityClass %>[], number]> {
    const resultList = await this.<%= asEntity(entityInstance) %>Repository.findAndCount({ skip, take, order });
    const <%= asEntity(entityInstance) %>List: <%= entityClass %>[] = [];
    if (resultList && resultList[0]) {
        resultList[0].forEach(<%= asEntity(entityInstance) %> => <%= asEntity(entityInstance) %>List.push(<%= asEntity(entityInstance) %>));
        resultList[0] = <%= asEntity(entityInstance) %>List;
    }
    return resultList;
  }

  async save(<%= asEntity(entityInstance) %>Param: <%= entityClass %>, creator?: string): Promise<<%= entityClass %> | undefined> {
    if (creator) {
        if (!<%= asEntity(entityInstance) %>Param.createdBy) {
          <%= asEntity(entityInstance) %>Param.createdBy = creator;
        }
        <%= asEntity(entityInstance) %>Param.lastModifiedBy = creator;
    }
    return this.<%= asEntity(entityInstance) %>Repository.save(<%= asEntity(entityInstance) %>Param);
  }

  async update(<%= asEntity(entityInstance) %>: <%= entityClass %>, updater?: string): Promise<<%= entityClass %> | undefined> {
    return this.save(<%= asEntity(entityInstance) %>, updater);
  }

  async delete(<%= asEntity(entityInstance) %>: <%= entityClass %>): Promise<<%= entityClass %> | undefined> {
    return this.<%= asEntity(entityInstance) %>Repository.remove(<%= asEntity(entityInstance) %>);
  }

}
