package com.izouma.nineth.web;

import cn.hutool.core.collection.CollUtil;
import com.izouma.nineth.domain.NewsLike;
import com.izouma.nineth.domain.ShowCollection;
import com.izouma.nineth.domain.Showroom;
import com.izouma.nineth.domain.User;
import com.izouma.nineth.dto.PageQuery;
import com.izouma.nineth.exception.BusinessException;
import com.izouma.nineth.repo.NewsLikeRepo;
import com.izouma.nineth.repo.ShowCollectionRepo;
import com.izouma.nineth.repo.ShowroomRepo;
import com.izouma.nineth.service.ShowroomService;
import com.izouma.nineth.utils.SecurityUtils;
import com.izouma.nineth.utils.excel.ExcelUtils;
import lombok.AllArgsConstructor;
import org.apache.commons.lang3.ObjectUtils;
import org.springframework.data.domain.Page;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

@RestController
@RequestMapping("/showroom")
@AllArgsConstructor
public class ShowroomController extends BaseController {
    private ShowroomService    showroomService;
    private ShowroomRepo       showroomRepo;
    private ShowCollectionRepo showCollectionRepo;
    private NewsLikeRepo       newsLikeRepo;

    @PostMapping("/save")
    public Showroom save(@RequestBody Showroom record) {
        return showroomService.save(SecurityUtils.getAuthenticatedUser().getId(), record);
    }

    @PostMapping("/update")
    public Showroom update(@RequestBody Showroom record) {
        return showroomService.update(SecurityUtils.getAuthenticatedUser().getId(), record);
    }

    @PostMapping("/all")
    public Page<Showroom> all(@RequestBody PageQuery pageQuery) {
        Page<Showroom> all = showroomService.all(pageQuery);
        List<Long> ids = all.map(Showroom::getId).getContent();
        Map<Long, List<ShowCollection>> collect = showCollectionRepo.findAllByShowroomIdIn(ids)
                .stream()
                .collect(Collectors.groupingBy(ShowCollection::getShowroomId));
        showroomService.all(pageQuery);

        User user = SecurityUtils.getAuthenticatedUser();
        Map<Long, Long> likesMap = new HashMap<>();
        if (user != null && !user.isAdmin() && CollUtil.isNotEmpty(ids)) {
            List<NewsLike> likes = newsLikeRepo.findByUserIdAndShowroomIdIn(user
                    .getId(), ids);
            likesMap = likes.stream()
                    .collect(Collectors.groupingBy(NewsLike::getShowroomId, Collectors.counting()));

        }

        Map<Long, Long> finalLikesMap = likesMap;
        return all.map(showroom -> {
            showroom.setCollections(collect.get(showroom.getId()));
            showroom.setLiked(ObjectUtils.isNotEmpty(finalLikesMap.get(showroom.getId())));
            return showroom;
        });
    }

    @GetMapping("/get/{id}")
    public Showroom get(@PathVariable Long id) {
        Showroom showroom = showroomRepo.findById(id).orElseThrow(new BusinessException("无记录"));
        showroom.setCollections(showCollectionRepo.findAllByShowroomId(id));
        User user = SecurityUtils.getAuthenticatedUser();

        if (user != null && !user.isAdmin()) {
            List<NewsLike> likes = newsLikeRepo.findByUserIdAndShowroomId(user
                    .getId(), id);
            showroom.setLiked(CollUtil.isNotEmpty(likes));
        }
        return showroom;
    }

    @PostMapping("/del/{id}")
    public void del(@PathVariable Long id) {
        showCollectionRepo.softDeleteByRoom(id);
        showroomRepo.softDelete(id);
    }

    @GetMapping("/excel")
    @ResponseBody
    public void excel(HttpServletResponse response, PageQuery pageQuery) throws IOException {
        List<Showroom> data = all(pageQuery).getContent();
        ExcelUtils.export(response, data);
    }

    @GetMapping("/{id}/share")
    public void addShare(@PathVariable Long id) {
        showroomRepo.addShare(id, 1);
    }
}

