package com.saas.shared.dto.mapper;

import com.saas.subscription.dto.response.SubscriptionPlanResponse;
import com.saas.subscription.entity.SubscriptionPlan;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.MappingConstants;

/**
 * MapStruct mapper for SubscriptionPlan entity ↔ SubscriptionPlanResponse DTO.
 * 
 * Compilation-time code generation:
 * - Field mapping is automatic
 * - Type conversions handled automatically
 * - No runtime reflection
 */
@Mapper(componentModel = MappingConstants.ComponentModel.SPRING)
public interface SubscriptionPlanMapper {

    /**
     * Map entity to response DTO.
     */
    @Mapping(target = "annualPrice", ignore = true)
    @Mapping(target = "maxConcurrentCalls", ignore = true)
    @Mapping(target = "maxAiMinutes", ignore = true)
    @Mapping(target = "maxAiAgents", ignore = true)
    @Mapping(target = "maxPhoneNumbers", ignore = true)
    @Mapping(target = "storageQuotaGb", ignore = true)
    @Mapping(target = "isActive", ignore = true)
    @Mapping(target = "createdBy", ignore = true)
    @Mapping(target = "updatedBy", ignore = true)
    SubscriptionPlanResponse toResponse(SubscriptionPlan entity);

    /**
     * Map response DTO to entity.
     */
    @Mapping(target = "pricePerMonth", ignore = true)
    @Mapping(target = "pricePerYear", ignore = true)
    @Mapping(target = "currency", ignore = true)
    @Mapping(target = "includedMinutes", ignore = true)
    @Mapping(target = "overagePricePerMinute", ignore = true)
    @Mapping(target = "maxCallTransfers", ignore = true)
    @Mapping(target = "maxActiveAiAgents", ignore = true)
    @Mapping(target = "maxStorageGb", ignore = true)
    @Mapping(target = "callHistoryRetentionDays", ignore = true)
    @Mapping(target = "recordingRetentionMonths", ignore = true)
    @Mapping(target = "maxRecordingRetrievalsPerMonth", ignore = true)
    @Mapping(target = "advancedAnalytics", ignore = true)
    @Mapping(target = "featuresEmailSupport", ignore = true)
    @Mapping(target = "featuresPrioritySupport", ignore = true)
    @Mapping(target = "featuresApiAccess", ignore = true)
    @Mapping(target = "featuresCustomDomain", ignore = true)
    @Mapping(target = "featuresSso", ignore = true)
    @Mapping(target = "featuresAuditLogs", ignore = true)
    @Mapping(target = "supportLevel", ignore = true)
    @Mapping(target = "active", ignore = true)
    SubscriptionPlan toEntity(SubscriptionPlanResponse response);
}
