#import "XMPPMessage+XEP_0308.h"
#import "NSXMLElement+XMPP.h"

#if ! __has_feature(objc_arc)
#warning This file must be compiled with ARC. Use -fobjc-arc flag (or convert project to ARC).
#endif

#define NAME_XMPP_MESSAGE_CORRECT @"replace"
#define XMLNS_XMPP_MESSAGE_CORRECT @"urn:xmpp:message-correct:0"

@implementation XMPPMessage (XEP_0308)

- (BOOL)isMessageCorrection
{    
    if([[self correctedMessageID] length])
    {
        return YES;
    }
    else
    {
        return NO;
    }
}

- (NSString *)correctedMessageID
{
    return [[self elementForName:NAME_XMPP_MESSAGE_CORRECT xmlns:XMLNS_XMPP_MESSAGE_CORRECT] attributeStringValueForName:@"id"];
}

- (void)addMessageCorrectionWithID:(NSString *)messageCorrectionID
{
    NSXMLElement *replace = [NSXMLElement elementWithName:NAME_XMPP_MESSAGE_CORRECT stringValue:XMLNS_XMPP_MESSAGE_CORRECT];
    [replace addAttributeWithName:@"id" stringValue:messageCorrectionID];
    [self addChild:replace];
}

- (XMPPMessage *)generateCorrectionMessageWithID:(NSString *)elementID
{
    XMPPMessage *correctionMessage = nil;

    if([[self elementID] length] && ![self isMessageCorrection])
    {
        correctionMessage = [self copy];

        [correctionMessage removeAttributeForName:@"id"];

        if([elementID length])
        {
            [correctionMessage addAttributeWithName:@"id" stringValue:elementID];
        }

        [correctionMessage addMessageCorrectionWithID:[self elementID]];
    }

    return correctionMessage;
}

- (XMPPMessage *)generateCorrectionMessageWithID:(NSString *)elementID body:(NSString *)body
{
    XMPPMessage *correctionMessage = nil;

    if([[self elementID] length] && ![self isMessageCorrection])
    {
        correctionMessage = [self copy];

        [correctionMessage removeAttributeForName:@"id"];

        if([elementID length])
        {
            [correctionMessage addAttributeWithName:@"id" stringValue:elementID];
        }

        NSXMLElement *bodyElement = [correctionMessage elementForName:@"body"];

        if(bodyElement)
        {
            [correctionMessage removeChildAtIndex:[[correctionMessage children] indexOfObject:bodyElement]];
        }

        [self addBody:body];

        [correctionMessage addMessageCorrectionWithID:[self elementID]];
    }

    return correctionMessage;
}

@end
