package com.dar.nclientv2.async.downloader;

import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;

public class DownloadQueue {
    private static final List<GalleryDownloaderManager>downloadQueue= new CopyOnWriteArrayList<>();
    public static void add(GalleryDownloaderManager x){
            for (GalleryDownloaderManager manager : downloadQueue)
                if (x.downloader().getId() == manager.downloader().getId()) {
                    manager.downloader().setStatus(GalleryDownloaderV2.Status.NOT_STARTED);
                    givePriority(manager.downloader());
                    return;
                }
            downloadQueue.add(x);
    }

    public static GalleryDownloaderV2 fetchForData(){
            for (GalleryDownloaderManager x : downloadQueue)
                if (!x.downloader().hasData()) return x.downloader();
            return null;
    }
    public static GalleryDownloaderManager fetch() {
            for (GalleryDownloaderManager x : downloadQueue)
                if (x.downloader().canBeFetched()) return x;
            return null;
    }

    public static void clear() {
            for (GalleryDownloaderManager x : downloadQueue)
                x.downloader().setStatus(GalleryDownloaderV2.Status.CANCELED);
            downloadQueue.clear();
    }

    public static CopyOnWriteArrayList<GalleryDownloaderV2> getDownloaders() {
        CopyOnWriteArrayList<GalleryDownloaderV2> downloaders = new CopyOnWriteArrayList<>();
        for (GalleryDownloaderManager manager : downloadQueue)
            downloaders.add(manager.downloader());
        return downloaders;
    }

    public static void addObserver(DownloadObserver observer) {
            for (GalleryDownloaderManager manager : downloadQueue)
                manager.downloader().addObserver(observer);
    }
    public static void removeObserver(DownloadObserver observer) {
            for (GalleryDownloaderManager manager : downloadQueue)
                manager.downloader().removeObserver(observer);
    }
    private static GalleryDownloaderManager findManagerFromDownloader(GalleryDownloaderV2 downloader){
            for (GalleryDownloaderManager manager : downloadQueue)
                if (manager.downloader() == downloader)
                    return manager;
            return null;
    }
    public static void remove(int id,boolean cancel) {
        remove(findDownloaderFromId(id),cancel);
    }

    private static GalleryDownloaderV2 findDownloaderFromId(int id) {
            for (GalleryDownloaderManager manager : downloadQueue)
                if (manager.downloader().getId() == id) return manager.downloader();
            return null;
    }

    public static void remove(GalleryDownloaderV2 downloader,boolean cancel) {
        GalleryDownloaderManager manager=findManagerFromDownloader(downloader);
        if(manager==null)return;
        if(cancel)
            downloader.setStatus(GalleryDownloaderV2.Status.CANCELED);
        downloadQueue.remove(manager);
    }

    public static void givePriority(GalleryDownloaderV2 downloader) {
        GalleryDownloaderManager manager=findManagerFromDownloader(downloader);
        if(manager==null)return;
            downloadQueue.remove(manager);
            downloadQueue.add(0, manager);
    }

    public static GalleryDownloaderManager managerFromId(int id) {
            for (GalleryDownloaderManager manager : downloadQueue)
                if (manager.downloader().getId() == id) return manager;
        return null;
    }

    public static boolean isEmpty() {
            return downloadQueue.size() == 0;

    }
}