//
//  UIView+YSMASAdditions.m
//  Masonry
//
//  Created by Jonas Budelmann on 20/07/13.
//  Copyright (c) 2013 cloudling. All rights reserved.
//

#import "View+YSMASAdditions.h"
#import <objc/runtime.h>

@implementation YSMAS_VIEW (YSMASAdditions)

- (NSArray *)ysmas_makeConstraints:(void(^)(YSMASConstraintMaker *))block {
    self.translatesAutoresizingMaskIntoConstraints = NO;
    YSMASConstraintMaker *constraintMaker = [[YSMASConstraintMaker alloc] initWithView:self];
    block(constraintMaker);
    return [constraintMaker install];
}

- (NSArray *)ysmas_updateConstraints:(void(^)(YSMASConstraintMaker *))block {
    self.translatesAutoresizingMaskIntoConstraints = NO;
    YSMASConstraintMaker *constraintMaker = [[YSMASConstraintMaker alloc] initWithView:self];
    constraintMaker.updateExisting = YES;
    block(constraintMaker);
    return [constraintMaker install];
}

- (NSArray *)ysmas_remakeConstraints:(void(^)(YSMASConstraintMaker *make))block {
    self.translatesAutoresizingMaskIntoConstraints = NO;
    YSMASConstraintMaker *constraintMaker = [[YSMASConstraintMaker alloc] initWithView:self];
    constraintMaker.removeExisting = YES;
    block(constraintMaker);
    return [constraintMaker install];
}

#pragma mark - NSLayoutAttribute properties

- (YSMASViewAttribute *)ysmas_left {
    return [[YSMASViewAttribute alloc] initWithView:self layoutAttribute:NSLayoutAttributeLeft];
}

- (YSMASViewAttribute *)ysmas_top {
    return [[YSMASViewAttribute alloc] initWithView:self layoutAttribute:NSLayoutAttributeTop];
}

- (YSMASViewAttribute *)ysmas_right {
    return [[YSMASViewAttribute alloc] initWithView:self layoutAttribute:NSLayoutAttributeRight];
}

- (YSMASViewAttribute *)ysmas_bottom {
    return [[YSMASViewAttribute alloc] initWithView:self layoutAttribute:NSLayoutAttributeBottom];
}

- (YSMASViewAttribute *)ysmas_leading {
    return [[YSMASViewAttribute alloc] initWithView:self layoutAttribute:NSLayoutAttributeLeading];
}

- (YSMASViewAttribute *)ysmas_trailing {
    return [[YSMASViewAttribute alloc] initWithView:self layoutAttribute:NSLayoutAttributeTrailing];
}

- (YSMASViewAttribute *)ysmas_width {
    return [[YSMASViewAttribute alloc] initWithView:self layoutAttribute:NSLayoutAttributeWidth];
}

- (YSMASViewAttribute *)ysmas_height {
    return [[YSMASViewAttribute alloc] initWithView:self layoutAttribute:NSLayoutAttributeHeight];
}

- (YSMASViewAttribute *)ysmas_centerX {
    return [[YSMASViewAttribute alloc] initWithView:self layoutAttribute:NSLayoutAttributeCenterX];
}

- (YSMASViewAttribute *)ysmas_centerY {
    return [[YSMASViewAttribute alloc] initWithView:self layoutAttribute:NSLayoutAttributeCenterY];
}

- (YSMASViewAttribute *)ysmas_baseline {
    return [[YSMASViewAttribute alloc] initWithView:self layoutAttribute:NSLayoutAttributeBaseline];
}

- (YSMASViewAttribute *(^)(NSLayoutAttribute))ysmas_attribute
{
    return ^(NSLayoutAttribute attr) {
        return [[YSMASViewAttribute alloc] initWithView:self layoutAttribute:attr];
    };
}

#if (__IPHONE_OS_VERSION_MIN_REQUIRED >= 80000) || (__TV_OS_VERSION_MIN_REQUIRED >= 9000) || (__MAC_OS_X_VERSION_MIN_REQUIRED >= 101100)

- (YSMASViewAttribute *)ysmas_firstBaseline {
    return [[YSMASViewAttribute alloc] initWithView:self layoutAttribute:NSLayoutAttributeFirstBaseline];
}
- (YSMASViewAttribute *)ysmas_lastBaseline {
    return [[YSMASViewAttribute alloc] initWithView:self layoutAttribute:NSLayoutAttributeLastBaseline];
}

#endif

#if (__IPHONE_OS_VERSION_MIN_REQUIRED >= 80000) || (__TV_OS_VERSION_MIN_REQUIRED >= 9000)

- (YSMASViewAttribute *)ysmas_leftMargin {
    return [[YSMASViewAttribute alloc] initWithView:self layoutAttribute:NSLayoutAttributeLeftMargin];
}

- (YSMASViewAttribute *)ysmas_rightMargin {
    return [[YSMASViewAttribute alloc] initWithView:self layoutAttribute:NSLayoutAttributeRightMargin];
}

- (YSMASViewAttribute *)ysmas_topMargin {
    return [[YSMASViewAttribute alloc] initWithView:self layoutAttribute:NSLayoutAttributeTopMargin];
}

- (YSMASViewAttribute *)ysmas_bottomMargin {
    return [[YSMASViewAttribute alloc] initWithView:self layoutAttribute:NSLayoutAttributeBottomMargin];
}

- (YSMASViewAttribute *)ysmas_leadingMargin {
    return [[YSMASViewAttribute alloc] initWithView:self layoutAttribute:NSLayoutAttributeLeadingMargin];
}

- (YSMASViewAttribute *)ysmas_trailingMargin {
    return [[YSMASViewAttribute alloc] initWithView:self layoutAttribute:NSLayoutAttributeTrailingMargin];
}

- (YSMASViewAttribute *)ysmas_centerXWithinMargins {
    return [[YSMASViewAttribute alloc] initWithView:self layoutAttribute:NSLayoutAttributeCenterXWithinMargins];
}

- (YSMASViewAttribute *)ysmas_centerYWithinMargins {
    return [[YSMASViewAttribute alloc] initWithView:self layoutAttribute:NSLayoutAttributeCenterYWithinMargins];
}

#endif

#if (__IPHONE_OS_VERSION_MAX_ALLOWED >= 110000) || (__TV_OS_VERSION_MAX_ALLOWED >= 110000)

- (YSMASViewAttribute *)ysmas_safeAreaLayoutGuide {
    return [[YSMASViewAttribute alloc] initWithView:self item:self.safeAreaLayoutGuide layoutAttribute:NSLayoutAttributeBottom];
}
- (YSMASViewAttribute *)ysmas_safeAreaLayoutGuideTop {
    return [[YSMASViewAttribute alloc] initWithView:self item:self.safeAreaLayoutGuide layoutAttribute:NSLayoutAttributeTop];
}
- (YSMASViewAttribute *)ysmas_safeAreaLayoutGuideBottom {
    return [[YSMASViewAttribute alloc] initWithView:self item:self.safeAreaLayoutGuide layoutAttribute:NSLayoutAttributeBottom];
}
- (YSMASViewAttribute *)ysmas_safeAreaLayoutGuideLeft {
    return [[YSMASViewAttribute alloc] initWithView:self item:self.safeAreaLayoutGuide layoutAttribute:NSLayoutAttributeLeft];
}
- (YSMASViewAttribute *)ysmas_safeAreaLayoutGuideRight {
    return [[YSMASViewAttribute alloc] initWithView:self item:self.safeAreaLayoutGuide layoutAttribute:NSLayoutAttributeRight];
}

#endif

#pragma mark - associated properties

- (id)ysmas_key {
    return objc_getAssociatedObject(self, @selector(ysmas_key));
}

- (void)setYsmas_key:(id)key {
    objc_setAssociatedObject(self, @selector(ysmas_key), key, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}

#pragma mark - heirachy

- (instancetype)ysmas_closestCommonSuperview:(YSMAS_VIEW *)view {
    YSMAS_VIEW *closestCommonSuperview = nil;

    YSMAS_VIEW *secondViewSuperview = view;
    while (!closestCommonSuperview && secondViewSuperview) {
        YSMAS_VIEW *firstViewSuperview = self;
        while (!closestCommonSuperview && firstViewSuperview) {
            if (secondViewSuperview == firstViewSuperview) {
                closestCommonSuperview = secondViewSuperview;
            }
            firstViewSuperview = firstViewSuperview.superview;
        }
        secondViewSuperview = secondViewSuperview.superview;
    }
    return closestCommonSuperview;
}

@end
