//
//  RectManager.m
//  BankCard
//
//  Created by XAYQ-FanXL on 16/7/8.
//  Copyright © 2016年 AN. All rights reserved.
//

#import "RectManager.h"

char numbers[256];
CGRect rects[64]; 

@implementation RectManager

+ (CGRect)getEffectImageRect:(CGSize)size {
    CGSize size2 = [UIScreen mainScreen].bounds.size;
    CGPoint point;
    if(size.width/size.height > size2.width/size2.height) {
        float oldW = size.width;
        size.width = size2.width / size2.height * size.height;
        point.x = (oldW - size.width)/2;
        point.y = 0;
    }
    else {
        float oldH = size.height;
        size.height = size2.height / size2.width * size.width;
        point.x = 0;
        point.y = (oldH - size.height)/2;;
    }
    return CGRectMake(point.x, point.y, size.width, size.height);
}

+ (CGRect)getGuideFrame:(CGRect)rect {
    float previewWidth = rect.size.height;
    float previewHeight = rect.size.width;

    float cardh, cardw;
    float left, top;

    cardw = previewWidth*70/100;
    //if(cardw < 720) cardw = 720;
    if(previewWidth < cardw)
        cardw = previewWidth;

    cardh = (int)(cardw / 0.63084f);

    left = (previewWidth-cardw)/2;
    top = (previewHeight-cardh)/2;

    return CGRectMake(top+rect.origin.x, left+rect.origin.y, cardh, cardw);
}

+(CGRect)getGuideFrame:(CGRect)rect width:(float)width marTop:(float)marTop{
    
    float previewWidth = rect.size.height;
    float previewHeight = rect.size.width;
    
    float cardh, cardw;
    float left, top;
    
    cardw = previewWidth*270 / 375;
    //if(cardw < 720) cardw = 720;
    if(previewWidth < cardw)
        cardw = previewWidth;
    
    cardh = (int)(cardw  * 1.574);
    
    left = (previewWidth-cardw)/2;
    top = (previewHeight-cardh - marTop/width*cardw - 60)/2;
    
    return CGRectMake(top+rect.origin.x, left+rect.origin.y, cardh, cardw);
}

+ (int)docode:(unsigned char *)pbBuf len:(int)tLen {
    int hic, lwc;
    int i, j, code;
    int x, y, w, h;
    int charCount = 0;
    
    int charNum = 0;
    char szBankName[128];
    
    //字符解析，包含空格
    i = 0;
    hic = pbBuf[i++]; lwc = pbBuf[i++]; code = (hic<<8)+lwc;
    hic = pbBuf[i++]; lwc = pbBuf[i++]; code = (hic<<8)+lwc;
    
    //bank name, GBK CharSet;
    for(j = 0; j < 64; ++j) { szBankName[j] = pbBuf[i++]; }
    
    //charNum
    hic = pbBuf[i++]; lwc = pbBuf[i++]; code = (hic<<8)+lwc;
    charNum = code;
    
    //char code and its rect
    while(i < tLen-9){
        //字符的编码unsigned short
        hic = pbBuf[i++]; lwc = pbBuf[i++]; x = (hic<<8)+lwc;
        numbers[charCount] = (char)x;
        //字符的矩形框lft, top, w, h
        hic = pbBuf[i++]; lwc = pbBuf[i++]; x = (hic<<8)+lwc;
        hic = pbBuf[i++]; lwc = pbBuf[i++]; y = (hic<<8)+lwc;
        hic = pbBuf[i++]; lwc = pbBuf[i++]; w = (hic<<8)+lwc;
        hic = pbBuf[i++]; lwc = pbBuf[i++]; h = (hic<<8)+lwc;
        rects[charCount] = CGRectMake(x, y, w, h);
        charCount++;
    }
    numbers[charCount] = 0;
    
    if(charCount < 10 || charCount > 24 || charNum != charCount){
        charCount = 0;
    }
    return charCount;
}

+ (CGRect)getCorpCardRect:(int)width  height:(int)height guideRect:(CGRect)guideRect charCount:(int) charCount {
    CGRect subRect = rects[0];
    
    int i;
    int nAvgW = 0;
    int nAvgH = 0;
    int nCount = 0;

    nAvgW  = rects[0].size.width;
    nAvgH  = rects[0].size.height;
    nCount = 1;
    //所有非空格的字符的矩形框合并
    for(i = 1; i < charCount; ++i){
        
        subRect = combinRect(subRect, rects[i]);
        if(numbers[i] != ' '){
            nAvgW += rects[i].size.width;
            nAvgH += rects[i].size.height;
            nCount ++;
        }
    }
    //统计得到的平均宽度和高度
    nAvgW /= nCount;
    nAvgH /= nCount;
    
    //releative to the big image（相对于大图）
    subRect.origin.x = subRect.origin.x + guideRect.origin.x;
    subRect.origin.y = subRect.origin.y + guideRect.origin.y;
    //    rect.offset(guideRect.left, guideRect.top);
    //做一个扩展
    subRect.origin.y -= nAvgH;  if(subRect.origin.y < 0) subRect.origin.y = 0;
    subRect.size.height += nAvgH * 2; if(subRect.size.height+subRect.origin.y  >= height) subRect.size.height = height-subRect.origin.y-1;
    subRect.origin.x -= nAvgW; if(subRect.origin.x < 0) subRect.origin.x = 0;
    subRect.size.width += nAvgW * 2; if(subRect.size.width+subRect.origin.x >= width) subRect.size.width = width-subRect.origin.x-1;
    return subRect;
}

+ (char *)getNumbers {
    return numbers;
}

CGRect combinRect(CGRect A, CGRect B)
{
    CGFloat t,b,l,r;
    l = fminf(A.origin.x, B.origin.x);
    r = fmaxf(A.size.width+A.origin.x, B.size.width+B.origin.x);
    t = fminf(A.origin.y, B.origin.y);
    b = fmaxf(A.size.height+A.origin.y, B.size.height+B.origin.y);
    
    return CGRectMake(l, t, r-l, b-t);
}


@end
