/// 
import { ROOM_CONTAINER } from "../index.ts";
import { log } from "../logger.ts"
import { Room } from "../room.ts"
import { TrackHandle } from "../track_handle.ts";
export abstract class User {
    protected el: HTMLElement
    public local = false
    public tracks: Set = new Set()
    private name_el = document.createElement("span")
    private _name?: string
    get name() { return this._name }
    set name(n: string | undefined) { this._name = n; this.name_el.textContent = this.display_name }
    get display_name() { return this.name ?? `unknown (${this.id})` }
    constructor(public room: Room, public id: number) {
        room.users.set(this.id, this)
        this.el = document.createElement("div")
        this.el.classList.add("user")
        ROOM_CONTAINER.append(this.el)
        this.setup_view()
    }
    leave() {
        this.room.users.delete(this.id)
    }
    add_track(t: TrackHandle) {
        this.tracks.add(t)
        this.create_track_element(t)
        t.addEventListener("ended", () => {
            log("media", "track ended", t)
            this.tracks.delete(t)
        })
        t.addEventListener("mute", () => {
            log("media", "track muted", t)
        })
        t.addEventListener("unmute", () => {
            log("media", "track unmuted", t)
        })
    }
    setup_view() {
        const info_el = document.createElement("div")
        info_el.classList.add("info")
        this.name_el.textContent = this.display_name
        this.name_el.classList.add("name")
        info_el.append(this.name_el)
        this.el.append(info_el)
    }
    create_track_element(t: TrackHandle) {
        const is_video = t.kind == "video"
        const media_el = is_video ? document.createElement("video") : document.createElement("audio")
        const stream = new MediaStream([t.track])
        media_el.srcObject = stream
        media_el.classList.add("media")
        media_el.autoplay = true
        media_el.controls = true
        if (this.local) media_el.muted = true
        const el = document.createElement("div")
        if (t.local) {
            const end_button = document.createElement("button")
            end_button.textContent = "End"
            end_button.addEventListener("click", () => {
                t.end()
            })
            el.append(end_button)
        }
        el.append(media_el)
        this.el.append(el)
        t.addEventListener("ended", () => {
            media_el.srcObject = null
            el.remove()
        })
    }
}