
package cn.novalon.gym.manage.groupcourse.converter;

import cn.hutool.core.bean.BeanUtil;
import cn.novalon.gym.manage.groupcourse.domain.GroupCourse;
import cn.novalon.gym.manage.groupcourse.domain.GroupCourseBooking;
import cn.novalon.gym.manage.groupcourse.domain.GroupCourseType;
import cn.novalon.gym.manage.groupcourse.entity.GroupCourseBookingEntity;
import cn.novalon.gym.manage.groupcourse.entity.GroupCourseEntity;
import cn.novalon.gym.manage.groupcourse.entity.GroupCourseTypeEntity;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import java.util.List;
import java.util.stream.Collectors;

/**
 * 团课相关转换器
 * 
 * @author 张翔
 * @date 2026-06-01
 */
@Component
@Slf4j
public class GroupCourseConverter {

    /**
     * 将团课实体转换为领域模型
     */
    public GroupCourse toDomain(GroupCourseEntity entity){
        if(entity == null){
            return null;
        }
        GroupCourse groupCourse = new GroupCourse();
        BeanUtil.copyProperties(entity,groupCourse);
        log.info("转换bean，entity-domain：",groupCourse);
        return groupCourse;
    }

    /**
     * 将团课领域模型转换为实体
     */
    public GroupCourseEntity toEntity(GroupCourse domain){
        if(domain == null){
            return null;
        }
        GroupCourseEntity entity = new GroupCourseEntity();
        BeanUtil.copyProperties(domain,entity);
        log.info("转换bean，domain-entity：",entity);
        return entity;
    }

    /**
     * 将团课实体列表转换为领域模型列表
     */
    public List<GroupCourse> toDomainList(List<GroupCourseEntity> entities){
        if (entities == null) {
            return null;
        }
        return entities.stream()
                .map(this::toDomain)
                .collect(Collectors.toList());
    }

    /**
     * 将团课领域模型列表转换为实体列表
     */
    public List<GroupCourseEntity> toEntityList(List<GroupCourse> domains){
        if (domains == null) {
            return null;
        }
        return domains.stream()
                .map(this::toEntity)
                .collect(Collectors.toList());
    }

    /**
     * 将团课预约实体转换为领域模型
     */
    public GroupCourseBooking toBookingDomain(GroupCourseBookingEntity entity){
        if(entity == null){
            return null;
        }
        GroupCourseBooking booking = new GroupCourseBooking();
        BeanUtil.copyProperties(entity, booking);
        log.debug("转换预约记录实体到领域模型：bookingId={}", entity.getId());
        return booking;
    }

    /**
     * 将团课预约领域模型转换为实体
     */
    public GroupCourseBookingEntity toBookingEntity(GroupCourseBooking domain){
        if(domain == null){
            return null;
        }
        GroupCourseBookingEntity entity = new GroupCourseBookingEntity();
        BeanUtil.copyProperties(domain, entity);
        if (domain.getId() != null) {
            entity.markNotNew();
        }
        log.debug("转换预约记录领域模型到实体：bookingId={}", domain.getId());
        return entity;
    }

    /**
     * 将团课预约实体列表转换为领域模型列表
     */
    public List<GroupCourseBooking> toBookingDomainList(List<GroupCourseBookingEntity> entities){
        if (entities == null) {
            return null;
        }
        return entities.stream()
                .map(this::toBookingDomain)
                .collect(Collectors.toList());
    }

    /**
     * 将团课预约领域模型列表转换为实体列表
     */
    public List<GroupCourseBookingEntity> toBookingEntityList(List<GroupCourseBooking> domains){
        if (domains == null) {
            return null;
        }
        return domains.stream()
                .map(this::toBookingEntity)
                .collect(Collectors.toList());
    }

    /**
     * 将团课类型实体转换为领域模型
     */
    public GroupCourseType toGroupCourseType(GroupCourseTypeEntity entity){
        if(entity == null){
            return null;
        }
        GroupCourseType groupCourseType = new GroupCourseType();
        BeanUtil.copyProperties(entity, groupCourseType);
        log.debug("转换团课类型实体到领域模型：typeId={}", entity.getId());
        return groupCourseType;
    }

    /**
     * 将团课类型领域模型转换为实体
     */
    public GroupCourseTypeEntity toGroupCourseTypeEntity(GroupCourseType domain){
        if(domain == null){
            return null;
        }
        GroupCourseTypeEntity entity = new GroupCourseTypeEntity();
        BeanUtil.copyProperties(domain, entity);
        if (domain.getId() != null) {
            entity.markNotNew();
        }
        log.debug("转换团课类型领域模型到实体：typeId={}", domain.getId());
        return entity;
    }
}
