#import "TGImageDataSource.h"

@implementation TGImageDataSource

+ (NSMutableArray *)_dataSourceList
{
    static NSMutableArray *array = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^
    {
        array = [[NSMutableArray alloc] init];
    });
    
    return array;
}

+ (void)registerDataSource:(TGImageDataSource *)dataSource
{
    if (dataSource == nil)
        return;
    
    if (![[self _dataSourceList] containsObject:dataSource])
        [[self _dataSourceList] addObject:dataSource];
}

+ (void)enumerateDataSources:(bool (^)(TGImageDataSource *dataSource))handler
{
    if (!handler)
        return;
    
    [[self _dataSourceList] enumerateObjectsUsingBlock:^(TGImageDataSource *dataSource, __unused NSUInteger idx, BOOL *stop)
    {
        if (handler(dataSource) && stop != NULL)
            *stop = true;
    }];
}

+ (void)enqueueImageProcessingBlock:(void (^)())imageProcessingBlock
{
    static dispatch_queue_t queue = NULL;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^
    {
        queue = dispatch_queue_create("ph.telegra.datasourceimageprocessing", 0);
    });
    
    dispatch_async(queue, imageProcessingBlock);
}

- (bool)canHandleUri:(NSString *)__unused uri
{
    return false;
}

- (bool)canHandleAttributeUri:(NSString *)__unused uri
{
    return false;
}

- (TGDataResource *)loadDataSyncWithUri:(NSString *)__unused uri canWait:(bool)__unused canWait acceptPartialData:(bool)__unused acceptPartialData asyncTaskId:(__autoreleasing id *)__unused asyncTaskId progress:(void (^)(float))__unused progress partialCompletion:(void (^)(TGDataResource *))__unused partialCompletion completion:(void (^)(TGDataResource *))__unused completion
{
    return nil;
}

- (id)loadDataAsyncWithUri:(NSString *)__unused uri progress:(void (^)(float progress))__unused progress partialCompletion:(void (^)(TGDataResource *resource))__unused partialCompletion completion:(void (^)(TGDataResource *resource))__unused completion
{
    return nil;
}

- (id)loadAttributeSyncForUri:(NSString *)__unused uri attribute:(NSString *)__unused attribute
{
    return nil;
}

- (void)cancelTaskById:(id)__unused taskId
{
}

@end