#import "TDToastView.h"

@implementation TDToastView
{
    UITextView *_textView;
}

#define TOAST_HORIZONTAL_PADDING 20.0
#define TOAST_VERTICAL_PADDING 15.0

- (instancetype)initWithFrame:(CGRect)frame {
    if ((self = [super initWithFrame:frame])) {
        _textView = [[UITextView alloc] initWithFrame:CGRectZero];
        _textView.opaque = NO;
        _textView.editable = NO;
        _textView.selectable = NO;
        _textView.textColor = [UIColor whiteColor];
        _textView.backgroundColor = [UIColor clearColor];
        _textView.userInteractionEnabled = YES;
        [self addSubview:_textView];
        self.alpha = 0.9;
        self.backgroundColor = [UIColor darkGrayColor];
        self.layer.cornerRadius = 20.0;
        self.opaque = NO;
        self.userInteractionEnabled = YES;
        [self addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(_tapHandler:)]];
    }
    return self;
}

+ (instancetype)showInWindow:(UIWindow *)window text:(NSString *)text duration:(NSTimeInterval)duration {
    TDToastView *toast = [[self alloc] initWithFrame:CGRectZero];
    toast.text = text;
    [toast showInWindow:window duration:duration];
    return toast;
}

- (void)showInWindow:(UIWindow *)window duration:(NSTimeInterval)duration {
    CGRect windowBounds = CGRectInset(window.bounds, 20.0, 20.0);
    CGRect toastBounds = CGRectZero;
    toastBounds.size = [self sizeThatFits:windowBounds.size];
    self.bounds = toastBounds;
    self.center = CGPointMake(CGRectGetMidX(windowBounds), CGRectGetMidY(windowBounds));
    CGFloat alpha = self.alpha;
    self.alpha = 0.0;
    [window addSubview:self];
    [UIView animateWithDuration:0.3 animations:^{
        self.alpha = alpha;
    } completion:^(BOOL finishedShowing) {
        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(duration * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
            [self dismiss];
        });
    }];
}

- (NSString *)text {
    return _textView.text;
}

- (void)setText:(NSString *)text {
    _textView.text = text;
}

- (void)dismiss {
    if (!self.superview) {
        return;
    }
    [UIView animateWithDuration:0.3 animations:^{
        self.alpha = 0.0;
    } completion:^(BOOL finishedHiding) {
        [self removeFromSuperview];
    }];
}

- (void)_tapHandler:(UITapGestureRecognizer *)tapGestureRecognizer {
    [self dismiss];
}

- (void)layoutSubviews {
    [super layoutSubviews];
    _textView.frame = CGRectInset(self.bounds, TOAST_HORIZONTAL_PADDING, TOAST_VERTICAL_PADDING);
}

- (CGSize)sizeThatFits:(CGSize)size {
    CGSize textConstrainedSize = CGSizeMake(size.width - 2 * TOAST_HORIZONTAL_PADDING,
                                          size.height - 2 * TOAST_VERTICAL_PADDING);
    CGSize textSize = [_textView sizeThatFits:textConstrainedSize];
    CGFloat width = MIN(size.width, textSize.width + 2 * TOAST_HORIZONTAL_PADDING);
    CGFloat height = MIN(size.height, textSize.height + 2 * TOAST_VERTICAL_PADDING);
    return CGSizeMake(width, height);
}

@end
