//
//  XXGLoadingView.m
//  XXGPlayKit
//
//  Created by apple on 2025/3/11.
//

#import "XXGLoadingView.h"
#import "XXGWindowManager.h"
#import "XXGUIDriver.h"
#import "Masonry.h"

@interface XXGLoadingView ()

@property (nonatomic, strong) UIView *xxpk_loadingBackgroundView;
@property (nonatomic, strong) UIActivityIndicatorView *activityIndicator;
@property (nonatomic, strong) UILabel *loadingLabel;
@end

@implementation XXGLoadingView

// 用于 window 显示的单例
static XXGLoadingView *sharedLoadingView = nil;

#pragma mark - 初始化与视图设置

- (instancetype)initWithFrame:(CGRect)frame {
    self = [super initWithFrame:frame];
    if (self) {
        [self setupView];
    }
    return self;
}
- (instancetype)initWithCoder:(NSCoder *)coder {
    self = [super initWithCoder:coder];
    if (self) {
        [self setupView];
    }
    return self;
}
- (void)setupView {
    
    // 设置半透明黑色背景和圆角效果
    self.xxpk_loadingBackgroundView = [UIView new];
    self.xxpk_loadingBackgroundView.backgroundColor = [[UIColor blackColor] colorWithAlphaComponent:0.5];
    self.xxpk_loadingBackgroundView.layer.cornerRadius = 2.0;
    self.xxpk_loadingBackgroundView.clipsToBounds = YES;
    [self addSubview:self.xxpk_loadingBackgroundView];
    
    // 初始化加载指示器（大号白色样式）
    self.activityIndicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleLarge];
    self.activityIndicator.color = XXGUIDriver.xxpk_mainColor;
    [self.xxpk_loadingBackgroundView addSubview:self.activityIndicator];
    
    // 初始化加载提示文字
    self.loadingLabel = [[UILabel alloc] init];
    self.loadingLabel.text = XXGUIDriver.xxpk_string_ui.xxpk_loading;
    self.loadingLabel.textColor = [UIColor whiteColor];
    self.loadingLabel.font = [UIFont systemFontOfSize:14];
    self.loadingLabel.numberOfLines = 0;
    self.loadingLabel.textAlignment = NSTextAlignmentCenter;
    [self.xxpk_loadingBackgroundView addSubview:self.loadingLabel];
    
    // Auto Layout 布局
    [self.xxpk_loadingBackgroundView mas_makeConstraints:^(MASConstraintMaker *make) {
        make.size.mas_equalTo(CGSizeMake(XXGUIDriver.xxpk_data_ui.xxpk_float120, XXGUIDriver.xxpk_data_ui.xxpk_float120));
        make.center.equalTo(self);
    }];
    
    [self.activityIndicator mas_makeConstraints:^(MASConstraintMaker *make) {
        make.top.mas_equalTo(XXGUIDriver.xxpk_data_ui.xxpk_float20);
        make.centerX.equalTo(self.xxpk_loadingBackgroundView.mas_centerX);
    }];
    
    [self.loadingLabel mas_makeConstraints:^(MASConstraintMaker *make) {
        make.top.equalTo(self.activityIndicator.mas_bottom).offset(XXGUIDriver.xxpk_data_ui.xxpk_float20);
        make.centerX.equalTo(self.xxpk_loadingBackgroundView.mas_centerX);
        make.left.equalTo(self.xxpk_loadingBackgroundView.mas_left).offset(XXGUIDriver.xxpk_data_ui.xxpk_float8);
        make.right.equalTo(self.xxpk_loadingBackgroundView.mas_right).offset(-XXGUIDriver.xxpk_data_ui.xxpk_float8);
    }];
    
    // 初始隐藏
    self.hidden = YES;
}

#pragma mark - 实例方法

- (void)startAnimating {
    self.hidden = NO;
    [self.activityIndicator startAnimating];
}

- (void)stopAnimating {
    [self.activityIndicator stopAnimating];
    self.hidden = YES;
}

- (void)setLoadingText:(NSString *)text {
    self.loadingLabel.text = text;
    
    // 更新宽度
    CGFloat textWidth = [text boundingRectWithSize:CGSizeMake(CGFLOAT_MAX, CGFLOAT_MAX)
                                          options:NSStringDrawingUsesLineFragmentOrigin
                                       attributes:@{NSFontAttributeName: self.loadingLabel.font}
                                          context:nil].size.width;
    UIWindow *window = [[XXGWindowManager shared] xxpk_currentWindow];
    CGFloat desiredWidth = MIN(MAX(120, textWidth + 2 * 8), window.bounds.size.width);
    [self.xxpk_loadingBackgroundView mas_updateConstraints:^(MASConstraintMaker *make) {
        make.width.mas_equalTo(desiredWidth);
    }];
    // 强制更新布局
    [self layoutIfNeeded];
}

#pragma mark - 类方法（在 window 上显示）
+ (void)showLoadingOnWindow {
    [self showLoadingOnWindowWithText:XXGUIDriver.xxpk_string_ui.xxpk_loading];
}

+ (void)showLoadingOnWindowWithText:(NSString *)text {
    dispatch_async(dispatch_get_main_queue(), ^{
        UIWindow *window = [[XXGWindowManager shared] xxpk_currentWindow];
        
        if (!sharedLoadingView) {
            CGSize size = UIScreen.mainScreen.bounds.size;
            sharedLoadingView = [[XXGLoadingView alloc] initWithFrame:CGRectMake(0, 0, size.width, size.height)];
            sharedLoadingView.center = window.center;
        }
        if (!sharedLoadingView.superview) {
            [window addSubview:sharedLoadingView];
        }
        [sharedLoadingView setLoadingText:text];
        [sharedLoadingView startAnimating];
    });
}

+ (void)hideLoadingFromWindow {
    dispatch_async(dispatch_get_main_queue(), ^{
        [sharedLoadingView stopAnimating];
        [sharedLoadingView removeFromSuperview];
        sharedLoadingView = nil;
    });
}

#pragma mark - 类方法（在指定视图上显示）
+ (XXGLoadingView *)showLoadingOnView:(UIView *)view {
    return [self showLoadingOnView:view withText:XXGUIDriver.xxpk_string_ui.xxpk_loading];
}

+ (XXGLoadingView *)showLoadingOnView:(UIView *)view withText:(NSString *)text {
    __block XXGLoadingView *loadingView = nil;
    dispatch_async(dispatch_get_main_queue(), ^{
        // 创建一个新的实例，frame 可以根据需求调整
        loadingView = [[XXGLoadingView alloc] initWithFrame:CGRectMake(0, 0, view.frame.size.width, view.frame.size.height)];
        loadingView.center = CGPointMake(CGRectGetMidX(view.bounds), CGRectGetMidY(view.bounds));
        [loadingView setLoadingText:text];
        [loadingView startAnimating];
        [view addSubview:loadingView];
    });
    return loadingView;
}

+ (void)hideLoadingFromView:(UIView *)view {
    dispatch_async(dispatch_get_main_queue(), ^{
        // 遍历 view 的 subviews，移除所有 XXGLoadingView
        for (UIView *subview in view.subviews) {
            if ([subview isKindOfClass:[XXGLoadingView class]]) {
                [(XXGLoadingView *)subview stopAnimating];
                [subview removeFromSuperview];
            }
        }
    });
}

@end
