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

import cn.novalon.gym.manage.sys.audit.domain.AuditLog;
import cn.novalon.gym.manage.db.entity.AuditLogEntity;
import io.r2dbc.postgresql.codec.Json;

import org.springframework.stereotype.Component;

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

/**
 * 审计日志实体转换器
 * 
 * @author 张翔
 * @date 2026-04-08
 */
@Component
public class AuditLogConverter {

    public AuditLog toDomain(AuditLogEntity entity) {
        if (entity == null) {
            return null;
        }
        AuditLog domain = new AuditLog();
        domain.setId(entity.getId());
        domain.setEntityType(entity.getEntityType());
        domain.setEntityId(entity.getEntityId());
        domain.setOperationType(entity.getOperationType());
        domain.setOperator(entity.getOperator());
        domain.setOperationTime(entity.getOperationTime());
        domain.setBeforeData(entity.getBeforeData() != null ? entity.getBeforeData().asString() : null);
        domain.setAfterData(entity.getAfterData() != null ? entity.getAfterData().asString() : null);
        domain.setChangedFields(entity.getChangedFields());
        domain.setIpAddress(entity.getIpAddress());
        domain.setUserAgent(entity.getUserAgent());
        domain.setDescription(entity.getDescription());
        domain.setCreateBy(entity.getCreateBy());
        domain.setUpdateBy(entity.getUpdateBy());
        domain.setCreatedAt(entity.getCreatedAt());
        domain.setUpdatedAt(entity.getUpdatedAt());
        domain.setDeletedAt(entity.getDeletedAt());
        return domain;
    }

    public AuditLogEntity toEntity(AuditLog domain) {
        if (domain == null) {
            return null;
        }
        AuditLogEntity entity = new AuditLogEntity();
        entity.setId(domain.getId());
        entity.setEntityType(domain.getEntityType());
        entity.setEntityId(domain.getEntityId());
        entity.setOperationType(domain.getOperationType());
        entity.setOperator(domain.getOperator());
        entity.setOperationTime(domain.getOperationTime());
        entity.setBeforeData(domain.getBeforeData() != null ? Json.of(domain.getBeforeData()) : null);
        entity.setAfterData(domain.getAfterData() != null ? Json.of(domain.getAfterData()) : null);
        entity.setChangedFields(domain.getChangedFields());
        entity.setIpAddress(domain.getIpAddress());
        entity.setUserAgent(domain.getUserAgent());
        entity.setDescription(domain.getDescription());
        entity.setCreateBy(domain.getCreateBy());
        entity.setUpdateBy(domain.getUpdateBy());
        entity.setCreatedAt(domain.getCreatedAt());
        entity.setUpdatedAt(domain.getUpdatedAt());
        entity.setDeletedAt(domain.getDeletedAt());
        return entity;
    }

    public List<AuditLog> toDomainList(List<AuditLogEntity> entities) {
        if (entities == null) {
            return null;
        }
        return entities.stream()
                .map(this::toDomain)
                .collect(Collectors.toList());
    }

    public List<AuditLogEntity> toEntityList(List<AuditLog> domains) {
        if (domains == null) {
            return null;
        }
        return domains.stream()
                .map(this::toEntity)
                .collect(Collectors.toList());
    }
}
