//
//  VKError.h
//
//  Copyright (c) 2014 VK.com
//
//  Permission is hereby granted, free of charge, to any person obtaining a copy of
//  this software and associated documentation files (the "Software"), to deal in
//  the Software without restriction, including without limitation the rights to
//  use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
//  the Software, and to permit persons to whom the Software is furnished to do so,
//  subject to the following conditions:
//
//  The above copyright notice and this permission notice shall be included in all
//  copies or substantial portions of the Software.
//
//  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
//  FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
//  COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
//  IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
//  CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

#import <Foundation/Foundation.h>
#import "VKObject.h"
#import "VKApiConst.h"
static int const VK_API_ERROR = -101;
static int const VK_API_CANCELED = -102;
static int const VK_API_REQUEST_NOT_PREPARED = -103;

@class VKRequest;
/**
 Class for presenting VK SDK and VK API errors
 */
@interface VKError : VKObject
/// Contains system HTTP error
@property (nonatomic, strong) NSError *httpError;
/// Describes API error
@property (nonatomic, strong) VKError *apiError;
/// Request which caused error
@property (nonatomic, strong) VKRequest *request;

/// May contains such errors:\n <b>HTTP status code</b> if HTTP error occured;\n <b>VK_API_ERROR</b> if API error occured;\n <b>VK_API_CANCELED</b> if request was canceled;\n <b>VK_API_REQUEST_NOT_PREPARED</b> if error occured while preparing request;
@property (nonatomic, assign) NSInteger errorCode;
/// API error message
@property (nonatomic, strong) NSString *errorMessage;
/// Reason for authorization fail
@property (nonatomic, strong) NSString *errorReason;
/// API parameters passed to request
@property (nonatomic, strong) NSDictionary *requestParams;
/// Captcha identifier for captcha-check
@property (nonatomic, strong) NSString *captchaSid;
/// Image for captcha-check
@property (nonatomic, strong) NSString *captchaImg;
/// Redirection address if validation check required
@property (nonatomic, strong) NSString *redirectUri;



/**
 Generate new error with code
 @param errorCode positive if it's an HTTP error. Negative if it's API or SDK error
 */
+ (instancetype)errorWithCode:(NSInteger)errorCode;
/**
 Generate API error from JSON
 @param JSON Json description of VK API error
 */
+ (instancetype)errorWithJson:(id)JSON;
/**
 Generate API error from HTTP-query
 @param queryParams key-value parameters
 */
+ (instancetype)errorWithQuery:(NSDictionary *)queryParams;

/**
 Repeats failed captcha request with user entered answer to captcha
 @param userEnteredCode answer for captcha
 */
- (void)answerCaptcha:(NSString *)userEnteredCode;
@end
