import { member } from "../../../../entity/club/member/member";
import { MemberStatisticsViewModel, MemberViewModel } from "../../../../viewmodel/admin/club/member/member.models";
import { memberView } from "../../../../views/memberView";
import SalutationFactory from "../../settings/salutation";
import CommunicationFactory from "./communication";
import DateMappingHelper from "./dateMappingHelper";
import MembershipFactory from "./membership";

export default abstract class MemberFactory {
  /**
   * @description map record to member
   * @param {member} record
   * @returns {MemberViewModel}
   */
  public static mapToSingle(record: member): MemberViewModel {
    return {
      id: record?.id,
      salutation: SalutationFactory.mapToSingle(record?.salutation),
      firstname: record?.firstname,
      lastname: record?.lastname,
      nameaffix: record?.nameaffix,
      birthdate: record?.birthdate,
      internalId: record.internalId,
      firstMembershipEntry: record?.firstMembershipEntry
        ? MembershipFactory.mapToSingle(record.firstMembershipEntry)
        : null,
      lastMembershipEntry: record?.lastMembershipEntry
        ? MembershipFactory.mapToSingle(record.lastMembershipEntry)
        : null,
      sendNewsletter: record?.sendNewsletter ? CommunicationFactory.mapToSingle(record.sendNewsletter, true) : null,
      preferredCommunication: record?.preferredCommunication
        ? CommunicationFactory.mapToBase(record.preferredCommunication)
        : null,
      smsAlarming: record?.smsAlarming ? CommunicationFactory.mapToBase(record.smsAlarming) : null,
    };
  }

  /**
   * @description map records to member
   * @param {Array<member>} records
   * @returns {Array<MemberViewModel>}
   */
  public static mapToBase(records: Array<member>): Array<MemberViewModel> {
    return records.map((r) => this.mapToSingle(r));
  }

  /**
   * @description map view record to MemberMembershipStatisticsViewModel
   * @param {memberView} record
   * @returns {MemberStatisticsViewModel}
   */
  public static mapToMemberStatistic(record: memberView): MemberStatisticsViewModel {
    return {
      id: record.id,
      internalId: record.internalId,
      salutation: record.salutation,
      firstname: record.firstname,
      lastname: record.lastname,
      nameaffix: record.nameaffix,
      birthdate: record.birthdate,
      todayAge: record.todayAge,
      ageThisYear: record.ageThisYear,
      exactAge: DateMappingHelper.mapDate(record.exactAge),
    };
  }
}