package com.dora.service;

import com.dora.dto.PlazaWorkDto.*;

/**
 * 广场服务接口
 * 
 * @author 1818AI
 * @since 2025-10-26
 */
public interface PlazaService {

    /**
     * 发布作品到广场
     * 
     * @param userId 用户ID
     * @param request 发布请求
     * @return 作品详情
     */
    WorkDetailResponse publishWork(Long userId, PublishWorkRequest request);

    /**
     * 查询广场作品列表
     * 
     * @param userId 当前用户ID（可为null，用于判断是否点赞）
     * @param request 查询请求
     * @return 作品列表
     */
    WorkListResponse getPlazaWorks(Long userId, WorkQueryRequest request);

    /**
     * 查询作品详情
     * 
     * @param userId 当前用户ID（可为null）
     * @param workNo 作品编号
     * @return 作品详情
     */
    WorkDetailResponse getWorkDetail(Long userId, String workNo);

    /**
     * 通过任务编号查询作品详情（不记录浏览）
     * 
     * @param userId 当前用户ID（可为null）
     * @param taskNo 任务编号
     * @return 作品详情
     */
    WorkDetailResponse getWorkDetailByTaskNo(Long userId, String taskNo);

    /**
     * 点赞作品
     * 
     * @param userId 用户ID
     * @param workNo 作品编号
     * @return 点赞响应
     */
    LikeResponse likeWork(Long userId, String workNo);

    /**
     * 取消点赞
     * 
     * @param userId 用户ID
     * @param workNo 作品编号
     * @return 点赞响应
     */
    LikeResponse unlikeWork(Long userId, String workNo);

    /**
     * 查询用户的作品列表
     * 
     * @param userId 用户ID
     * @param request 查询请求
     * @return 作品列表
     */
    WorkListResponse getUserWorks(Long userId, WorkQueryRequest request);

    /**
     * 删除作品
     * 
     * @param userId 用户ID
     * @param workNo 作品编号
     */
    void deleteWork(Long userId, String workNo);

    /**
     * 获取广场统计数据
     * 
     * @return 统计数据
     */
    PlazaStatsResponse getPlazaStats();

    /**
     * 记录作品浏览（增加浏览数）
     * 
     * @param workNo 作品编号
     * @param userId 用户ID（可为null）
     */
    void recordView(String workNo, Long userId);

    /**
     * 查询用户点赞的作品列表
     * 
     * @param userId 用户ID
     * @param page 页码
     * @param size 每页数量
     * @return 点赞的作品列表
     */
    UserLikedWorksResponse getUserLikedWorks(Long userId, Integer page, Integer size);
}

