BatchCalculationMapper.java

package com.github.jenkaby.bikerental.tariff.web.query.mapper;

import com.github.jenkaby.bikerental.shared.mapper.DiscountMapper;
import com.github.jenkaby.bikerental.shared.mapper.DurationMapper;
import com.github.jenkaby.bikerental.shared.mapper.MoneyMapper;
import com.github.jenkaby.bikerental.tariff.EquipmentCostItem;
import com.github.jenkaby.bikerental.tariff.RentalCostCalculationCommand;
import com.github.jenkaby.bikerental.tariff.RentalCostCalculationResult;
import com.github.jenkaby.bikerental.tariff.web.query.dto.CostCalculationRequest;
import com.github.jenkaby.bikerental.tariff.web.query.dto.CostCalculationResponse;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.springframework.beans.factory.annotation.Autowired;

@Mapper(uses = {MoneyMapper.class, DurationMapper.class, DiscountMapper.class, CalculationBreakdownMapper.class})
public abstract class BatchCalculationMapper {

    private MoneyMapper moneyMapper;
    private DurationMapper durationMapper;
    private DiscountDetailMapper discountMapper;
    private CalculationBreakdownMapper breakdownMapper;

    @Autowired
    public void setDiscountMapper(DiscountDetailMapper discountMapper) {
        this.discountMapper = discountMapper;
    }

    @Autowired
    public void setBreakdownMapper(CalculationBreakdownMapper breakdownMapper) {
        this.breakdownMapper = breakdownMapper;
    }

    @Autowired
    public void setMoneyMapper(MoneyMapper moneyMapper) {
        this.moneyMapper = moneyMapper;
    }

    @Autowired
    public void setDurationMapper(DurationMapper durationMapper) {
        this.durationMapper = durationMapper;
    }

    @Mapping(target = "equipments", source = "equipments")
    @Mapping(target = "plannedDuration", source = "plannedDurationMinutes")
    @Mapping(target = "actualDuration", source = "actualDurationMinutes")
    @Mapping(target = "discount", source = "discountPercent")
    public abstract RentalCostCalculationCommand toCommand(CostCalculationRequest request);

    public abstract EquipmentCostItem toItem(CostCalculationRequest.EquipmentItemRequest item);

    //    TODO use Mapstruct features
    public CostCalculationResponse toResponse(RentalCostCalculationResult result) {
        return new CostCalculationResponse(
                breakdownMapper.toBreakdownResponses(result.equipmentBreakdowns()),
                moneyMapper.toBigDecimal(result.subtotal()),
                discountMapper.toResponse(result.discount()),
                moneyMapper.toBigDecimal(result.totalCost()),
                durationMapper.toMinutes(result.effectiveDuration()),
                result.estimate(),
                result.specialPricingApplied()
        );
    }
}