//
//  KMRequestServer.swift
//  PDF Reader Pro
//
//  Created by lizhe on 2023/2/22.
//

import Cocoa
import AFNetworking

@objc public enum KMRequestServerMethodType: Int {
    case post = 0
    case get
    case put
    case delete
}

typealias KMHttpRequestServerComplete = (_ task: URLSessionDataTask?, _ responseObject: AnyObject?, _ error: NSError?) -> Void
@objcMembers class KMRequestServer: NSObject {
    @objc var sessionManager: AFHTTPSessionManager!
    @objc static let requestServer = KMRequestServer()
    @objc var task: URLSessionTask?
    
    override init() {
        super.init()
        
        let configuration: URLSessionConfiguration = URLSessionConfiguration.default
        sessionManager = AFHTTPSessionManager.init(sessionConfiguration: configuration)
        sessionManager.securityPolicy = AFSecurityPolicy.default()
    }
    
    public func request(urlString: String,
                 method: KMRequestServerMethodType,
                 params: Dictionary<String, Any>?,
                 completion: KMHttpRequestServerComplete?) -> Void
    {
        self.request(urlString: urlString,
                     method: method,
                     params: params,
                     requestSerializer: nil,
                     completion: completion)
    }
    
    func request(urlString: String,
                 method: KMRequestServerMethodType,
                 params: Dictionary<String, Any>?,
                 requestSerializer: ((_ requestSerializer:AFHTTPRequestSerializer) -> Void)?,
                 completion: KMHttpRequestServerComplete?) -> Void {
        self.request(urlString: urlString,
                     method: method,
                     params: params,
                     requestSerializer: requestSerializer,
                     body: nil,
                     completion: completion)
    }
    
    func request(urlString: String,
                 method: KMRequestServerMethodType,
                 params: Dictionary<String, Any>?,
                 requestSerializer: ((_ requestSerializer:AFHTTPRequestSerializer) -> Void)?,
                 body: ((_ formData:AFMultipartFormData) -> Void)?,
                 completion: KMHttpRequestServerComplete?) -> Void {
        //每次请求需要重新创建
        sessionManager.requestSerializer = AFJSONRequestSerializer()
        sessionManager.responseSerializer = AFJSONResponseSerializer()
        sessionManager.responseSerializer.acceptableContentTypes = ["application/json","text/html","text/json","text/javascript","text/plain","image/gif"]
        sessionManager.requestSerializer.timeoutInterval = 60
//        [requestSerializer setValue:@"application/vnd.api+json;version=1" forHTTPHeaderField:@"Accept"];
        if (requestSerializer != nil) {
            requestSerializer!(sessionManager.requestSerializer);
        }
        
        if (method == .post) {
            if (body != nil) {
                self.task = sessionManager.post(urlString, parameters: params, headers: nil) { formData in
                    body!(formData)
                } progress: { progress in
                    
                } success: { task, responseObject in
                    let responseObject = responseObject as AnyObject
                    if (completion != nil) {
                        completion!(task,responseObject,nil);
                    }
                } failure: { task, error in
                    if (completion != nil) {
                        completion!(task, nil, error as NSError);
                    }
                }
            } else {
                self.task = sessionManager.post(urlString, parameters: params, headers: nil) { progress in
                
                } success: { task, responseObject in
                    if (completion != nil) {
                        let responseObject = responseObject as AnyObject
                        completion!(task,responseObject,nil);
                    }
                } failure: { task, error in
                    if (completion != nil) {
                        completion!(task, nil, error as NSError);
                    }
                }

            }
        } else if (method == .get) {
            self.task = sessionManager.get(urlString, parameters: params, headers: nil) { progress in
                
            } success: { task, responseObject in
                if (completion != nil) {
                    let responseObject = responseObject as AnyObject
                    completion!(task,responseObject,nil);
                }
            } failure: { task, error in
                if (completion != nil) {
                    completion!(task, nil, error as NSError);
                }
            }
        }
    }
    
    /**
     下载
     */
    func downLoad(urlString: String,
                  filePath: String,
                  progress: @escaping(_ progress: Progress) -> Void,
                  completion: KMRequestServerComplete) {
//        /* 下载地址 */
//        NSURL *url = [NSURL URLWithString:urlString];
//        NSURLRequest *request = [NSURLRequest requestWithURL:url];
//        /* 开始请求下载 */
//        NSProgress *tProgress;
//        NSURLSessionDownloadTask *downloadTask = [_sessionManager downloadTaskWithRequest:request progress:&tProgress destination:^NSURL * _Nonnull(NSURL * _Nonnull targetPath, NSURLResponse * _Nonnull response) {
//            dispatch_async(dispatch_get_main_queue(), ^{
//                //如果需要进行UI操作,需要获取主线程进行操作
//            });
//            /* 设定下载到的位置 */
//            return [NSURL fileURLWithPath:filePath];
//
//        } completionHandler:^(NSURLResponse *response, NSURL *filePath, NSError *error) {
//            if (completion) {
//                completion(response,filePath,error);
//            }
//        }];
//
//        if (progress) {
//            progress(tProgress);
//        }
//
//        [downloadTask resume];
    }
    
    /**
     翻译上传文件
     */
    func aiTranslation(urlString: String,
                        params: Dictionary<String, Any>?,
                       body: ((_ formData:AFMultipartFormData) -> Void)?,
          requestSerializer: ((_ requestSerializer:AFHTTPRequestSerializer) -> Void)?,
                     completion: KMHttpRequestServerComplete?) -> Void {
        sessionManager.requestSerializer.setValue("multipart/form-data", forHTTPHeaderField: "Content-Type")
        sessionManager.requestSerializer.timeoutInterval = 60
        sessionManager.responseSerializer = AFJSONResponseSerializer()
        sessionManager.responseSerializer.acceptableContentTypes = ["application/json","text/html","text/json","text/javascript","text/plain","image/gif"]
        if (requestSerializer != nil) {
            requestSerializer!(sessionManager.requestSerializer);
        }
        if (body != nil) {
            self.task = sessionManager.post(urlString, parameters: params, headers: nil) { formData in
                body!(formData)
            } progress: { progress in
                
            } success: { task, responseObject in
                let responseObject = responseObject as AnyObject
                if (completion != nil) {
                    completion!(task,responseObject,nil);
                }
            } failure: { task, error in
                if (completion != nil) {
                    completion!(task, nil, error as NSError);
                }
            }
        } else {
            self.task = sessionManager.post(urlString, parameters: params, headers: nil) { progress in
            
            } success: { task, responseObject in
                if (completion != nil) {
                    let responseObject = responseObject as AnyObject
                    completion!(task,responseObject,nil);
                }
            } failure: { task, error in
                if (completion != nil) {
                    completion!(task, nil, error as NSError);
                }
            }

        }
    }
    
    /**
     文件翻译
     */
    func aiFileTranslateHandle(urlString: String,
                                  params: Dictionary<String, Any>?,
                                    body: ((_ formData:AFMultipartFormData) -> Void)?,
                       requestSerializer: ((_ requestSerializer:AFHTTPRequestSerializer) -> Void)?,
                              completion: KMHttpRequestServerComplete?) -> Void {
        sessionManager.requestSerializer = AFJSONRequestSerializer()
        sessionManager.responseSerializer = AFJSONResponseSerializer()
        sessionManager.responseSerializer.acceptableContentTypes = ["application/json","text/html","text/json","text/javascript","text/plain","image/gif"]
        if (requestSerializer != nil) {
            requestSerializer!(sessionManager.requestSerializer);
        }
        if (body != nil) {
            self.task = sessionManager.post(urlString, parameters: params, headers: nil) { formData in
                body!(formData)
            } progress: { progress in
                
            } success: { task, responseObject in
                let responseObject = responseObject as AnyObject
                if (completion != nil) {
                    completion!(task,responseObject,nil);
                }
            } failure: { task, error in
                if (completion != nil) {
                    completion!(task, nil, error as NSError);
                }
            }
        } else {
            self.task = sessionManager.post(urlString, parameters: params, headers: nil) { progress in
            
            } success: { task, responseObject in
                if (completion != nil) {
                    let responseObject = responseObject as AnyObject
                    completion!(task,responseObject,nil);
                }
            } failure: { task, error in
                if (completion != nil) {
                    completion!(task, nil, error as NSError);
                }
            }

        }
    }
    
    /**
     重写
     */
    func aiRewriting(urlString: String,
                        params: Dictionary<String, Any>?,
                          body: ((_ formData:AFMultipartFormData) -> Void)?,
             requestSerializer: ((_ requestSerializer:AFHTTPRequestSerializer) -> Void)?,
                    completion: KMHttpRequestServerComplete?) -> Void {
        sessionManager.requestSerializer.setValue("multipart/form-data", forHTTPHeaderField: "Content-Type")
        sessionManager.requestSerializer.timeoutInterval = 60
        sessionManager.responseSerializer = AFJSONResponseSerializer()
        sessionManager.responseSerializer.acceptableContentTypes = ["application/json","text/html","text/json","text/javascript","text/plain","image/gif"]
        if (requestSerializer != nil) {
            requestSerializer!(sessionManager.requestSerializer);
        }
        if (body != nil) {
            self.task = sessionManager.post(urlString, parameters: params, headers: nil) { formData in
                body!(formData)
            } progress: { progress in
                
            } success: { task, responseObject in
                let responseObject = responseObject as AnyObject
                if (completion != nil) {
                    completion!(task,responseObject,nil);
                }
            } failure: { task, error in
                if (completion != nil) {
                    completion!(task, nil, error as NSError);
                }
            }
        } else {
            self.task = sessionManager.post(urlString, parameters: params, headers: nil) { progress in
            
            } success: { task, responseObject in
                if (completion != nil) {
                    let responseObject = responseObject as AnyObject
                    completion!(task,responseObject,nil);
                }
            } failure: { task, error in
                if (completion != nil) {
                    completion!(task, nil, error as NSError);
                }
            }

        }
    }
    
    /*
     status
     AFNetworkReachabilityStatusUnknown          = -1, 不知道监测的是什么
     AFNetworkReachabilityStatusNotReachable     = 0,  没有检测到网络
     AFNetworkReachabilityStatusReachableViaWWAN = 1,  蜂窝网
     AFNetworkReachabilityStatusReachableViaWiFi = 2,  WIFI
     */
    func reachabilityStatusChange(block: @escaping(AFNetworkReachabilityStatus) ->Void) {
        // 1.创建网络监测单例
        let manager = AFNetworkReachabilityManager.shared()
        manager.setReachabilityStatusChange({ status in
            // 2.实现网络监测的回调
            block(status)
        })
        // 3.开始监测
        manager.startMonitoring()
    }
}