//
//  GMInfinitelView.m
//  
//
//  Created by wangyang on 10/12/15.
//  Copyright (c) 2015年 Wanmeichuangyi. All rights reserved.
//

#import "GMInfiniteScrollView.h"
#import "GMImageView.h"

#define IMAGE_TAG       1000

@implementation GMInfiniteScrollView

- (void)setup{
    [super setup];
    // 显示的是图片数组里的第一张图片
    // 和数组是+1关系
    _currentPage = 0;

    _scrollView = [[UIScrollView alloc] initWithFrame:self.bounds];
    _scrollView.backgroundColor = UIColor.whiteColor;
    _scrollView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
    _scrollView.showsHorizontalScrollIndicator = NO;
    _scrollView.showsVerticalScrollIndicator = NO;
    _scrollView.pagingEnabled = YES;
    _scrollView.delegate = self;
    _scrollView.scrollsToTop = NO;
    [self addSubview:_scrollView];
    
    self.pageControl = [UIPageControl new];
    self.pageControl.currentPage = 0;
    self.pageControl.hidesForSinglePage = YES;
    [self addSubview:self.pageControl];

    self.imageContentMode = UIViewContentModeScaleAspectFill;

    // 在应用后台时关闭播放，前台时开启
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(stopRolling) name:UIApplicationDidEnterBackgroundNotification object:nil];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(startRolling) name:UIApplicationWillEnterForegroundNotification object:nil];
}


- (void)layoutSubviews{
    [super layoutSubviews];
    
    self.pageControl.frame = CGRectMake(0, self.frame.size.height-15, self.frame.size.width, 15);
    self.pageControl.center = CGPointMake(self.frame.size.width / 2, self.pageControl.center.y);
}


- (void)dealloc
{
    self.delegate = nil;
    [[NSNotificationCenter defaultCenter] removeObserver:self];
    [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(rollingScrollAction) object:nil];
}
#pragma mark - Setter
- (void)setImageArray:(NSArray *)imageArray{

    _imageArray = imageArray;

    if(_imageArray.count == 0) {
        return;
    }

    // 如果只有一个，不允许滑动
    _scrollView.scrollEnabled = _imageArray.count == 1 ? NO : YES;

    _scrollView.contentSize = CGSizeMake(_scrollView.frame.size.width * 3,
                                         _scrollView.frame.size.height);
    for (NSInteger i = 0; i < 3; i++){
        CGRect frame = CGRectOffset(_scrollView.bounds, _scrollView.frame.size.width * i, 0);
        GMImageView *imageView = [[GMImageView alloc] initWithFrame:frame];
        imageView.userInteractionEnabled = YES;
        imageView.clipsToBounds = YES;
        imageView.contentMode = self.imageContentMode;
        imageView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
        imageView.tag = i + IMAGE_TAG;
        UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTap:)];
        [imageView addGestureRecognizer:singleTap];
        [_scrollView addSubview:imageView];
    }
    
    self.pageControl.numberOfPages = self.self.imageArray.count;

    _currentPage = 1;
    [self refreshScrollView];
}

#pragma mark - Custom Method
- (void)refreshScrollView{
    NSArray *imageArray = [self getDisplayImagesWithPageIndex:_currentPage];
    for (NSInteger i = 0; i < 3; i++){
        GMImageView *imageView = (GMImageView *)[_scrollView viewWithTag:i + IMAGE_TAG];
        NSString *url = imageArray[i];
        [imageView setImageWithUrlString:url placeHolder:nil];
    }
    
    // 水平滚动
    _scrollView.contentOffset = CGPointMake(_scrollView.frame.size.width, 0);
    self.pageControl.currentPage = _currentPage-1;
}

- (NSArray *)getDisplayImagesWithPageIndex:(NSInteger)page{
    NSInteger pre = [self getPageIndex:_currentPage-1];
    NSInteger last = [self getPageIndex:_currentPage+1];
    
    NSMutableArray *images = [NSMutableArray arrayWithCapacity:0];
    
    [images addObject:[self.imageArray objectAtIndex:pre-1]];
    [images addObject:[self.imageArray objectAtIndex:_currentPage-1]];
    [images addObject:[self.imageArray objectAtIndex:last-1]];
    
    return images;
}

- (NSInteger)getPageIndex:(NSInteger)index{
    // value＝1为第一张，value = 0为前面一张
    if (index == 0)
    {
        index = self.imageArray.count;
    }
    
    if (index == self.imageArray.count + 1)
    {
        index = 1;
    }
    
    return index;
}


#pragma mark - UIScrollViewDelegate
- (void)scrollViewDidScroll:(UIScrollView *)scrollView{
    NSInteger x = scrollView.contentOffset.x;
    
    //取消已加入的延迟线程
    if (self.enableRolling)
    {
        [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(rollingScrollAction) object:nil];
    }
    
    // 往下翻一张
    if (x >= 2 * _scrollView.frame.size.width)
    {
        _currentPage = [self getPageIndex:_currentPage+1];
        [self refreshScrollView];
    }

    if (x <= 0)
    {
        _currentPage = [self getPageIndex:_currentPage-1];
        [self refreshScrollView];
    }
}

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView{
    _scrollView.contentOffset = CGPointMake(_scrollView.frame.size.width, 0);
    if (self.enableRolling)
    {
        [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(rollingScrollAction) object:nil];
        [self performSelector:@selector(rollingScrollAction) withObject:nil afterDelay:self.timeInterval inModes:[NSArray arrayWithObject:NSRunLoopCommonModes]];
    }
}


#pragma mark - Action
- (void)startRolling{
    if (self.imageArray.count == 0 || self.imageArray.count == 1){
        return;
    }
    
    [self stopRolling];
    
    self.enableRolling = YES;
    [self performSelector:@selector(rollingScrollAction) withObject:nil afterDelay:self.timeInterval];
}

- (void)stopRolling{
    self.enableRolling = NO;
    //取消已加入的延迟线程
    [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(rollingScrollAction) object:nil];
}

- (void)rollingScrollAction{
    // 滑动动画由我们自己完成
    [UIView animateWithDuration:0.25 animations:^{
        _scrollView.contentOffset = CGPointMake(1.99*_scrollView.frame.size.width, 0);
    } completion:^(BOOL finished) {
        if (finished)
        {
            _currentPage = [self getPageIndex:_currentPage+1];
            [self refreshScrollView];
            
            if (self.enableRolling)
            {
                [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(rollingScrollAction) object:nil];
                [self performSelector:@selector(rollingScrollAction) withObject:nil afterDelay:self.timeInterval inModes:[NSArray arrayWithObject:NSRunLoopCommonModes]];
            }
        }
    }];
}

- (void)handleTap:(UITapGestureRecognizer *)tap{
    if ([self.delegate respondsToSelector:@selector(infiniteScrollView:didSelectIndex:)]){
        [self.delegate infiniteScrollView:self didSelectIndex:_currentPage-1];
    }
}
@end
