package com.dne.ems.service.impl;

import com.dne.ems.dto.UserFeedbackSummaryDTO;
import com.dne.ems.model.Feedback;
import com.dne.ems.repository.FeedbackRepository;
import com.dne.ems.service.UserFeedbackService;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;

/**
 * 用户反馈服务实现类
 * 
 * <p>该服务负责处理用户查询自己提交的反馈历史记录相关功能，
 * 提供分页查询和数据转换功能，将反馈实体转换为前端所需的DTO对象。</p>
 *
 * @version 1.0
 * @since 2025-06
 */
@Service
@RequiredArgsConstructor
public class UserFeedbackServiceImpl implements UserFeedbackService {

    private final FeedbackRepository feedbackRepository;

    /**
     * 应用基础URL，用于构建附件访问地址
     */
    @Value("${app.base.url}")
    private String appBaseUrl;

    /**
     * 获取用户反馈历史记录
     * 
     * <p>根据用户ID查询该用户提交的所有反馈记录，并转换为前端所需的DTO格式，
     * 支持分页查询。</p>
     *
     * @param userId 用户ID
     * @param pageable 分页参数
     * @return 分页的用户反馈摘要DTO列表
     */
    @Override
    public Page<UserFeedbackSummaryDTO> getFeedbackHistoryByUserId(Long userId, Pageable pageable) {
        Page<Feedback> feedbackPage = feedbackRepository.findBySubmitterId(userId, pageable);
        return feedbackPage.map(this::convertToDto);
    }

    /**
     * 将反馈实体转换为DTO对象
     * 
     * <p>提取反馈实体中的关键信息，构建前端所需的摘要DTO对象，
     * 包括事件ID、标题、状态、创建时间和首张附件图片URL（如果有）。</p>
     *
     * @param feedback 反馈实体
     * @return 反馈摘要DTO
     */
    private UserFeedbackSummaryDTO convertToDto(Feedback feedback) {
        String imageUrl = null;
        if (feedback.getAttachments() != null && !feedback.getAttachments().isEmpty()) {
            imageUrl = appBaseUrl + "/api/files/view/" + feedback.getAttachments().get(0).getStoredFileName();
        }

        return new UserFeedbackSummaryDTO(
                feedback.getEventId(),
                feedback.getTitle(),
                feedback.getStatus(),
                feedback.getCreatedAt(),
                imageUrl
        );
    }
}