import { DTO } from "./dto";

export interface I<%= changeCase.pascalCase(name) %><A, B> {
  id: number;
  foo?: A;
  bar?: B[];
}

export interface I<%= changeCase.pascalCase(name) %>DTO extends I<%= changeCase.pascalCase(name) %><I<%= changeCase.pascalCase(name) %>DTO, I<%= changeCase.pascalCase(name) %>DTO> { }
export interface I<%= changeCase.pascalCase(name) %>JSON extends I<%= changeCase.pascalCase(name) %><I<%= changeCase.pascalCase(name) %>JSON, I<%= changeCase.pascalCase(name) %>JSON> { }

export class <%= changeCase.pascalCase(name) %>DTO extends DTO<I<%= changeCase.pascalCase(name) %>DTO> implements I<%= changeCase.pascalCase(name) %>DTO {

  public static parse(object: I<%= changeCase.pascalCase(name) %>JSON): <%= changeCase.pascalCase(name) %>DTO {
    return new <%= changeCase.pascalCase(name) %>DTO({
      id: object.id,
      ...(object.foo ? { foo: <%= changeCase.pascalCase(name) %>DTO.parse(object.foo) } : null),
      ...(object.bar ? { projects: object.bar.map((bar: I<%= changeCase.pascalCase(name) %>JSON) => <%= changeCase.pascalCase(name) %>DTO.parse(bar)) } : null),
    });
  }
  public id: number;
  public foo?: <%= changeCase.pascalCase(name) %>DTO;
  public bar?: <%= changeCase.pascalCase(name) %>DTO[];

  public serialize(): I<%= changeCase.pascalCase(name) %>JSON {
    return {
      id: this.id,
      ...(this.foo ? { foo: this.foo.serialize() } : null),
      ...(this.bar ? { bar: this.bar.map((foo: <%= changeCase.pascalCase(name) %>DTO) => foo.serialize()) } : null),
    };
  }
}
