using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using UnityEngine.Events;

public class PuzzlePieceManager : MonoBehaviour
{
  public UnityAction<int> OnPuzzleComplete; // 拼图完成时触发的事件



  [SerializeField] private int puzzleFlag = 0;
  [SerializeField] private bool isPuzzleComplete = false;

  [SerializeField] private List<GameObject> goAllPieces = new List<GameObject>();
  private List<PuzzlePieceHandler> pphAllPieces = new List<PuzzlePieceHandler>(); // 所有拼图碎片
  private List<Vector3> positionAllPieces = new List<Vector3>();

  // ==================================================

  private void Start() => Init();

  // ==================================================

  public void Preset()
  {
    foreach (GameObject go in goAllPieces) { go.SetActive(true); }
    CanvasGroupMaster.DoFade(cgTip, true);
    CanvasGroupMaster.DoFade(cgFull, false);

    StartCheckCompletion();
  }

  private void Init()
  {
    goAllPieces = goAllPieces.OrderBy(piece => piece.gameObject.name).ToList(); // 按名字排序，确保顺序一致

    foreach (GameObject go in goAllPieces)
    {
      pphAllPieces.Add(go.GetComponent<PuzzlePieceHandler>());
      positionAllPieces.Add(go.transform.position);
      go.SetActive(false);
    }

    CanvasGroupMaster.DoFade(cgTip, false);
    CanvasGroupMaster.DoFade(cgFull, false);
  }

  public void Reset()
  {
    ResetPuzzle();
  }

  // ==================================================
  #region 循环检查完成度

  private const float CheckInterval = 1f; // 检查间隔时间

  public void StartCheckCompletion() => StartCoroutine(nameof(CheckPuzzleCompletionAction));
  public void StopCheckCompletion() => StopCoroutine(nameof(CheckPuzzleCompletionAction));

  private IEnumerator CheckPuzzleCompletionAction()
  {
    while (!isPuzzleComplete) // 用true也可以
    {
      CheckPuzzleCompletion();
      yield return new WaitForSeconds(CheckInterval);
    }
  }

  #endregion
  // ==================================================

  /// <summary>
  /// 检查拼图是否完成
  /// </summary>
  private void CheckPuzzleCompletion()
  {
    if (isPuzzleComplete) { return; }

    // 检查所有碎片是否都已放置
    bool allPiecesPlaced = true;
    int placedCount = 0;

    foreach (PuzzlePieceHandler piece in pphAllPieces)
    {
      if (piece != null && piece.CheckPlaced())
      {
        placedCount++;
      }
      else
      {
        allPiecesPlaced = false;
      }
    }

    if (allPiecesPlaced) // 如果所有碎片都已放置，触发完成事件
    {
      PuzzleCompleted();
    }

    // if (placedCount > 0) // 可选：显示进度（用于调试或UI显示）
    // {
    //   Debug.Log($"拼图进度: {placedCount}/{allPuzzlePieces.Count}");
    // }
  }

  // ==================================================
  #region 拼图完成时的处理

  [SerializeField] private CanvasGroup cgTip;
  [SerializeField] private CanvasGroup cgFull;

  private void PuzzleCompleted()
  {
    isPuzzleComplete = true;

    StopCheckCompletion();
    Debug.Log("拼图完成！所有碎片都已正确放置！");

    CanvasGroupMaster.DoFade(cgTip, false);
    CanvasGroupMaster.DoFade(cgFull, true);

    OnPuzzleComplete?.Invoke(puzzleFlag); // 触发完成事件
  }

  #endregion
  // ==================================================

  /// <summary>
  /// 获取拼图完成状态
  /// </summary>
  public bool IsPuzzleComplete() => isPuzzleComplete;

  /// <summary>
  /// 获取拼图完成进度（0-1）
  /// </summary>
  public float GetCompletionProgress()
  {
    if (pphAllPieces.Count == 0) { return 0; }
    return (float)pphAllPieces.Count / pphAllPieces.Count;
  }

  /// <summary>
  /// 重置拼图状态（重新开始游戏）
  /// </summary>
  public void ResetPuzzle()
  {
    isPuzzleComplete = false;

    for (int i = 0; i < pphAllPieces.Count; i++)
    {
      pphAllPieces[i].SetPlaced(false);
      pphAllPieces[i].transform.position = positionAllPieces[i];
    }

    CanvasGroupMaster.DoFade(cgTip, true);
    CanvasGroupMaster.DoFade(cgFull, false);

    StartCheckCompletion();
    Debug.Log("拼图已重置");
  }
}