package ctbrec.ui.sites.streamray;

import ctbrec.Model;
import ctbrec.sites.streamray.Streamray;
import ctbrec.sites.streamray.StreamrayModel;
import javafx.concurrent.Task;
import lombok.Setter;
import lombok.extern.slf4j.Slf4j;

import java.io.IOException;
import java.time.Duration;
import java.time.Instant;
import java.util.List;
import java.util.function.Predicate;

@Slf4j
public class StreamrayUpdateService extends AbstractStreamrayUpdateService {

    private List<StreamrayModel> models;
    private Instant lastListInfoRequest = Instant.EPOCH;

    @Setter
    protected Predicate<StreamrayModel> filter;

    public StreamrayUpdateService(Streamray site, Predicate<StreamrayModel> filter) {
        super(site);
        this.filter = filter;
    }

    @Override
    protected Task<List<Model>> createTask() {
        return new Task<>() {
            @Override
            public List<Model> call() throws IOException {
                return getModels().stream()
                        .filter(filter)
                        .skip((page - 1) * (long) modelsPerPage)
                        .limit(modelsPerPage)
                        .map(Model.class::cast)
                        .toList();
            }
        };
    }

    private List<StreamrayModel> getModels() throws IOException {
        if (models == null || Duration.between(lastListInfoRequest, Instant.now()).getSeconds() >= 10) {
            models = site.loadModelList();
            lastListInfoRequest = Instant.now();
        }
        return models;
    }
}