import { EntityRepository, Repository, FindManyOptions } from 'typeorm';
import { <%= asEntity(entityClass) %>Entity } from './entity/<%= entityFileName %>.entity';
import { <%=entityClass%> } from '../domain/model/<%= entityFileName %>.model';
import { <%=asEntity(entityClass)%>EntityMapper } from './mapper/<%= entityFileName %>.repository.mapper';
import {<%= entityClass %>Repository} from "../domain/repository/<%= entityFileName %>.repository";
import { InjectRepository } from '@nestjs/typeorm';

const relationshipNames = [];
<%_
for (idx in relationships) {

 const relationshipType = relationships[idx].relationshipType;
 const relationshipFieldName = relationships[idx].relationshipFieldName;
 const relationshipFieldNamePlural = relationships[idx].relationshipFieldNamePlural;
 const ownerSide = relationships[idx].ownerSide;

   if (relationshipType === 'many-to-one') { _%>
    relationshipNames.push('<%-relationshipFieldName %>');
   <%_ } else if (relationshipType === 'many-to-many' && ownerSide === true) { _%>
    relationshipNames.push('<%- relationshipFieldNamePlural %>');
   <%_ }
}
const pkType = getPkType(databaseType) === 'Long' ? 'number' : 'string';
_%>


@EntityRepository(<%= asEntity(entityClass) %>Entity)
export class <%=entityClass%>RepositoryORM extends Repository<<%= asEntity(entityClass) %>Entity>  {}

@EntityRepository(<%=asEntity(entityClass)%>)
export class <%=entityClass%>RepositoryImpl implements <%=entityClass%>Repository {

      constructor(@InjectRepository(<%=entityClass%>RepositoryORM) private <%= asEntity(entityInstance) %>Repository: <%=entityClass%>RepositoryORM) {}

      async findOne(id: <%= pkType %>): Promise<<%=entityClass%> | undefined> {
        const options = { relations: relationshipNames };
        const result = await this.<%= asEntity(entityInstance) %>Repository.findOne(id, options);
        return <%= entityClass %>EntityMapper.fromEntityToModel(result);
      }

      async findAndCount({ skip, take, order }): Promise<[<%=entityClass%>[], number]> {
        const conditions: FindManyOptions<<%=entityClass%>> = { skip, take, order, relations: relationshipNames };
        const resultList = await this.<%= asEntity(entityInstance) %>Repository.findAndCount(conditions);
        const <%= asEntity(entityInstance) %>List: [<%=entityClass%>[], number] = [[], 0];
        const <%= asEntity(entityInstance) %>ModelList: <%=entityClass%>[] = [];
        if (resultList && resultList[0]) {
            <%= asEntity(entityInstance) %>List[0] = <%=entityClass%>EntityMapper.fromEntitiesToModels(resultList[0]);
            <%= asEntity(entityInstance) %>List[1] = <%= asEntity(entityInstance) %>ModelList.length;
        }
        return <%= asEntity(entityInstance) %>List;
      }

      async save(<%=entityInstance%>Domain: <%=entityClass %>): Promise<<%=entityClass%> | undefined> {
        const <%= asEntity(entityInstance) %>Saved = await this.<%= asEntity(entityInstance) %>Repository.save(<%=entityInstance%>Domain);
        return <%=entityClass%>EntityMapper.fromEntityToModel(<%= asEntity(entityInstance) %>Saved);
      }

      async remove(<%=entityInstance%>Domain: <%=entityClass %>): Promise<<%=entityClass%> | undefined> {
        const <%= asEntity(entityInstance) %>Removed = await this.<%= asEntity(entityInstance) %>Repository.remove(<%=entityClass%>EntityMapper.fromModelToEntity(<%=entityInstance%>Domain));
        return <%=entityClass%>EntityMapper.fromEntityToModel(<%= asEntity(entityInstance) %>Removed);
      }
}
