//
//  ContactListViewController.swift


import UIKit
import MessageUI
import ContactsUI
import SSSpinnerButton

class ContactListViewController: BaseViewController {
    
    @IBOutlet var tblViewContact: UITableView!
    @IBOutlet var viewContactPermission: UIView!
    @IBOutlet var searchbar: UISearchBar!
    @IBOutlet var btnClose: UIButton!
    @IBOutlet var viewClose: UIView!
    @IBOutlet var btnNext: UIButton!
    @IBOutlet weak var btnCloseIniPad: UIButton!
    
    @IBOutlet weak var btnEnableContacts: UIButton!
    @IBOutlet weak var btnEnableHeight: NSLayoutConstraint!
    private var contactViewModel = ContactListViewModel()
    var arrFriendList : [FriendListModel]?
    var arrPendingList : [PendingFriendReqListModel]?
    var arrFriendReqList : [ReceivedReqListModel]?
    var isFromLoginScreen : Bool?
    fileprivate var isSearchActive = false
    let contactStore = CNContactStore()
   

    override func viewDidLoad() {
        super.viewDidLoad()
        self.callToViewModelForUIUpdate()
        self.checkContactPermission()
        self.setLayout()
        tblViewContact.keyboardDismissMode = .onDrag
        NotificationCenter.default.addObserver(
              self,
              selector: #selector(applicationWillEnterForeground(_:)),
              name: UIApplication.willEnterForegroundNotification,
              object: nil)
        NotificationCenter.default.addObserver(
              self,
              selector: #selector(applicationWillEnterBackground(_:)),
              name: UIApplication.didEnterBackgroundNotification,
              object: nil)
        // Do any additional setup after loading the view.
    }
     
    @objc func applicationWillEnterForeground(_ notification: NSNotification) {
//        if let contactData = UIApplication.getTopViewController() as? ContactListViewController{
//            contactViewModel.getContactList(isSearchActive: !(contactData.searchbar.text?.isEmpty ?? false)
//            ) { success in
//
//            }
//        }
        self.checkContactPermission()
    }
    @objc func applicationWillEnterBackground(_ notification: NSNotification) {
        debugPrint("contactData:\(self.contactViewModel.contactData.value.count)")
    }
    
    func setLayout(){
        searchbar.searchTextField.textColor = .white
//        lblHeader.font = Font.SFProDisplay_Semibold(fontSize: 21)
        searchbar.searchTextField.font = Font.SFProDisplay_Regular(fontSize: 15)
        searchbar.searchTextField.leftView?.tintColor = UIColor.hexStringToUIColor(hex: "#8B8B8B")
//        searchbar.searchTextField.backgroundColor = UIColor.hexStringToUIColor(hex: "000000")
        tblViewContact.tableFooterView = UIView(frame: .zero)
        
        if self.isFromLoginScreen ?? false{
            self.btnClose.isHidden = true
            self.viewClose.isHidden = true
            self.btnCloseIniPad.isHidden = true
        }
        else{
            self.btnNext.isHidden = true
            self.btnCloseIniPad.isHidden = DeviceType.ISPAD ? false : true
            
        }
        if DeviceType.ISPAD {
            btnEnableContacts.layer.cornerRadius = btnEnableContacts.frame.height / 2
        }
    }
    
   
    func getFillterDataFromContactList(){
        
        let filterData = self.contactViewModel.contactData.value.filter { dataContact in
            
            if !dataContact.phoneNumbers.isEmpty{
             
                var isContainsFriend = true
                var isContainsPending = true
                var isContainsReqList = true
                
                //Remove friend list data from contact list
                if let friendList = self.arrFriendList{
                    isContainsFriend = !friendList.contains { friendData in
                        
                        let concatenatedStr = (friendData.country_code ?? "") + (friendData.phone ?? "")
                        let contactNo = (dataContact.phoneNumbers[0].value).value(forKey: "digits") as? String ?? ""
                        
                        if contactNo.hasPrefix("+"){
                            let contactNumber = self.contactViewModel.parsePhoneNumber(phoneNo: (dataContact.phoneNumbers[0].value).value(forKey: "digits") as? String ?? "", country: (dataContact.phoneNumbers[0].value).value(forKey: "countryCode") as? String ?? "")
                            return concatenatedStr == contactNumber?.numberString
                        }
                        else{
                            return friendData.phone == contactNo
                        }
                    }
                }
                
                //Remove pending req data from contact list
                if let pendingList = self.arrPendingList{
                    isContainsPending = !pendingList.contains(where: { pendingData in
                        
                        let concatenatedStr = (pendingData.country_code ?? "") + (pendingData.phone ?? "")
                        let contactNo = (dataContact.phoneNumbers[0].value).value(forKey: "digits") as? String ?? ""
                        
                        if contactNo.hasPrefix("+"){
                            let contactNumber = self.contactViewModel.parsePhoneNumber(phoneNo: (dataContact.phoneNumbers[0].value).value(forKey: "digits") as? String ?? "", country: (dataContact.phoneNumbers[0].value).value(forKey: "countryCode") as? String ?? "")
                            return concatenatedStr == contactNumber?.numberString
                        }
                        else{
                            return pendingData.phone == contactNo
                        }
                    })
                }
                
                //Remove pending req data from contact list
                if let friendReqList = self.arrFriendReqList{
                    isContainsReqList = !friendReqList.contains(where: { requestData in
                        
                        let concatenatedStr = (requestData.country_code ?? "") + (requestData.phone ?? "")
                        let contactNo = (dataContact.phoneNumbers[0].value).value(forKey: "digits") as? String ?? ""
                        
                        if contactNo.hasPrefix("+"){
                            let contactNumber = self.contactViewModel.parsePhoneNumber(phoneNo: (dataContact.phoneNumbers[0].value).value(forKey: "digits") as? String ?? "", country: (dataContact.phoneNumbers[0].value).value(forKey: "countryCode") as? String ?? "")
                            return concatenatedStr == contactNumber?.numberString
                        }
                        else{
                            return requestData.phone == contactNo
                        }
                    })
                }
                
                //Remove Logged in User from contact list
                let isUserContains = !self.contactViewModel.userInfoData.value.contains { user in
                    
                    let concatenatedStr = (user.country_code ?? "") + (user.phone ?? "")
                    let contactNo = (dataContact.phoneNumbers[0].value).value(forKey: "digits") as? String ?? ""
                    
                    if contactNo.hasPrefix("+"){
                        let contactNumber = self.contactViewModel.parsePhoneNumber(phoneNo: (dataContact.phoneNumbers[0].value).value(forKey: "digits") as? String ?? "", country: (dataContact.phoneNumbers[0].value).value(forKey: "countryCode") as? String ?? "")
                        return concatenatedStr == contactNumber?.numberString
                    }
                    else{
                        return user.phone == contactNo
                    }
                }
                return isContainsFriend && isContainsPending && isUserContains && isContainsReqList
            }
            else{
                return false
            }
        }
        
        self.contactViewModel.contactData.value = filterData
        self.contactViewModel.arrSearchContactData.value = filterData
//        self.callToViewModelForUIUpdate()
    }
    
    func callToViewModelForUIUpdate(){
        self.contactViewModel.contactData.bind { _ in
            DispatchQueue.main.async {
                if self.contactViewModel.contactData.value.count == 0{
                    
                }
                else{
                    
                    self.tblViewContact.reloadData()
                }
            }
        }
    }
    
    func checkContactPermission() {
        
        let authorizationStatus = CNContactStore.authorizationStatus(for: CNEntityType.contacts)

        switch authorizationStatus {
        case .authorized:
            if let contactData = UIApplication.getTopViewController() as? ContactListViewController{
                self.contactViewModel.getContactList(isSearchActive: !(contactData.searchbar.text?.isEmpty ?? false),arrFriendList: self.arrFriendList, arrPendingList: self.arrPendingList, arrFriendReqList: self.arrFriendReqList, success: { success in
                    
                })
            }
           
            DispatchQueue.main.async {
                self.hideShowView(isShow: true)
            }
            
        case .notDetermined:
            debugPrint("Contact permission is not granted")
            self.searchbar.isUserInteractionEnabled = false
        default:
            break
        }
    }
    
    func requestForContactAccess(){

        contactStore.requestAccess(for: CNEntityType.contacts, completionHandler: { (access, accessError) -> Void in
            if access {
                self.contactViewModel.getContactList { success in
                  
                }
//                self.contactViewModel.getContactList()
              //  self.getFillterDataFromContactList()
                self.hideShowView(isShow: true)
            }
            else {
                self.searchbar.isUserInteractionEnabled = false
                DispatchQueue.main.async {
                    self.showContactPermissionAlert()
                }
                debugPrint("Contact permission is not granted")
            }
        })
    }
    
    func hideShowView(isShow: Bool){
        DispatchQueue.main.async {
            self.viewContactPermission.isHidden = isShow
            self.searchbar.isUserInteractionEnabled = true
        }
    }
    
    func showContactPermissionAlert(){
        let alertView = UIAlertController(title: Alert_Message.contactPermissionTitle, message: Alert_Message.contactPermissionDesc, preferredStyle: .alert)

        let gotoSetting = UIAlertAction(title: Alert_Message.OpenSettings, style: .default, handler: { (action) -> Void in
            UIApplication.shared.open(URL(string: UIApplication.openSettingsURLString)!)
        })

        let cancel = UIAlertAction(title: Alert_Message.Cancel, style: .cancel) { (action) -> Void in
            
        }

        alertView.addAction(gotoSetting)
        alertView.addAction(cancel)

        self.present(alertView, animated: true, completion: nil)
    }
    
    @IBAction func btnCloseTapped(_ sender: Any) {
        self.dismiss(animated: true, completion: nil)
    }
    
    @IBAction func btnDismissforiPad(_ sender: Any) {
        self.dismiss(animated: true, completion: nil)
    }
    
    
    @IBAction func contactPermissionBtnTapped(_ sender: Any) {
        self.requestForContactAccess()
    }
    
    @IBAction func btnNextTapped(_ sender: Any) {
        ScreenManager.shared.moveToHelpScreen()
    }
}

extension ContactListViewController: UITableViewDelegate,UITableViewDataSource{
    
    //Datasource
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return self.contactViewModel.getCellCountForDisplay(isFromSearch: self.isSearchActive)
    }
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        
        return self.contactViewModel.perpareCellForDisplay(tableView: tableView, indexPath: indexPath, contactData:  isSearchActive ? self.contactViewModel.arrSearchContactData.value : self.contactViewModel.contactData.value)
    }
    
    //Delegate
    func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
        return DeviceType.ISPAD ? 120 :70
    }
}

extension ContactListViewController : MFMessageComposeViewControllerDelegate{
    func messageComposeViewController(_ controller: MFMessageComposeViewController, didFinishWith result: MessageComposeResult) {
        self.dismiss(animated: true, completion: nil)
    }
}


//MARK: - UISearchBarDelegate -

extension ContactListViewController: UISearchBarDelegate {

    func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
        searchBar.isSearchResultsButtonSelected = false
        if contactViewModel.contactData.value.count == 0{
            contactViewModel.getContactList { success in
            }
        }
        if let searchText = searchBar.text, !searchText.isEmpty {
            isSearchActive = true
            
            self.contactViewModel.arrSearchContactData.value = self.contactViewModel.contactData.value.filter({ (countryData) -> Bool in
                if countryData.givenName == ""{
                   return countryData.phoneNumbers[0].value.stringValue.lowercased().contains(searchText.lowercased())
                }else{
                    return countryData.givenName.lowercased().contains(searchText.lowercased()) || countryData.familyName.lowercased().contains(searchText.lowercased())
                }
            })
            self.tblViewContact.reloadData()
        } else {
            isSearchActive = false
            self.contactViewModel.arrSearchContactData.value = self.contactViewModel.contactData.value
            self.tblViewContact.reloadData()
        }
    }
    
//    func searchBarTextDidBeginEditing(_ searchBar: UISearchBar) {
//        isSearchActive = true
////        self.tblViewContact.reloadData()
//    }
    
    func searchBarTextDidEndEditing(_ searchBar: UISearchBar) {
//        if !searchBar.isSearchResultsButtonSelected {
//            isSearchActive = false
////            self.tblViewContact.reloadData()
//        }
    }
    
    func searchBarSearchButtonClicked(_ searchBar: UISearchBar) {
        if !searchBar.text!.isBlank {
            searchBar.isSearchResultsButtonSelected = true
        } else {
            searchBar.text = ""
        }
        dismissKeyboard()
    }
}
