package com.jannchie.biliob.service.impl;

import com.jannchie.biliob.constant.PageSizeEnum;
import com.jannchie.biliob.model.Event;
import com.jannchie.biliob.model.FansVariation;
import com.jannchie.biliob.repository.EventRepository;
import com.jannchie.biliob.repository.FansVariationRepository;
import com.jannchie.biliob.service.EventService;
import com.jannchie.biliob.utils.MySlice;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CacheConfig;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Slice;
import org.springframework.data.domain.Sort;
import org.springframework.stereotype.Service;

/**
 * @author jannchie
 */
@Service
@CacheConfig(cacheNames = "event")
public class EventServiceImpl implements EventService {

    private static final Logger logger = LogManager.getLogger();
    private final EventRepository eventRepository;
    private final FansVariationRepository fansVariationRepository;

    @Autowired
    public EventServiceImpl(EventRepository eventRepository, FansVariationRepository fansVariationRepository) {
        this.eventRepository = eventRepository;
        this.fansVariationRepository = fansVariationRepository;
    }

    /**
     * Get the data of important events.
     *
     * @param page     page number
     * @param pagesize page size
     * @return a slice of events
     */
    @Override
    public MySlice<Event> pageEvent(Integer page, Integer pagesize) {
        if (pagesize > PageSizeEnum.BIG_SIZE.getValue()) {
            return null;
        }
        Slice<Event> e =
                eventRepository.findAll(
                        PageRequest.of(page, pagesize, new Sort(Sort.Direction.DESC, "datetime")));
        logger.info("获取事件");
        return new MySlice<>(e);
    }

    /**
     * Get the data of important fans variation.
     *
     * @param page     page number
     * @param pagesize page size
     * @return a slice of fans variation events
     */
    @Override
    public Page<FansVariation> listFansVariation(Integer page, Integer pagesize) {
        if (pagesize > PageSizeEnum.BIG_SIZE.getValue()) {
            return null;
        }
        logger.info("获取事件");
        return fansVariationRepository.findAll(
                PageRequest.of(page, pagesize, new Sort(Sort.Direction.DESC, "datetime")));
    }
}