#import "TGNeoReplyHeaderViewModel.h"
#import "TGNeoLabelViewModel.h"
#import "TGNeoAttachmentViewModel.h"

#import "TGBridgeMessage.h"
#import "TGBridgeChat.h"
#import "TGBridgeUser.h"
#import "TGBridgeReplyMessageMediaAttachment.h"
#import "TGBridgeVideoMediaAttachment.h"

const CGFloat TGNeoReplyHeaderHeight = 29.0f;
const CGFloat TGNeoReplyHeaderLineWidth = 2.0f;
const CGFloat TGNeoReplyHeaderSpacing = 4.0f;
const CGFloat TGNeoReplyHeaderImageWidth = 26.0f;

@interface TGNeoReplyHeaderViewModel ()
{
    TGNeoLabelViewModel *_authorNameModel;
    TGNeoLabelViewModel *_textNameModel;
    TGNeoAttachmentViewModel *_attachmentModel;
    
    bool _outgoing;
}
@end

@implementation TGNeoReplyHeaderViewModel

- (instancetype)initWithReplyAttachment:(TGBridgeReplyMessageMediaAttachment *)attachment users:(NSDictionary *)users outgoing:(bool)outgoing
{
    self = [super init];
    if (self != nil)
    {
        _outgoing = outgoing;
        
        NSString *name = nil;
        id peer = users[@(attachment.message.fromUid)];
        if ([peer isKindOfClass:[TGBridgeUser class]])
            name = [peer displayName];
        else if ([peer isKindOfClass:[TGBridgeChat class]])
            name = [peer groupTitle];
        
        _authorNameModel = [[TGNeoLabelViewModel alloc] initWithText:name font:[UIFont systemFontOfSize:12 weight:UIFontWeightMedium] color:[self normalColorForOutgoing:outgoing] attributes:nil];
        _authorNameModel.multiline = false;
        [self addSubmodel:_authorNameModel];
        
        _attachmentModel = [[TGNeoAttachmentViewModel alloc] initWithAttachments:attachment.message.media author:nil forChannel:false users:nil font:[UIFont systemFontOfSize:12] subTitleColor:[self subtitleColorForOutgoing:outgoing] normalColor:[self textColorForOutgoing:outgoing] compact:true];
        
        for (TGBridgeMediaAttachment *media in attachment.message.media)
        {
            if ([media isKindOfClass:[TGBridgeImageMediaAttachment class]]
                || [media isKindOfClass:[TGBridgeVideoMediaAttachment class]])
            {
                _mediaAttachment = media;
            }
        }
        
        if (_attachmentModel != nil)
        {
            [self addSubmodel:_attachmentModel];
        }
        else
        {
            _textNameModel = [[TGNeoLabelViewModel alloc] initWithText:attachment.message.text font:[UIFont systemFontOfSize:12] color:[self textColorForOutgoing:outgoing] attributes:nil];
            _textNameModel.multiline = false;
            [self addSubmodel:_textNameModel];
        }
    }
    return self;
}

- (UIColor *)normalColorForOutgoing:(bool)outgoing
{
    if (outgoing)
        return [UIColor whiteColor];
    else
        return [UIColor hexColor:0x1f97f8];
}

- (UIColor *)textColorForOutgoing:(bool)outgoing
{
    if (outgoing)
        return [UIColor whiteColor];
    else
        return [UIColor blackColor];
}

- (UIColor *)subtitleColorForOutgoing:(bool)outgoing
{
    if (outgoing)
        return [UIColor hexColor:0xbeddf6];
    else
        return [UIColor hexColor:0x7e7e81];
}

- (CGSize)contentSizeWithContainerSize:(CGSize)containerSize
{
    CGSize nameSize = [_authorNameModel contentSizeWithContainerSize:containerSize];
    CGSize textSize = [_textNameModel contentSizeWithContainerSize:containerSize];
    
    CGFloat maxWidth = MAX(textSize.width, nameSize.width);
    maxWidth += TGNeoReplyHeaderLineWidth + TGNeoReplyHeaderSpacing;
    
    if (_mediaAttachment != nil)
        maxWidth += TGNeoReplyHeaderImageWidth + TGNeoReplyHeaderSpacing;
    
    return CGSizeMake(MIN(maxWidth, containerSize.width), TGNeoReplyHeaderHeight);
}

- (void)setFrame:(CGRect)frame
{
    [super setFrame:frame];
    
    CGFloat xOffset = TGNeoReplyHeaderLineWidth + TGNeoReplyHeaderSpacing;
    if (_mediaAttachment != nil)
        xOffset += TGNeoReplyHeaderImageWidth + TGNeoReplyHeaderSpacing;
    
    _authorNameModel.frame = CGRectMake(xOffset, 0, frame.size.width - xOffset, 20);
    _textNameModel.frame = CGRectMake(xOffset, 14.5f, frame.size.width - xOffset, 20);
    _attachmentModel.frame = CGRectMake(xOffset, 14.5f, frame.size.width - xOffset, 20);
}

- (void)drawInContext:(CGContextRef)context
{
    [super drawInContext:context];
    
    CGContextSetFillColorWithColor(context, [self normalColorForOutgoing:_outgoing].CGColor);
    CGContextFillRect(context, CGRectMake(0, 0, TGNeoReplyHeaderLineWidth, self.frame.size.height));
}

@end
