//
//  KWMSelectSizeViewController.m
//  iCemarose
//
//  Created by HouWeiBin on 17/6/26.
//  Copyright © 2016年 kollway. All rights reserved.
//



#import "KWMVariantsVC.h"
#import "KWMProductSizeCell.h"
#import "KWMProductColorCell.h"
#import "KWMCurrencyUtil.h"
#import "KWMStringUtil.h"
#import "BUYProductVariant+Currency.h"
#import "UIColor+SAMAdditions.h"

@interface KWMVariantsVC ()

@property(nonatomic,weak) IBOutlet NSLayoutConstraint *vContentHeight;

@property (weak, nonatomic) IBOutlet UICollectionView *cvVariants;

@property(nonatomic) IBOutlet UILabel *lbPrice;

@property(nonatomic) IBOutlet UILabel *lbCount;

@property(weak,nonatomic) IBOutlet UIView *vCount;

@property(nonatomic) NSInteger count;

@property(nonatomic) NSDecimalNumber *totalPrice;

@property(nonatomic) BUYProductVariant *selectVariant;

@property(nonatomic) KWMVariants *selectAdminVariant;

@property(nonatomic) KWMColor *selectColor;

@property (nonatomic) NSArray<BUYProductVariant *> *variantArray;

//請求api拿到的admin 規格列表,主要使用到其中的庫存剩餘字段
@property (nonatomic) NSArray<KWMVariants *> *adminVariantArray;

@end

@implementation KWMVariantsVC

+(NSString *)kwmTag{
    return @"KWMVariantsVC";
}

-(void)viewDidLoad{
    [super viewDidLoad];
    [self initView];
}

-(void)viewDidLayoutSubviews{
    [super viewDidLayoutSubviews];
    //在小屏机/ipad时,uicollectionview初始显示超出宽度的问题。
    [self.cvVariants reloadData];
}

-(NSDecimalNumber *)totalPrice{
    if(_totalPrice){
        return _totalPrice;
    }
    return [NSDecimalNumber decimalNumberWithString:@"0"];
}

-(NSArray<BUYProductVariant *> *)variantArray{
    if(_variantArray){
        return _variantArray;
    }
    return [NSArray array];
}

-(void)setDefaultSelect:(BUYProductVariant *)variant color:(KWMColor *)color count:(NSInteger)count{
    self.selectColor = color;
    self.selectVariant = variant;
    self.count = count;
}

-(void)setAdminVariantArray:(NSArray<KWMVariants *> *)adminVariantArray{
    _adminVariantArray = adminVariantArray;
    if(adminVariantArray && self.selectVariant){
        for(KWMVariants *variant in adminVariantArray){
            if(self.selectVariant.identifier.integerValue == variant.id.integerValue){
                self.selectAdminVariant = variant;
            }
        }
    }
}

-(void)setProduct:(BUYProduct *)product{
    _product = product;
    if(product){
        self.variantArray = product.variantsArray;
    }
}

-(void)setAdminProduct:(KWMProduct *)adminProduct{
    _adminProduct = adminProduct;
    if(adminProduct){
        self.adminVariantArray = adminProduct.variants;
    }
}

-(void)setShopCartModel:(KWMShopCartModel *)shopCartModel{
    _shopCartModel = shopCartModel;
    if(shopCartModel && self.variantArray){
        for (BUYProductVariant *variant in self.variantArray){
            if([shopCartModel.size isEqualToString:variant.title]){
                self.selectVariant = variant;
                self.count = shopCartModel.quantity;
            }
        }
    }
}

-(void)initView{
    [self initDefaultColor];
    [self initUI];
    [self initCollectionView];
    [self initContentHeight];
    if(!self.adminProduct){
        [self requestAdminProduct:self.product.identifier];
    }
}


-(void)initDefaultColor{
    if(self.product && self.colorArray && !self.selectColor){
        for(KWMColor *color in self.colorArray){
            if([color.handle isEqual:self.product.handle]){
                self.selectColor = color;
                self.selectColor.adminProduct = self.adminProduct;
                return;
            }
        }
    }else if(self.selectColor && self.selectColor.product){
        self.variantArray = self.selectColor.product.variantsArray;
    }
}

-(void)initUI{
    if(self.selectVariant){
        self.totalPrice = [self.selectVariant.price decimalNumberByMultiplyingBy:[NSDecimalNumber decimalNumberWithDecimal:@(self.count).decimalValue]];
    }
    self.vCount.hidden = self.wish?YES:NO;
    self.lbCount.text = [NSString stringWithFormat:@"%ld",(long)self.count];
    self.lbPrice.text = [[KWMCurrencyUtil sharedInstance] priceFormattedByCurrencyCode:self.totalPrice];
}

-(void)initCollectionView{
    [self.cvVariants registerNib:[UINib nibWithNibName:NSStringFromClass([KWMProductColorCell class]) bundle:nil] forCellWithReuseIdentifier:NSStringFromClass([KWMProductColorCell class])];
    [self.cvVariants registerNib:[UINib nibWithNibName:NSStringFromClass([KWMProductSizeCell class]) bundle:nil] forCellWithReuseIdentifier:NSStringFromClass([KWMProductSizeCell class])];
    [self.cvVariants registerClass:[UICollectionReusableView class] forSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:@"UICollectionViewHeader"];

    UICollectionViewFlowLayout *layout = [[UICollectionViewFlowLayout alloc]init];
    layout.minimumLineSpacing = 12;
    layout.sectionInset = UIEdgeInsetsMake(0, 35, 0, 35);
    layout.headerReferenceSize = CGSizeMake(UI_SCREEN_WIDTH, 45);
    self.cvVariants.collectionViewLayout = layout;
}

//初始化佈局高度
-(void)initContentHeight{
    CGFloat height = self.cvVariants.collectionViewLayout.collectionViewContentSize.height;
    CGFloat contentHeigt = fminf(UI_SCREEN_HEITHT*0.9,height+173);
    self.vContentHeight.constant = contentHeigt;
    [self.view layoutIfNeeded];
}

-(IBAction)onClickAdd:(id)sender{
    if(self.selectVariant){
        NSInteger maxCount = self.selectAdminVariant?self.selectAdminVariant.inventoryQuantity.integerValue:9999;
        if(self.count + 1 > maxCount){
            self.count = maxCount;
            [self showToast:[NSString stringWithFormat:@"商品剩余库存仅有%ld件",maxCount]];
        }else{
            self.count ++;
        }
        [self initUI];
    }else{
        [self showToast:@"请选择您想要的规格"];
    }
}

-(IBAction)onClickReduce:(id)sender{
    if(self.selectVariant){
        self.count = self.count == 1?:self.count-1;
        [self initUI];
    }else{
        [self showToast:@"请选择您想要的规格"];
    }
}

/**
 *  点击加入购物车
 *
 *  @param sender <#sender description#>
 */
-(IBAction)onClickComplete:(UIButton *)sender{
    if (self.selectVariant == nil) {
        [self showToast:@"请选择您想要的规格"];
        return;
    }
    if (self.count <= 0 && self.wish){
        [self showToast:@"商品数量不能为0"];
    }
    //购物车页面
    if ([self.delegate respondsToSelector:@selector(kwm_addShopWithVariantId:quantity:variant:buyNow:callback:)]){
        __weak id this = self;
        [self showLoading];
        if (self.delegate) {
            [self.delegate kwm_addShopWithVariantId:self.selectVariant.identifier quantity:self.count variant:self.selectVariant buyNow:false callback:^(BOOL success) {
                [self hideLoading];
                if(success) {
                    [this dismissViewControllerAnimated:YES completion:nil];
                }
            }];
        }
    }
    //商品详情页.愿望单页
    //商品详情页现在不是添加到购物车了,而是先显示。所以现在是回调出去。
    if ([self.delegate respondsToSelector:@selector(kwm_setVariant:variant:color:count:)]){
        [self.delegate kwm_setVariant:self variant:self.selectVariant color:self.selectColor count:self.count];
        [self dismissViewControllerAnimated:YES completion:nil];
    }
}

-(IBAction)onClickBg:(id)sender{
    [self dismissViewControllerAnimated:YES completion:nil];
}

#pragma mark -- UICollectionViewDataSource UICollectionViewDelegate
-(NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView{
    if(self.colorArray && self.colorArray.count>0){
        return 2;
    }else{
        return 1;
    }
}

-(NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section{
    if(section == 0){
        return self.variantArray?self.variantArray.count:0;
    }else{
        return self.colorArray?self.colorArray.count:0;
    }
}

//创建头视图
- (UICollectionReusableView *)collectionView:(UICollectionView *)collectionView
           viewForSupplementaryElementOfKind:(NSString *)kind
                                 atIndexPath:(NSIndexPath *)indexPath {
    
    UICollectionReusableView *headView = [collectionView dequeueReusableSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:@"UICollectionViewHeader" forIndexPath:indexPath];
    
    NSString *colorTitle = @"颜色";
    NSString *sizeTitle = @"尺寸";
    if(self.selectAdminVariant && self.selectAdminVariant.inventoryQuantity.integerValue <= 5){
        sizeTitle = [NSString stringWithFormat:@"尺寸 (仅剩%@件)",self.selectAdminVariant.inventoryQuantity.stringValue];
    }
    
    [headView.subviews makeObjectsPerformSelector:@selector(removeFromSuperview)];
    
    UILabel *headerLabel = [[UILabel alloc]initWithFrame:CGRectMake(35, 15, UI_SCREEN_WIDTH-80,30)];
    headerLabel.textColor = [UIColor sam_colorWithHex:@"393939"];
    headerLabel.font = [UIFont systemFontOfSize:12.5];
    headerLabel.text = indexPath.section == 0?sizeTitle:colorTitle;
    [headView addSubview:headerLabel];
    
    return headView;
}


-(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath{
    if(indexPath.section == 0){
        KWMProductSizeCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:NSStringFromClass([KWMProductSizeCell class]) forIndexPath:indexPath];
        
        BUYProductVariant *variant = [self.variantArray objectAtIndex:indexPath.row];
        KWMVariants *adminVariant = nil;
        if(self.adminVariantArray){
            for(KWMVariants *mAdminVariant in self.adminVariantArray){
                if([variant.identifier isEqualToNumber:mAdminVariant.id]){
                    adminVariant = mAdminVariant;
                }
            }
        }
        
        BOOL isSelect = [self isSelect:variant];
        BOOL isSellOut = [self isSellOut:variant adminVariant:adminVariant];
        
        cell.isSelect = isSelect;
        cell.isSellOut = isSellOut;
        cell.productVariant = variant;
        return cell;
    }else{
        KWMColor *color = [self.colorArray objectAtIndex:indexPath.row];
        KWMProductColorCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:NSStringFromClass([KWMProductColorCell class]) forIndexPath:indexPath];
        cell.isSelect = self.selectColor?[self.selectColor.handle isEqualToString:color.handle]:NO;
        cell.data = color;
        return cell;
    }
}

- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath{
    if(indexPath.section == 0){
        NSInteger width = (UI_SCREEN_WIDTH - (30 + 30) - (10*3)) / 3;
        NSInteger height = width * 0.4;
        return (CGSize){width,height};
    }else{
        return (CGSize){50,70};
    }
}

-(void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath{
    if(indexPath.section == 0){
        BUYProductVariant *variant = [self.variantArray objectAtIndex:indexPath.row];
        KWMVariants *adminVariant = nil;
        if(self.adminVariantArray){
            for(KWMVariants *mAdminVariant in self.adminVariantArray){
                if([variant.identifier isEqualToNumber:mAdminVariant.id]){
                    adminVariant = mAdminVariant;
                }
            }
        }
        BOOL isSellOut = [self isSellOut:variant adminVariant:adminVariant];
        if(isSellOut){
            return;
        }
        if(!self.selectVariant || ![self.selectVariant.identifier isEqualToNumber:variant.identifier]){
            self.count = 1;
        }
        self.selectVariant = variant;
        self.selectAdminVariant = adminVariant;
        [self.cvVariants reloadData];
        [self initUI];
    }else if(indexPath.section == 1){
        KWMColor *color = [self.colorArray objectAtIndex:indexPath.row];
        if(!color.product){
            return;
        }
        self.selectColor = color;
        self.selectVariant = nil;
        self.selectAdminVariant = nil;
        self.variantArray = color.product.variantsArray;
        self.adminVariantArray = color.adminProduct?color.adminProduct.variants:nil;
        [self.cvVariants reloadData];
        [self initContentHeight];
        if(!self.adminVariantArray){
            [self requestAdminProduct:self.selectColor.product.identifier];
        }
    }
}

#pragma mark -- API KWMAPIManager getAdminProduct
-(void)requestAdminProduct:(NSNumber *)productId{
    if(productId == nil){
        return;
    }
    __weak KWMVariantsVC *weakSelf = self;
    void(^failure)(NSURLSessionDataTask *,NSError *) = ^(NSURLSessionDataTask *task,NSError *error){
        [weakSelf showError:error];
    };
    void(^success)(NSURLSessionDataTask *,KWMProductResult *) = ^(NSURLSessionDataTask *task,KWMProductResult *result){
        if(result!=nil && result.product!=nil){
            KWMProduct* adminProduct = (KWMProduct *)result.product;
            NSArray<KWMVariants *> *adminVariants = adminProduct.variants;
            weakSelf.adminVariantArray = adminVariants;
            [weakSelf.cvVariants reloadData];
            if(weakSelf.colorArray){
                for(KWMColor *color in weakSelf.colorArray){
                    if(color.product && [color.product.identifier isEqualToNumber:productId]){
                        color.adminProduct = adminProduct;
                    }
                }
            }
        }
    };
    [self.api getAdminProduct:nil productId:productId success:success failure:failure];
}

#pragma mark --ProductVariantUtil
-(BOOL)isSellOut:(BUYProductVariant *)variant adminVariant:(KWMVariants *)adminVariant{
    BOOL isSellOut = NO;

    if(variant){
        isSellOut = !variant.availableValue;
    }
    if(adminVariant && !isSellOut){
        isSellOut = adminVariant.inventoryQuantity.integerValue <= 0;
    }
    return isSellOut;
}

-(BOOL)isSelect:(BUYProductVariant *)variant{
    if(variant && self.selectVariant){
        return [variant.identifier isEqualToNumber:self.selectVariant.identifier];
    };
    if(variant && self.wish && !self.selectVariant){
        if([variant.identifier isEqualToNumber:self.wish.variantId]){
            self.selectVariant = variant;
            return YES;
        }
    }
    return NO;
}

@end