##TODO:清楚掉這裏和PhantomCamera相關的部分
@tool
@icon("res://addons/reedcamera/icon/camera_anchor_icon.svg")
class_name CameraAnchor extends Node2D

const _CONSTANTS = preload("res://addons/reedcamera/_data/CameraSystemConst.gd")

@export_group("Anchor Config")
##该priority不会直接修改Anchor的priority，只用作初始化
@export var priority: int = 0
##此Anchor是否有效
@export var enabled: bool = true
## =========================
## Blend Config
## =========================
@export_subgroup("Blending")
##是否要存在相機過渡時間
@export var use_blend: bool = true
##過度時間
@export var blend_time: float = 0.3

@export_group("Camera Config")
@export_subgroup("Sizing")
@export var zoom: Vector2 = Vector2.ONE:
	set(value):
		zoom = value
		if Engine.is_editor_hint():
			queue_redraw()
@export_subgroup("Limit")
@export var use_camera_limit: bool = false:
	set(value):
		use_camera_limit = value
		if Engine.is_editor_hint():
			queue_redraw()

@export var limit_top: int = -10000000:
	set(value):
		limit_top = value
		if Engine.is_editor_hint():
			queue_redraw()
@export var limit_bottom: int = 10000000:
	set(value):
		limit_bottom = value
		if Engine.is_editor_hint():
			queue_redraw()
@export var limit_left: int = -10000000:
	set(value):
		limit_left = value
		if Engine.is_editor_hint():
			queue_redraw()
@export var limit_right: int = 10000000:
	set(value):
		limit_right = value
		if Engine.is_editor_hint():
			queue_redraw()

## 编辑器预览面板设置
@export_group("Editor Preview")
@export var show_camera_preview: bool = true
@export var preview_color: Color = Color(0.2, 0.9, 0.4, 0.8)
@export var preview_line_width: float = 2.0
@export var show_limit_preview: bool = true
@export var limit_preview_color: Color = Color(0.9, 0.3, 0.3, 0.8)
@export var limit_preview_line_width: float = 2.0

var _camera_global : Node = null

var _priority: int :
	set(value):
		if _priority != value:
			_priority = value
			on_priority_change.emit(_priority, self)

signal on_priority_change(_priority:int, anchor: CameraAnchor)

func _ready() -> void:
	if not Engine.is_editor_hint():
		_runtime_ready() 

func _runtime_ready() -> void:
	_priority = priority

func _enter_tree() -> void:
	if not Engine.is_editor_hint():
		pass
		#_camera_global.register_anchor(self) #只有在runtime我们才向管理器注册anchor

func _exit_tree() -> void:
	if not Engine.is_editor_hint():
		pass
		#_camera_global.unregister_anchor(self) #只有在runtime我们才向管理器注册anchor

func _draw() -> void:
	if not Engine.is_editor_hint():
		return

	if show_camera_preview:
		draw_rect(
			_camera_frame_rect_draw(),
			preview_color,
			false,
			preview_line_width
		)

	if show_limit_preview and use_camera_limit:
		draw_rect(
			_camera_limit_rect(),
			limit_preview_color,
			false,
			limit_preview_line_width
		)

func _camera_limit_rect() -> Rect2:
	var pos := Vector2(limit_left, limit_top)
	var size := Vector2(
		limit_right - limit_left,
		limit_bottom - limit_top
	)

	return Rect2(pos, size)

func _camera_frame_rect_draw() -> Rect2:
	var cg = _get_camera_global()
	if cg:
		var screen_size: Vector2 = cg.get_screen_size()

		var z := zoom
		z.x = maxf(z.x, 0.001)
		z.y = maxf(z.y, 0.001)

		var size := Vector2(
			screen_size.x / z.x,
			screen_size.y / z.y
		)

		# PhantomCamera：以自身为中心
		return Rect2(-size * 0.5, size)
	
	print("沒有找到全局相機")
	return Rect2(Vector2.ZERO,Vector2.ZERO)


##内部懶加載全局相機管理器
func _get_camera_global() -> Object:
	if _camera_global:
		return _camera_global
	
	if Engine.has_singleton(_CONSTANTS.CAMERA_SYSTEM_NAME):
		_camera_global = Engine.get_singleton(_CONSTANTS.CAMERA_SYSTEM_NAME)
	
	return _camera_global

## 强制清空所有的camera anchor in register 然后把自己注册进去
func push_camera() -> void:
	_get_camera_global().clear_camera_anchors()
	_get_camera_global().register_anchor(self)

func pop_camera() -> void:
	_get_camera_global().unregister_anchor(self)
