
import Foundation
import FirebaseAuth

class FirebaseOTPManager :NSObject {
    
    static let shared = FirebaseOTPManager()

    var delegate : FirebaseOTPDelegate?

    private typealias firebaseLoginCompletionHandler = ((AuthDataResult?, Error?) -> Void )
    
    typealias otpSentCompletionHandler = ((Bool, Error?) -> Void )

    
    //get otp from firebase
    func getOTP(phoneNumber: String, completionHandler : @escaping otpSentCompletionHandler) {
        Auth.auth().languageCode = "en"
        //let phoneNumber = txtMobileNo.text!
        
        // Request SMS
        PhoneAuthProvider.provider().verifyPhoneNumber(phoneNumber, uiDelegate: nil) { (verificationID, error) in
            if let error = error {
                debugPrint(error.localizedDescription)
                
                completionHandler(false,error)
                
                return
            }
            
            UserDefaults.standard.set(verificationID, forKey: "authVerificationID")
            completionHandler(true,nil)
        }
    }
    
    //verify otp
    func verifyOTP(verificationCode: String, completionHandler : @escaping otpSentCompletionHandler){
        
        let verificationID = UserDefaults.standard.string(forKey: "authVerificationID")
        let credential = PhoneAuthProvider.provider().credential(withVerificationID: verificationID ?? "", verificationCode: verificationCode) //get credential from firebase phone-Auth
        
        self.loginIntoFirebase(cred: credential) { auth, error in
            // User has signed in successfully and currentUser object is valid
            let currentUserInstance = Auth.auth().currentUser
//            let model = SocialModelCustom(authId: currentUserInstance?.uid,
//                                          socialUserId: "",
//                                          emailId: "",
//                                          first_name: "",
//                                          last_name: "",
//                                          image_url: "", phoneNumber: currentUserInstance?.phoneNumber)
//
            if error == nil {
                completionHandler(true,nil)
               // self.delegate?.firebaseLoginSuccess(userInfo: model)
            }
            else {
                completionHandler(false,error)
                //self.delegate?.firebaseLoginFailed(err: error!.localizedDescription)
            }
            
        }
    }
    
    private func loginIntoFirebase(cred : AuthCredential, completionHandler : @escaping firebaseLoginCompletionHandler ) {
        
        // Authenticate with Firebase using the credential object
        Auth.auth().signIn(with: cred) { (authResult, error) in
            
            if let error = error {
                debugPrint(error.localizedDescription)
                completionHandler(nil, error)
            }
            else {
                completionHandler(authResult, nil)
            }
        }
    }
    
}


//MARK: Protocol
protocol FirebaseOTPDelegate {
    
    func firebaseLoginSuccess()
    func firebaseLoginFailed(err : String)
}
