//
//  FollowingModel.swift
//  damus
//
//  Created by William Casarin on 2022-05-24.
//

import Foundation

class FollowingModel {
    let damus_state: DamusState
    var needs_sub: Bool = true
    
    let contacts: [Pubkey]

    let sub_id: String = UUID().description
    
    init(damus_state: DamusState, contacts: [Pubkey]) {
        self.damus_state = damus_state
        self.contacts = contacts
    }
    
    func get_filter() -> NostrFilter {
        var f = NostrFilter(kinds: [.metadata])
        f.authors = self.contacts.reduce(into: Array<Pubkey>()) { acc, pk in
            // don't fetch profiles we already have
            if damus_state.profiles.has_fresh_profile(id: pk) {
                return
            }
            acc.append(pk)
        }
        return f
    }
    
    func subscribe() {
        let filter = get_filter()
        if (filter.authors?.count ?? 0) == 0 {
            needs_sub = false
            return
        }
        let filters = [filter]
        //print_filters(relay_id: "following", filters: [filters])
        self.damus_state.pool.subscribe(sub_id: sub_id, filters: filters, handler: handle_event)
    }
    
    func unsubscribe() {
        if !needs_sub {
            return
        }
        print("unsubscribing from following \(sub_id)")
        self.damus_state.pool.unsubscribe(sub_id: sub_id)
    }
    
    func handle_event(relay_id: String, ev: NostrConnectionEvent) {
        switch ev {
        case .ws_event:
            break
        case .nostr_event(let nev):
            switch nev {
            case .ok:
                break
            case .event(_, let ev):
                if ev.kind == 0 {
                    process_metadata_event(events: damus_state.events, our_pubkey: damus_state.pubkey, profiles: damus_state.profiles, ev: ev)
                }
            case .notice(let msg):
                print("followingmodel notice: \(msg)")
            case .eose:
                break
            }
        }
    }
}
