// Copyright 2013 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#import "IosPlatformImagesPlugin.h"

#if !__has_feature(objc_arc)
#error ARC must be enabled!
#endif

@interface IosPlatformImagesPlugin ()
@end

@implementation IosPlatformImagesPlugin

+ (void)registerWithRegistrar:(NSObject<FlutterPluginRegistrar> *)registrar {
  FlutterMethodChannel *channel =
      [FlutterMethodChannel methodChannelWithName:@"plugins.flutter.io/ios_platform_images"
                                  binaryMessenger:[registrar messenger]];

  [channel setMethodCallHandler:^(FlutterMethodCall *call, FlutterResult result) {
    if ([@"loadImage" isEqualToString:call.method]) {
      NSString *name = call.arguments;
      UIImage *image = [UIImage imageNamed:name];
      NSData *data = UIImagePNGRepresentation(image);
      if (data) {
        result(@{
          @"scale" : @(image.scale),
          @"data" : [FlutterStandardTypedData typedDataWithBytes:data],
        });
      } else {
        result(nil);
      }
      return;
    } else if ([@"resolveURL" isEqualToString:call.method]) {
      NSArray *args = call.arguments;
      NSString *name = args[0];
      NSString *extension = (args[1] == (id)NSNull.null) ? nil : args[1];

      NSURL *url = [[NSBundle mainBundle] URLForResource:name withExtension:extension];
      result(url.absoluteString);
      return;
    }
    result(FlutterMethodNotImplemented);
  }];
}

@end
