//
//  TYTextContainer.h
//  TYAttributedLabelDemo
//
//  Created by tanyang on 15/6/4.
//  Copyright (c) 2015年 tanyang. All rights reserved.
//

#import <UIKit/UIKit.h>
#import "TYTextStorageProtocol.h"
#import "NSMutableAttributedString+TY.h"
#import "TYTextStorage.h"
#import "TYLinkTextStorage.h"
#import "TYDrawStorage.h"
#import "TYImageStorage.h"
#import "TYViewStorage.h"

@interface TYTextContainer : NSObject

@property (nonatomic, strong)   NSString    *text;
@property (nonatomic, strong)   NSAttributedString *attributedText;

@property (nonatomic, assign)   NSInteger   numberOfLines;      //行数
@property (nonatomic, strong)   UIColor     *textColor;         // 文字颜色
@property (nonatomic, strong)   UIColor     *linkColor;         //链接颜色
@property (nonatomic, strong)   UIFont      *font;              // 文字大小

@property (nonatomic, assign)   unichar     strokeWidth;    // 空心字边框宽
@property (nonatomic, strong)   UIColor     *strokeColor;   // 空心字边框颜色

@property (nonatomic, assign)   unichar     characterSpacing;   // 字距
@property (nonatomic, assign)   CGFloat     linesSpacing;       // 行距
@property (nonatomic, assign)   CGFloat     paragraphSpacing;   // 段落间距

@property (nonatomic, assign)   CTTextAlignment textAlignment;  // 文本对齐方式 kCTTextAlignmentLeft
@property (nonatomic, assign)   CTLineBreakMode lineBreakMode;  // 换行模式 kCTLineBreakByCharWrapping

@property (nonatomic, assign)   BOOL        isWidthToFit;    // 宽度自适应

// after createTextContainer, have value
@property (nonatomic, assign, readonly) CGFloat     textHeight;
@property (nonatomic, assign, readonly) CGFloat     textWidth;
// after createTextContainer, have value
@property (nonatomic, strong, readonly) NSArray *textStorages;

/**
 *  生成文本容器textContainer
 */
- (instancetype)createTextContainerWithTextWidth:(CGFloat)textWidth;

- (instancetype)createTextContainerWithContentSize:(CGSize)contentSize;

/**
 *  生成属性字符串
 */
- (NSAttributedString *)createAttributedString;

/**
 *  获取文本的size
 */
- (CGSize)getSuggestedSizeWithFramesetter:(CTFramesetterRef)framesetter width:(CGFloat)width;

/**
 *  获取文本高度
 */
- (CGFloat)getHeightWithFramesetter:(CTFramesetterRef)framesetter width:(CGFloat)width;

@end

@interface TYTextContainer (Add)
/**
 *  添加 textStorage （自定义显示内容）
 *
 *  @param textStorage 自定义
 */
- (void)addTextStorage:(id<TYTextStorageProtocol>)textStorage;

/**
 *  添加 textRun数组 （自定义显示内容）
 *
 *  @param textRunArray textRun数组（需遵循协议TYTextStorageProtocol,否则不会添加）
 */
- (void)addTextStorageArray:(NSArray *)textStorageArray;

@end

#pragma mark - append
@interface TYTextContainer (Append)

/**
 *  追加(添加到最后) 普通文本
 *
 *  @param text 普通文本
 */
- (void)appendText:(NSString *)text;

/**
 *  追加(添加到最后) 属性文本
 *
 *  @param attributedText 属性文本
 */
- (void)appendTextAttributedString: (NSAttributedString *)attributedText;

/**
 *  追加(添加到最后) textStorage （自定义显示内容）
 *
 *  @param textStorage 自定义Storage（自定义显示内容）
 */
- (void)appendTextStorage:(id<TYAppendTextStorageProtocol>)textStorage;

/**
 *  追加(添加到最后) textStorage 数组
 *
 *  @param textStorageArray 自定义run数组（需遵循协议TYAppendTextStorageProtocol,否则不会添加）
 */
- (void)appendTextStorageArray:(NSArray *)textStorageArray;

@end

#pragma mark - Link
@interface TYTextContainer (Link)

/**
 *  添加 链接LinkTextStorage
 */
- (void)addLinkWithLinkData:(id)linkData range:(NSRange )range;

/**
 *  添加 链接LinkTextStorage
 */
- (void)addLinkWithLinkData:(id)linkData linkColor:(UIColor *)linkColor range:(NSRange )range;

/**
 *  添加 链接LinkTextStorage
 *
 *  @param linkData         链接携带的数据
 *  @param linkColor        链接颜色
 *  @param underLineStyle   下划线样式（无，单 双) 默认单
 *  @param range            范围
 */
- (void)addLinkWithLinkData:(id)linkData linkColor:(UIColor *)linkColor underLineStyle:(CTUnderlineStyle)underLineStyle range:(NSRange )range;

/**
 *  追加 链接LinkTextStorage
 */
- (void)appendLinkWithText:(NSString *)linkText linkFont:(UIFont *)linkFont linkData:(id)linkData;

/**
 *  追加 链接LinkTextStorage
 */
- (void)appendLinkWithText:(NSString *)linkText linkFont:(UIFont *)linkFont linkColor:(UIColor *)linkColor linkData:(id)linkData;

/**
 *  追加 链接LinkTextStorage
 *
 *  @param linkText         链接文本
 *  @param linkData         链接携带的数据
 *  @param underLineStyle   下划线样式（无，单 双) 默认单
 */
- (void)appendLinkWithText:(NSString *)linkText linkFont:(UIFont *)linkFont linkColor:(UIColor *)linkColor underLineStyle:(CTUnderlineStyle)underLineStyle linkData:(id)linkData;

@end

#pragma mark - 扩展支持UIImage
@interface TYTextContainer (UIImage)

#pragma mark - addImageStorage

/**
 *  添加 imageStorage image数据
 */
- (void)addImage:(UIImage *)image range:(NSRange)range;

/**
 *  添加 imageStorage image数据
 */
- (void)addImage:(UIImage *)image range:(NSRange)range size:(CGSize)size;

/**
 *  添加 imageStorage image数据
 *
 *  @param image        image
 *  @param range        所在文本位置
 *  @param size         图片大小
 *  @param alignment    图片对齐方式
 */
- (void)addImage:(UIImage *)image range:(NSRange)range
            size:(CGSize)size
       alignment: (TYDrawAlignment)alignment;

/**
 *  添加 imageStorage image数据
 */
- (void)addImageWithName:(NSString *)imageName range:(NSRange)range;

/**
 *  添加 imageStorage image数据
 */
- (void)addImageWithName:(NSString *)imageName
                   range:(NSRange)range
                    size:(CGSize)size;

/**
 *  添加 imageStorage image数据
 *
 *  @param imageName    image名
 *  @param range        所在文本位置
 *  @param size         图片大小
 *  @param alignment    图片对齐方式
 */
- (void)addImageWithName:(NSString *)imageName
                   range:(NSRange)range
                    size:(CGSize)size
               alignment:(TYDrawAlignment)alignment;

#pragma mark - appendImageStorage

/**
 *  追加 imageStorage image数据
 */
- (void)appendImage:(UIImage *)image;

/**
 *  追加 imageStorage image数据
 */
- (void)appendImage:(UIImage *)image
               size:(CGSize)size;

/**
 *  追加 imageStorage image数据
 *
 *  @param image    image
 *  @param size         图片大小
 *  @param alignment    图片对齐
 */
- (void)appendImage:(UIImage *)image
               size:(CGSize)size
          alignment:(TYDrawAlignment)alignment;

/**
 *  追加 imageStorage image数据
 */
- (void)appendImageWithName:(NSString *)imageName;

/**
 *  追加 imageStorage image数据
 */
- (void)appendImageWithName:(NSString *)imageName size:(CGSize)size;

/**
 *  追加 imageStorage image数据
 *
 *  @param imageName    imageName
 *  @param size         图片大小
 *  @param alignment    图片对齐
 */
- (void)appendImageWithName:(NSString *)imageName
                       size:(CGSize)size
                  alignment:(TYDrawAlignment)alignment;


@end

#pragma mark - 扩展支持UIView
@interface TYTextContainer (UIView)

/**
 *  添加 viewStorage (添加 UI控件 需要设置frame)
 */
- (void)addView:(UIView *)view range:(NSRange)range;

/**
 *  添加 viewStorage (添加 UI控件 需要设置frame)
 *
 *  @param view         UIView (UI控件)
 *  @param range        所在文本位置
 *  @param alignment    view对齐方式
 */
- (void)addView:(UIView *)view
          range:(NSRange)range
      alignment:(TYDrawAlignment)alignment;

/**
 *  追加 viewStorage (添加 UI控件 需要设置frame)
 */
- (void)appendView:(UIView *)view;

/**
 *  追加 viewStorage (添加 UI控件 需要设置frame)
 *
 *  @param view  UIView (UI控件)
 *  @param alignment view对齐
 */
- (void)appendView:(UIView *)view alignment:(TYDrawAlignment)alignment;

@end


