package com.yaoyuan.jiscuss.dto;

import com.yaoyuan.jiscuss.entity.User;
import org.mapstruct.Mapper;
import org.mapstruct.MappingConstants;
import org.mapstruct.ReportingPolicy;

/**
 * MapStruct mapper between {@link User} entity and its DTOs.
 *
 * <p>The {@code password} field is intentionally never copied into a response and
 * is left {@code null} when constructing a {@link User} from a create request —
 * the caller (service layer) is responsible for BCrypt-hashing and setting it.
 */
@Mapper(
        componentModel = MappingConstants.ComponentModel.SPRING,
        unmappedTargetPolicy = ReportingPolicy.IGNORE
)
public interface UserMapper {

    /** Map a {@link User} entity to a safe {@link UserResponse} (no password). */
    default UserResponse toResponse(User user) {
        if (user == null) {
            return null;
        }
        return new UserResponse(
                user.getId(),
                user.getUsername(),
                user.getRealname(),
                user.getEmail(),
                user.getAvatar(),
                user.getGender(),
                user.getPhone(),
                user.getAge(),
                user.getDiscussionsCount(),
                user.getCommentsCount(),
                user.getJoinTime(),
                user.getLastSeenTime(),
                user.getLevel()
        );
    }

    /** Map a create request to a new {@link User} entity. Password must be set by the caller. */
    default User fromCreateRequest(UserCreateRequest request) {
        if (request == null) {
            return null;
        }
        User user = new User();
        user.setUsername(request.username());
        user.setEmail(request.email());
        user.setRealname(request.realname());
        return user;
    }
}
