import UIKit

// FIXME: solve linter suppressed issues
//swiftlint: disable force_cast
class ContactsSettingsViewController: UITableViewController {
    let tree: [[SettingsEnum]] = [
        [SettingsEnum.rosterType, SettingsEnum.rosterDisplayHiddenGroup],
        [SettingsEnum.autoSubscribeOnAcceptedSubscriptionRequest, .blockedContacts],
    ]

    override func numberOfSections(in tableView: UITableView) -> Int {
        return tree.count
    }

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return tree[section].count
    }

    override func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
        switch section {
        case 0:
            return NSLocalizedString("Display", comment: "Section heading: settings for how contact list entries should be displayed")

        case 1:
            return NSLocalizedString("General", comment: "Section heading: general settings about contacts")

        default:
            return nil
        }
    }

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let setting = tree[indexPath.section][indexPath.row]
        switch setting {
        case .rosterType:
            let cell = tableView.dequeueReusableCell(withIdentifier: "RosterTypeTableViewCell", for: indexPath) as! SwitchTableViewCell
            cell.switchView.isOn = Settings.rosterType.getString() == RosterType.grouped.rawValue
            cell.valueChangedListener = { (switchView: UISwitch) in
                Settings.rosterType.setValue((switchView.isOn ? RosterType.grouped : RosterType.flat).rawValue)
            }
            return cell

        case .rosterDisplayHiddenGroup:
            let cell = tableView.dequeueReusableCell(withIdentifier: "RosterHiddenGroupTableViewCell", for: indexPath) as! SwitchTableViewCell
            cell.switchView.isOn = Settings.rosterDisplayHiddenGroup.getBool()
            cell.valueChangedListener = { (switchView: UISwitch) in
                Settings.rosterDisplayHiddenGroup.setValue(switchView.isOn)
            }
            return cell

        case .autoSubscribeOnAcceptedSubscriptionRequest:
            let cell = tableView.dequeueReusableCell(withIdentifier: "AutoSubscribeOnAcceptedSubscriptionRequestTableViewCell", for: indexPath) as! SwitchTableViewCell
            cell.switchView.isOn = Settings.autoSubscribeOnAcceptedSubscriptionRequest.getBool()
            cell.valueChangedListener = { (switchView: UISwitch) in
                Settings.autoSubscribeOnAcceptedSubscriptionRequest.setValue(switchView.isOn)
            }
            return cell

        case .blockedContacts:
            return tableView.dequeueReusableCell(withIdentifier: "BlockedContactsTableViewCell", for: indexPath)
        }
    }

    override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        tableView.deselectRow(at: indexPath as IndexPath, animated: true)
    }

    internal enum SettingsEnum: Int {
        case rosterType = 0
        case rosterDisplayHiddenGroup = 1
        case autoSubscribeOnAcceptedSubscriptionRequest = 2
        case blockedContacts = 3
    }
}

