package com.test.musichouduan.controller;

import cn.dev33.satoken.annotation.SaCheckLogin;
import cn.dev33.satoken.annotation.SaCheckRole;
import cn.dev33.satoken.annotation.SaIgnore;
import cn.dev33.satoken.stp.StpUtil;
import com.test.musichouduan.dto.MusicDTO;
import com.test.musichouduan.dto.MusicStatusDTO;
import com.test.musichouduan.dto.PageResult;
import com.test.musichouduan.dto.Result;
import com.test.musichouduan.service.MusicService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.util.List;

/**
 * 音乐控制器
 */
@RestController
@RequestMapping("/api/music")
public class MusicController {

    @Autowired
    private MusicService musicService;

    /**
     * 根据ID获取音乐
     *
     * @param id 音乐ID
     * @return 响应结果
     */
    @SaIgnore
    @GetMapping("/{id}")
    public Result<MusicDTO> getMusicById(@PathVariable Long id) {
        Long userId = null;
        // 检查用户是否登录，但不强制要求登录
        if (StpUtil.isLogin()) {
            userId = StpUtil.getLoginIdAsLong();
        }
        MusicDTO musicDTO = musicService.getMusicById(id, userId);
        if (musicDTO == null) {
            // 如果音乐不存在，返回空数据而不是错误
            return Result.success(null);
        }
        return Result.success(musicDTO);
    }

    /**
     * 分页获取音乐列表
     *
     * @param page 页码
     * @param size 每页大小
     * @param keyword 关键字
     * @param typeId 类型ID
     * @return 响应结果
     */
    @SaIgnore
    @GetMapping("/list")
    public Result<PageResult<MusicDTO>> getMusicList(
            @RequestParam(defaultValue = "1") Integer page,
            @RequestParam(defaultValue = "10") Integer size,
            @RequestParam(required = false) String keyword,
            @RequestParam(required = false) Long typeId) {
        PageResult<MusicDTO> pageResult = musicService.getMusicList(page, size, keyword, typeId);
        return Result.success(pageResult);
    }

    /**
     * 根据歌手ID获取音乐列表
     *
     * @param singerId 歌手ID
     * @param page 页码
     * @param size 每页大小
     * @return 响应结果
     */
    @SaIgnore
    @GetMapping("/singer/{singerId}")
    public Result<PageResult<MusicDTO>> getMusicListBySinger(
            @PathVariable Long singerId,
            @RequestParam(defaultValue = "1") Integer page,
            @RequestParam(defaultValue = "10") Integer size) {
        PageResult<MusicDTO> pageResult = musicService.getMusicListBySinger(singerId, page, size);
        return Result.success(pageResult);
    }

    /**
     * 获取最新音乐列表
     *
     * @param limit 限制数量
     * @return 响应结果
     */
    @SaIgnore
    @GetMapping("/latest")
    public Result<List<MusicDTO>> getLatestMusic(@RequestParam(defaultValue = "10") Integer limit) {
        List<MusicDTO> musicList = musicService.getLatestMusic(limit);
        return Result.success(musicList);
    }

    /**
     * 获取热门音乐列表
     *
     * @param limit 限制数量
     * @return 响应结果
     */
    @SaIgnore
    @GetMapping("/hot")
    public Result<List<MusicDTO>> getHotMusic(@RequestParam(defaultValue = "10") Integer limit) {
        List<MusicDTO> musicList = musicService.getHotMusic(limit);
        return Result.success(musicList);
    }

    /**
     * 搜索音乐
     *
     * @param keyword 关键字
     * @param page 页码
     * @param size 每页大小
     * @return 响应结果
     */
    @SaIgnore
    @GetMapping("/search")
    public Result<PageResult<MusicDTO>> searchMusic(
            @RequestParam String keyword,
            @RequestParam(defaultValue = "1") Integer page,
            @RequestParam(defaultValue = "10") Integer size) {
        PageResult<MusicDTO> pageResult = musicService.getMusicList(page, size, keyword, null);
        return Result.success(pageResult);
    }

    /**
     * 添加音乐
     *
     * @param musicDTO 音乐DTO
     * @param file 音乐文件
     * @param cover 封面文件
     * @return 响应结果
     */
    @SaCheckRole("admin")
    @PostMapping("/add")
    public Result<MusicDTO> addMusic(
            @RequestPart("music") MusicDTO musicDTO,
            @RequestPart(value = "file", required = false) MultipartFile file,
            @RequestPart(value = "cover", required = false) MultipartFile cover) {
        MusicDTO result = musicService.addMusic(musicDTO, file, cover);
        musicService.updateHotMusicCache();
        return Result.success("添加成功", result);
    }

    /**
     * 更新音乐
     *
     * @param id 音乐ID
     * @param musicDTO 音乐DTO
     * @param file 音乐文件
     * @param cover 封面文件
     * @return 响应结果
     */
    @SaCheckRole("admin")
    @PutMapping("/{id}")
    public Result<MusicDTO> updateMusic(
            @PathVariable Long id,
            @RequestPart("music") MusicDTO musicDTO,
            @RequestPart(value = "file", required = false) MultipartFile file,
            @RequestPart(value = "cover", required = false) MultipartFile cover,
            @RequestPart(value = "lyric", required = false) MultipartFile lyric) {
        MusicDTO result = musicService.updateMusic(id, musicDTO, file, cover, lyric);
        return Result.success("更新成功", result);
    }

    /**
     * 删除音乐
     *
     * @param id 音乐ID
     * @return 响应结果
     */
    @SaCheckRole("admin")
    @DeleteMapping("/{id}")
    public Result<Boolean> deleteMusic(@PathVariable Long id) {
        boolean result = musicService.deleteMusic(id);
        musicService.updateHotMusicCache();
        return Result.success("删除成功", result);
    }

    /**
     * 收藏/取消收藏音乐
     *
     * @param id 音乐ID
     * @return 响应结果
     */
    @SaCheckLogin
    @PostMapping("/{id}/collect")
    public Result<Boolean> toggleCollectMusic(@PathVariable Long id) {
        // 获取当前登录用户ID
        Long userId = StpUtil.getLoginIdAsLong();
        boolean isCollected = musicService.toggleCollectMusic(id, userId);
        String message = isCollected ? "收藏成功" : "取消收藏成功";
        return Result.success(message, isCollected);
    }

    /**
     * 获取用户收藏的音乐列表
     *
     * @param page 页码
     * @param size 每页大小
     * @return 响应结果
     */
    @SaCheckLogin
    @GetMapping("/collect")
    public Result<PageResult<MusicDTO>> getCollectedMusic(
            @RequestParam(defaultValue = "1") Integer page,
            @RequestParam(defaultValue = "10") Integer size) {
        // 获取当前登录用户ID
        Long userId = StpUtil.getLoginIdAsLong();
        PageResult<MusicDTO> pageResult = musicService.getCollectedMusic(userId, page, size);
        return Result.success(pageResult);
    }

    /**
     * 播放音乐
     *
     * @param id 音乐ID
     * @return 响应结果
     */
    @SaIgnore
    @PostMapping("/{id}/play")
    public Result<MusicDTO> playMusic(@PathVariable Long id) {
        MusicDTO musicDTO = musicService.playMusic(id);
        return Result.success(musicDTO);
    }

    /**
     * 点赞/取消点赞音乐
     *
     * @param id 音乐ID
     * @return 响应结果
     */
    @SaCheckLogin
    @PostMapping("/{id}/like")
    public Result<Boolean> toggleLikeMusic(@PathVariable Long id) {
        // 获取当前登录用户ID
        Long userId = StpUtil.getLoginIdAsLong();
        boolean isLiked = musicService.toggleLikeMusic(id, userId);
        String message = isLiked ? "点赞成功" : "取消点赞成功";
        return Result.success(message, isLiked);
    }

    /**
     * 获取音乐的收藏和点赞状态
     *
     * @param id 音乐ID
     * @return 响应结果
     */
    @SaCheckLogin
    @GetMapping("/{id}/status")
    public Result<MusicStatusDTO> getMusicStatus(@PathVariable Long id) {
        Long userId = StpUtil.getLoginIdDefaultNull() != null ? StpUtil.getLoginIdAsLong() : null;
        MusicStatusDTO status = musicService.getMusicStatus(id, userId);
        return Result.success(status);
    }
}
