extends Node

@onready var http_client = $"HttpClient"
@onready var websocket_client = $"WebsocketClient"
@onready var http_server = $"HttpServer"
@onready var auth = $"Auth"

const API_URL = "https://api.twitch.tv/helix"
var access_token = null


# -- Built-in Methods


func _ready():
	print("READY")
	http_server.started.connect(_on_server_started)
	http_server.received.connect(_on_server_received)
	websocket_client.opened.connect(_on_websocket_opened)
	http_client.request_completed.connect(_on_request_completed)
	
	http_server.start()


# -- Private Methods


func _on_server_started():
	websocket_client.open()


func _on_websocket_opened():
	http_server.auth(
		{
			"response_type": "code",
			"client_id": auth.CLIENT_ID,
			"redirect_uri": "http://localhost:%d" % [auth.PORT],
			"scope": auth.SCOPE
		}
	)


func _on_server_received(auth2):
	http_client.request(
		HttpClient.API_TYPE.AUTH, 
		{
			"grant_type": "authorization_code",
			"client_id": auth.CLIENT_ID,
			"redirect_uri": "http://localhost:%d" % [auth.PORT],
			"code": auth2,
			"client_secret": auth.CLIENT_SECRET
		}
	)


func _on_request_completed(type: HttpClient.API_TYPE, data: Dictionary):
	match type:
		HttpClient.API_TYPE.AUTH:
			http_client.request(
				HttpClient.API_TYPE.VERIFY, 
				{
					"token": data.access_token
				}
			)
		HttpClient.API_TYPE.VERIFY:
			if not websocket_client.id:
				push_error("Tried to use nonexistent websocket id. Please report to Ategon.")
				return
			
			for sub in auth.SUBS:
				var event = TwitchEvents.get_event_from_type(sub)
				var sub_data = event.generate_sub({
					"broadcaster": auth.BROADCASTER_ID,
					"user": auth.USER_ID,
					"websocket": websocket_client.id
				})
				
				http_client.request(
					HttpClient.API_TYPE.CREATE_EVENTSUB, 
					{}, 
					sub_data
				)