/*
 * Apache 2.0 License
 *
 * Copyright (c) Sebastian Katzer 2017
 *
 * This file contains Original Code and/or Modifications of Original Code
 * as defined in and that are subject to the Apache License
 * Version 2.0 (the 'License'). You may not use this file except in
 * compliance with the License. Please obtain a copy of the License at
 * http://opensource.org/licenses/Apache-2.0/ and read it before using this
 * file.
 *
 * The Original Code and all software distributed under the License are
 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
 * Please see the License for the specific language governing rights and
 * limitations under the License.
 */

#import "APPNotificationCategory.h"

@import UserNotifications;

@implementation APPNotificationCategory : NSObject

#pragma mark -
#pragma mark Public

/**
 * Parse the provided spec map into an action group.
 *
 * @param [ NSDictionary* ] spec A key-value property map.
 *                               Must contain an id and a list of actions.
 *
 * @return [ UNNotificationCategory* ]
 */
+ (UNNotificationCategory *)parse:(NSArray *)list withId:(NSString *)groupId {
  NSArray *actions = [self parseActions:list];

  return [UNNotificationCategory
      categoryWithIdentifier:groupId
                     actions:actions
           intentIdentifiers:@[]
                     options:UNNotificationCategoryOptionCustomDismissAction];
}

#pragma mark -
#pragma mark Private

/**
 * The actions of the action group.
 *
 * @return [ NSArray* ]
 */
+ (NSArray<UNNotificationAction *> *)parseActions:(NSArray *)items {
  NSMutableArray *actions = [[NSMutableArray alloc] init];

  for (NSDictionary *item in items) {
    NSString *id = item[@"id"];
    NSString *title = item[@"title"];
    NSString *type = item[@"type"];

    UNNotificationActionOptions options = UNNotificationActionOptionNone;
    UNNotificationAction *action;

    if ([item[@"launch"] boolValue]) {
      options = UNNotificationActionOptionForeground;
    }

    if ([item[@"ui"] isEqualToString:@"decline"]) {
      options = options | UNNotificationActionOptionDestructive;
    }

    if ([item[@"needsAuth"] boolValue]) {
      options = options | UNNotificationActionOptionAuthenticationRequired;
    }

    if ([type isEqualToString:@"input"]) {
      NSString *submitTitle = item[@"submitTitle"];
      NSString *placeholder = item[@"emptyText"];

      if (!submitTitle.length) {
        submitTitle = @"Submit";
      }

      action = [UNTextInputNotificationAction actionWithIdentifier:id
                                                             title:title
                                                           options:options
                                              textInputButtonTitle:submitTitle
                                              textInputPlaceholder:placeholder];
    } else if (!type.length || [type isEqualToString:@"button"]) {
      action = [UNNotificationAction actionWithIdentifier:id
                                                    title:title
                                                  options:options];
    } else {
      NSLog(@"Unknown action type: %@", type);
    }

    if (action) {
      [actions addObject:action];
    }
  }

  return actions;
}

@end
