//
//  LSColorExtracta.m
//  LSColorExtracta
//
//  Created by Dylan on 2018/10/31.
//  Copyright © 2018 Yang. All rights reserved.
//

#import "LSColorExtracta.h"


@implementation LSColorExtracta

RCT_EXPORT_MODULE();


- (NSArray<NSString *> *)supportedEvents
{
    return @[@"onColorSelected"];
}

RCT_EXPORT_METHOD(colorExtracta:(NSDictionary *)dict success:(RCTPromiseResolveBlock)success rejecter:(RCTPromiseRejectBlock)reject){
    
    
    
    NSNumber* x = [dict objectForKey:@"x"];
    NSNumber* y = [dict objectForKey:@"y"];
    
    CGPoint point = CGPointMake(x.floatValue, y.floatValue);
    
    NSDictionary* rgba = [self colorAtPixel:point];
    
    success(rgba);
}



- (NSDictionary *)colorAtPixel:(CGPoint)point {
    // 如果点超出图像范围，则退出
    
    UIImage* image = [self screenWindow];
    
    if (!CGRectContainsPoint(CGRectMake(0.0f, 0.0f, image.size.width, image.size.height), point)) {
        return nil;
    }
    
    NSInteger pointX = trunc(point.x);
    NSInteger pointY = trunc(point.y);
    CGImageRef cgImage = image.CGImage;
    NSUInteger width = image.size.width;
    NSUInteger height = image.size.height;
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
    int bytesPerPixel = 4;
    int bytesPerRow = bytesPerPixel * 1;
    NSUInteger bitsPerComponent = 8;
    unsigned char pixelData[4] = { 0, 0, 0, 0 };
    CGContextRef context = CGBitmapContextCreate(pixelData,
                                                 1,
                                                 1,
                                                 bitsPerComponent,
                                                 bytesPerRow,
                                                 colorSpace,
                                                 kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big);
    CGColorSpaceRelease(colorSpace);
    CGContextSetBlendMode(context, kCGBlendModeCopy);
    
    // Draw the pixel we are interested in onto the bitmap context
    CGContextTranslateCTM(context, -pointX, pointY-(CGFloat)height);
    CGContextDrawImage(context, CGRectMake(0.0f, 0.0f, (CGFloat)width, (CGFloat)height), cgImage);
    CGContextRelease(context);
    
    //    // 把[0,255]的颜色值映射至[0,1]区间
    //    CGFloat red   = (CGFloat)pixelData[0] / 255.0f;
    //    CGFloat green = (CGFloat)pixelData[1] / 255.0f;
    //    CGFloat blue  = (CGFloat)pixelData[2] / 255.0f;
    //    CGFloat alpha = (CGFloat)pixelData[3] / 255.0f;
    
    NSNumber* red   = [NSNumber numberWithFloat:(CGFloat)pixelData[0]];
    NSNumber* green = [NSNumber numberWithFloat:(CGFloat)pixelData[1]];
    NSNumber* blue  = [NSNumber numberWithFloat:(CGFloat)pixelData[2]];
    NSNumber* alpha = [NSNumber numberWithFloat:(CGFloat)pixelData[3]];
    NSDictionary* rgba = @{@"r": red,@"g": green,@"b": blue,@"a": alpha,};
    
    return rgba;
}


-(UIImage *)screenWindow{
    
    UIWindow *screenWindow = [[UIApplication sharedApplication] keyWindow];
    UIGraphicsBeginImageContext(screenWindow.frame.size);//全屏截图，包括window
    [screenWindow.layer renderInContext:UIGraphicsGetCurrentContext()];
    UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext();
    return viewImage;
    
}



//- (UIView *)view
//{
//    LSExtractaView* extractaView = [[LSExtractaView alloc] init];
////    UIImage* image = [UIImage imageNamed:@"colorExreact.png"];
////    [extractaView setBackgroundColor:[UIColor redColor]];
////    [extractaView setImage:image];
//    return extractaView;
//}


@end


