/*
 * Copyright (c) 2013-2015 by appPlant UG. All rights reserved.
 *
 * @APPPLANT_LICENSE_HEADER_START@
 *
 * 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.
 *
 * @APPPLANT_LICENSE_HEADER_END@
 */

#import "APPLocalNotificationOptions.h"

// Default sound ressource path
NSString* const DEFAULT_SOUND = @"res://platform_default";

@interface APPLocalNotificationOptions ()

// The dictionary which contains all notification properties
@property(nonatomic, retain) NSDictionary* dict;

@end

@implementation APPLocalNotificationOptions

@synthesize dict;

#pragma mark -
#pragma mark Initialization

/**
 * Initialize the object with the given options when calling on JS side:
 * notification.local.add(options)
 */
- (id) initWithDict:(NSDictionary*)dictionary
{
    self = [super init];

    self.dict = dictionary;

    return self;
}

#pragma mark -
#pragma mark Attributes

/**
 * The notification's ID.
 */
- (NSNumber*) id
{
    NSInteger id = [[dict objectForKey:@"id"] integerValue];

    return [NSNumber numberWithInteger:id];
}

/**
 * The notification's title.
 */
- (NSString*) title
{
    return [dict objectForKey:@"title"];
}

/**
 * The notification's message.
 */
- (NSString*) text
{
    return [dict objectForKey:@"text"];
}

/**
 * The notification's badge number.
 */
- (NSInteger) badgeNumber
{
    return [[dict objectForKey:@"badge"] intValue];
}

#pragma mark -
#pragma mark Complex Attributes

/**
 * The notification's alert body.
 */
- (NSString*) alertBody
{
    NSString* title = [self title];
    NSString* msg = [self text];

    NSString* alertBody = msg;

    if (![self stringIsNullOrEmpty:title])
    {
        alertBody = [NSString stringWithFormat:@"%@\n%@",
                     title, msg];
    }

    return alertBody;
}

/**
 * The notification's sound path.
 */
- (NSString*) soundName
{
    NSString* path = [dict objectForKey:@"sound"];

    if ([self stringIsNullOrEmpty:path])
        return NULL;

    if ([path isEqualToString:DEFAULT_SOUND])
        return UILocalNotificationDefaultSoundName;

    if ([path hasPrefix:@"file:/"])
        return [self soundNameForAsset:path];

    if ([path hasPrefix:@"res:"])
        return [self soundNameForResource:path];

    return NULL;
}

/**
 * The notification's fire date.
 */
- (NSDate*) fireDate
{
    double timestamp = [[dict objectForKey:@"at"]
                        doubleValue];

    return [NSDate dateWithTimeIntervalSince1970:timestamp];
}

/**
 * The notification's repeat interval.
 */
- (NSCalendarUnit) repeatInterval
{
    NSString* interval = [dict objectForKey:@"every"];

    if ([self stringIsNullOrEmpty:interval]) {
        return NSCalendarUnitEra;
    }
    else if ([interval isEqualToString:@"second"]) {
        return NSCalendarUnitSecond;
    }
    else if ([interval isEqualToString:@"minute"]) {
        return NSCalendarUnitMinute;
    }
    else if ([interval isEqualToString:@"hour"]) {
        return NSCalendarUnitHour;
    }
    else if ([interval isEqualToString:@"day"]) {
        return NSCalendarUnitDay;
    }
    else if ([interval isEqualToString:@"week"]) {
        return NSCalendarUnitWeekOfYear;
    }
    else if ([interval isEqualToString:@"month"]) {
        return NSCalendarUnitMonth;
    }
    else if ([interval isEqualToString:@"year"]) {
        return NSCalendarUnitYear;
    }

    return NSCalendarUnitEra;
}

#pragma mark -
#pragma mark Methods

/**
 * The notification's user info dict.
 */
- (NSDictionary*) userInfo
{
    if ([dict objectForKey:@"updatedAt"]) {
        NSMutableDictionary* data = [dict mutableCopy];

        [data removeObjectForKey:@"updatedAt"];

        return data;
    }

    return dict;
}

/**
 * If it's a repeating notification.
 */
- (BOOL) isRepeating
{
    NSCalendarUnit interval = self.repeatInterval;

    return !(interval == NSCalendarUnitEra || interval == 0);
}

#pragma mark -
#pragma mark Helpers

/**
 * Convert relative path to valid sound name attribute.
 */
- (NSString*) soundNameForAsset:(NSString*)path
{
    return [path stringByReplacingOccurrencesOfString:@"file:/"
                                           withString:@"www"];
}

/**
 * Convert resource path to valid sound name attribute.
 */
- (NSString*) soundNameForResource:(NSString*)path
{
    return [path pathComponents].lastObject;
}

/**
 * If the string is empty.
 */
- (BOOL) stringIsNullOrEmpty:(NSString*)str
{
    if (str == (NSString*)[NSNull null])
        return YES;

    if ([str isEqualToString:@""])
        return YES;

    return NO;
}

@end
