import { DeepPartial, EntityTarget, FindOptionsOrder } from 'typeorm';
import { Injectable } from '@severo-tech/injection-decorator';
import { BaseDBRepository } from '../db/base-db-repository';
import { EustIssueEntity } from '../db/entities';
import { IEustIssueRepository } from '../../application/contracts';
import { EustIssue, EustIssueType, EustIssueUnit } from '../../domain/eust-issue';

@Injectable()
export class EustIssueRepository extends BaseDBRepository<EustIssueEntity, EustIssue> implements IEustIssueRepository {
  protected entityClass: EntityTarget<EustIssueEntity> = EustIssueEntity;

  protected defaultOrderBy: FindOptionsOrder<EustIssueEntity> = {
    created_at: 'DESC',
  };

  protected toModel(entity: EustIssueEntity): EustIssue {
    let causedBy: any | undefined;
    try {
      causedBy = JSON.parse(entity.causedBy);
    } catch (error) {
      // Skipping parse error...
    }

    return {
      id: entity.id,
      unit: entity.unit as EustIssueUnit,
      type: entity.type as EustIssueType,
      debitIds: entity.debits?.map((el): string => el.id) ?? [],
      invoiceId: entity.invoiceId,
      description: entity.description,
      causedBy,
      resolved: entity.resolved,
      createdAt: entity.created_at,
      updatedAt: entity.updated_at,
    };
  }

  protected fromModel(model: Partial<EustIssue>): DeepPartial<EustIssueEntity> {
    let causedBy: string | undefined;
    try {
      causedBy = JSON.stringify(model.causedBy);
    } catch (error) {
      // Skipping stringify error...
    }

    return {
      id: model.id,
      unit: model.unit,
      type: model.type,
      debits: model.debitIds?.map((id: string) => ({ id })),
      // @ts-ignore - Null value
      invoiceId: model.invoiceId,
      description: model.description,
      causedBy,
      resolved: model.resolved,
    };
  }
}
