import Foundation

final class AccountsViewModel: ObservableObject {
    typealias AreInIncreasingOrder = (Account, Account) -> Bool

    var accounts: [Account] { AccountsModel.shared.all }

    var sortedAccounts: [Account] {
        accounts.sorted { lhs, rhs in
            let predicates: [AreInIncreasingOrder] = [
                { ($0.app ?? .local).rawValue < ($1.app ?? .local).rawValue },
                { $0.urlHost < $1.urlHost },
                { $0.description < $1.description }
            ]

            for predicate in predicates {
                if !predicate(lhs, rhs), !predicate(rhs, lhs) {
                    continue
                }

                return predicate(lhs, rhs)
            }

            return false
        }
    }

    var publicAccount: Account? { AccountsModel.shared.publicAccount }
    var currentAccount: Account? { AccountsModel.shared.current }

    var instances: [Instance] { InstancesModel.shared.all }

    func accountsOfInstance(_ instance: Instance) -> [Account] {
        accounts.filter { $0.instance.apiURL == instance.apiURL }.sorted { $0.name < $1.name }
    }
}