//
//  AddParticipantsListViewController.swift
//  WoWonder
//
//  Created by Mac on 16/11/22.
//  Copyright © 2022 ScriptSun. All rights reserved.
//

import UIKit
import Async
import Toast_Swift

protocol AddParticipantsListViewControllerDelegate {
    func sendSelectedParticipants(selectedParticipants: [UserData])
}

class AddParticipantsListViewController: BaseVC {
    
    // MARK: - IBOutlets

    @IBOutlet weak var headerLabel: UILabel!
    @IBOutlet weak var backButton: UIButton!
    @IBOutlet weak var searchTextField: UITextField!
    @IBOutlet weak var buttonStackView: UIStackView!
    @IBOutlet weak var searchClearButton: UIButton!
    @IBOutlet weak var tableView: UITableView!
    @IBOutlet weak var emptyView: UIView!
    
    // MARK: - Properties
    
    private var followingsArray: [UserData] = []
    var selectedUserArray: [UserData] = []
    var isSearch = false
    var delegate: AddParticipantsListViewControllerDelegate?
    
    // MARK: - View Life Cycles
    
    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.
        
        self.initialConfig()
    }
    
    // MARK: - Selectors
    
    // Back Button Action
    @IBAction func backButtonAction(_ sender: UIButton) {
        if self.isSearch {
            self.isSearch = false
            self.buttonStackView.isHidden = false
            self.headerLabel.isHidden = false
            self.searchTextField.text = ""
            self.searchTextField.resignFirstResponder()
            self.searchTextField.isHidden = true
            self.searchClearButton.isHidden = true
        } else {
            self.navigationController?.popViewController(animated: true)
        }
    }
    
    // Search Button Action
    @IBAction func searchButtonAction(_ sender: UIButton) {
        self.isSearch = true
        self.buttonStackView.isHidden = true
        self.headerLabel.isHidden = true
        self.searchTextField.isHidden = false
        self.searchTextField.becomeFirstResponder()
    }
    
    // Search Clear Button Action
    @IBAction func searchClearButtonAction(_ sender: UIButton) {
        self.searchTextField.text = ""
        self.searchClearButton.isHidden = true
        self.fetchData()
    }
    
    // Send Button Action
    @IBAction func sendButtonAction(_ sender: UIButton) {
        self.view.endEditing(true)
        self.delegate?.sendSelectedParticipants(selectedParticipants: self.selectedUserArray)
        self.navigationController?.popViewController(animated: true)
    }
    
    // MARK: - Helper Functions
    
    // Initial Config
    func initialConfig() {
        self.tableViewSetup()
        self.textFieldSetup()
        self.fetchData()
    }
    
    // TableView Setup
    func tableViewSetup() {
        self.tableView.dataSource = self
        self.tableView.delegate = self
        self.tableView.register( UINib(resource: R.nib.addParticipantsTableCell), forCellReuseIdentifier: R.reuseIdentifier.addParticipantsTableCell.identifier)
        self.tableView.refreshControl = UIRefreshControl()
        self.tableView.refreshControl?.addTarget(self, action: #selector(self.refresh), for: .valueChanged)
    }
    
    func textFieldSetup() {
        self.searchTextField.attributedPlaceholder = NSAttributedString(
            string: "Search...",
            attributes: [NSAttributedString.Key.foregroundColor: UIColor.text_color_in_between as Any]
        )
        self.searchTextField.delegate = self
    }
    
    @objc func refresh() {
        self.fetchData()
    }
    
}

// MARK: - Extensions

// MARK: Api Call
extension AddParticipantsListViewController {
    
    private func fetchData() {
        self.showProgressDialog(text: NSLocalizedString("Loading...", comment: "Loading..."))
        self.followingsArray.removeAll()
        self.tableView.reloadData()
        Async.background {
            FollowingManager.instance.getFollowings(user_id: AppInstance.instance.userId ?? "", session_Token: AppInstance.instance.sessionId ?? "") { (success, sessionError, serverError, error) in
                if success != nil {
                    Async.main({
                        self.dismissProgressDialog {
                            self.followingsArray = success?.following ?? []
                            if self.followingsArray.count == 0 {
                                self.tableView.isHidden = true
                                self.emptyView.isHidden = false
                            } else {
                                self.tableView.isHidden = false
                                self.emptyView.isHidden = true
                            }
                            self.tableView.reloadData()
                            self.tableView.refreshControl?.endRefreshing()
                        }
                    })
                } else if sessionError != nil {
                    Async.main {
                        self.dismissProgressDialog {
                            self.view.makeToast(sessionError?.errors?.error_text ?? "")
                        }
                    }
                } else if serverError != nil {
                    Async.main {
                        self.dismissProgressDialog {
                            self.view.makeToast(serverError?.errors?.error_text)
                        }
                    }
                } else {
                    Async.main {
                        self.dismissProgressDialog {
                            self.view.makeToast(error?.localizedDescription)
                        }
                    }
                }
            }
        }
    }
    
    private func fetchData(textForSearch: String) {
        self.showProgressDialog(text: NSLocalizedString("Loading...", comment: "Loading..."))
        self.followingsArray.removeAll()
        self.tableView.reloadData()
        let sessionToken = AppInstance.instance.sessionId ?? ""
        Async.background {
            SearchManager.instance.searchForwardUser(session_Token: sessionToken, search_Key: textForSearch) { (success, sessionError, serverError, error) in
                if success != nil {
                    Async.main {
                        self.dismissProgressDialog {
                            self.followingsArray = success?.users ?? []
                            if self.followingsArray.count == 0 {
                                self.tableView.isHidden = true
                                self.emptyView.isHidden = false
                            } else {
                                self.tableView.isHidden = false
                                self.emptyView.isHidden = true
                            }
                            self.tableView.reloadData()
                            self.tableView.refreshControl?.endRefreshing()
                        }
                    }
                } else if sessionError != nil {
                    Async.main {
                        self.dismissProgressDialog {
                            self.view.makeToast(sessionError?.errors?.error_text ?? "")
                            print("sessionError = \(sessionError?.errors?.error_text ?? "")")
                        }
                    }
                } else if serverError != nil {
                    Async.main {
                        self.dismissProgressDialog {
                            self.view.makeToast(serverError?.errors?.error_text)
                            print("serverError = \(serverError?.errors?.error_text ?? "")")
                        }
                    }
                } else {
                    Async.main {
                        self.dismissProgressDialog {
                            self.view.makeToast(error?.localizedDescription)
                            print("error = \(error?.localizedDescription ?? "")")
                        }
                    }
                }
            }
        }
    }
    
}

// MARK: TableView Setup
extension AddParticipantsListViewController: UITableViewDelegate, UITableViewDataSource {
    
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return self.followingsArray.count
    }
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = self.tableView.dequeueReusableCell(withIdentifier: R.reuseIdentifier.addParticipantsTableCell.identifier) as! AddParticipantsTableCell
        let object = self.followingsArray[indexPath.row]
        if (self.selectedUserArray.contains { selectedUser in
            selectedUser.user_id == object.user_id
        }) {
            cell.setData(object: object, isSelected: true)
        } else {
            cell.setData(object: object, isSelected: false)
        }
        return cell
    }
    
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        self.tableView.deselectRow(at: indexPath, animated: true)
        let user = self.followingsArray[indexPath.row]
        if (self.selectedUserArray.contains { selectedUser in
            selectedUser.user_id == user.user_id
        }) {
            let selectedUserIndex = self.selectedUserArray.firstIndex { selectedUser in
                selectedUser.user_id == user.user_id
            }
            self.selectedUserArray.remove(at: selectedUserIndex ?? 0)
        } else {
            self.selectedUserArray.append(user)
        }
        self.tableView.reloadRows(at: [indexPath], with: .automatic)
    }
    
}

// MARK: UITextFieldDelegate
extension AddParticipantsListViewController: UITextFieldDelegate {
    
    func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
        let currentText = textField.text ?? ""
        let updatedText = (currentText as NSString).replacingCharacters(in: range, with: string)
        if updatedText.count == 0 {
            self.searchClearButton.isHidden = true
        } else {
            self.searchClearButton.isHidden = false
        }
        return true
    }
    
    func textFieldShouldReturn(_ textField: UITextField) -> Bool {
        let currentText = textField.text ?? ""
        if currentText != "" {
            self.fetchData(textForSearch: currentText)
        } else {
            self.fetchData()
        }
        return true
    }
    
    func textFieldDidEndEditing(_ textField: UITextField) {
        let currentText = textField.text ?? ""
        if currentText != "" {
            self.fetchData(textForSearch: currentText)
        } else {
            self.fetchData()
        }
    }
    
}
