<!--
  Licensed to the Apache Software Foundation (ASF) under one or more
  contributor license agreements.  See the NOTICE file distributed with
  this work for additional information regarding copyright ownership.
  The ASF licenses this file to You under the Apache License, Version 2.0
  (the "License"); you may not use this file except in compliance with
  the License.  You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License.
-->

<mat-list-item>
  <h3 matLine translate>Payment cycle</h3>
  <p matLine>Repay every {{paymentCycle.period + ' ' + getTemporalOption(paymentCycle.temporalUnit)?.label}}</p>
  <p matLine *ngIf="paymentCycle.temporalUnit === 'WEEKS'">
    on {{getWeekDayOption(paymentCycle.alignmentDay)?.label}}
  </p>
  <p matLine *ngIf="paymentCycle.temporalUnit !== 'WEEKS' && alignmentDaySetting === 'fixed'">
    on the {{paymentCycle.alignmentDay +1}}. day
  </p>
  <p matLine *ngIf="paymentCycle.temporalUnit !== 'WEEKS' && alignmentDaySetting === 'relative'">
    on the {{getAlignment(paymentCycle.alignmentWeek)?.label + ' ' + getWeekDayOption(paymentCycle.alignmentDay)?.label}}
  </p>
  <p matLine *ngIf="paymentCycle.temporalUnit === 'YEARS'">
    in {{getMonthOption(paymentCycle.alignmentMonth)?.label}}
  </p>
</mat-list-item>
