/**
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.apache.pulsar.manager.dao;

import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import org.apache.pulsar.manager.entity.ConsumerStatsEntity;
import org.apache.pulsar.manager.entity.ConsumersStatsRepository;
import org.apache.pulsar.manager.mapper.ConsumerStatsMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

@Repository
public class ConsumersStatsRepositoryImpl implements ConsumersStatsRepository {

    private final ConsumerStatsMapper consumerStatsMapper;

    @Autowired
    public ConsumersStatsRepositoryImpl(ConsumerStatsMapper consumerStatsMapper) {
        this.consumerStatsMapper = consumerStatsMapper;
    }


    public long save(ConsumerStatsEntity consumerStatsEntity) {
        consumerStatsMapper.save(consumerStatsEntity);
        return consumerStatsEntity.getConsumerStatsId();
    }

    public Page<ConsumerStatsEntity> findByTopicStatsId(Integer pageNum, Integer pageSize,
                                                 long topicStatsId, long timestamp) {
        PageHelper.startPage(pageNum, pageSize);
        Page<ConsumerStatsEntity> consumerStatsEntities = consumerStatsMapper.findByTopicStatsId(
                topicStatsId, timestamp);
        return consumerStatsEntities;
    }

    public Page<ConsumerStatsEntity> findBySubscriptionStatsId(Integer pageNum, Integer pageSize,
                                                               long subscriptionStatsId, long timestamp) {
        PageHelper.startPage(pageNum, pageSize);
        Page<ConsumerStatsEntity> consumerStatsEntities = consumerStatsMapper.findBySubscriptionStatsId(subscriptionStatsId, timestamp);
        return consumerStatsEntities;
    }

    public Page<ConsumerStatsEntity> findByReplicationStatsId(Integer pageNum, Integer pageSize,
                                                              long replicationStatsId, long timestamp) {
        PageHelper.startPage(pageNum, pageSize);
        Page<ConsumerStatsEntity> consumerStatsEntities = consumerStatsMapper.findByReplicationStatsId(
                replicationStatsId, timestamp);
        return consumerStatsEntities;
    }

    public void remove(long timestamp, long timeInterval) {
        consumerStatsMapper.delete(timestamp - timeInterval);
    }

}
