package video

import (
	"context"
	"fmt"
	libvlc "github.com/adrg/libvlc-go/v3"
)

func Play(ctx context.Context, path string, local bool) error {
	// 1. 初始化 VLC
	if err := libvlc.Init("--no-xlib"); err != nil {
		return fmt.Errorf("VLC初始化失败: %w", err)
	}
	defer libvlc.Release()

	// 2. 创建播放器
	player, err := libvlc.NewPlayer()
	if err != nil {
		return fmt.Errorf("播放器创建失败: %w", err)
	}
	defer player.Stop()
	defer player.Release()

	// 3. 注册结束事件
	eventManager, err := player.EventManager()
	if err != nil {
		return fmt.Errorf("事件管理器获取失败: %w", err)
	}

	done := make(chan struct{})
	defer close(done)

	_, err = eventManager.Attach(libvlc.MediaPlayerEndReached, func(libvlc.Event, interface{}) {
		done <- struct{}{}
	}, nil)
	if err != nil {
		return fmt.Errorf("事件绑定失败: %w", err)
	}

	// 4. 加载并播放文件
	if local {
		if _, err := player.LoadMediaFromPath(path); err != nil {
			return fmt.Errorf("文件加载失败: %w", err)
		}
	} else {
		if _, err := player.LoadMediaFromURL(path); err != nil {
			return fmt.Errorf("文件加载失败: %w", err)
		}
	}

	if err := player.Play(); err != nil {
		return fmt.Errorf("播放启动失败: %w", err)
	}

	// 设置全屏模式
	if err := player.SetFullScreen(true); err != nil {
		return fmt.Errorf("设置全屏模式失败: %w", err)
	}

	// 设置音量为最大
	if err := player.SetVolume(100); err != nil {
		return fmt.Errorf("设置音量失败: %w", err)
	}

	// 5. 等待事件
	fmt.Printf("正在播放: %s\n", path)
	select {
	case <-ctx.Done():
		return fmt.Errorf("播放被用户中断")
	case <-done:
		fmt.Println("播放正常结束")
		return nil
	}
}
