using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using DG.Tweening;

public class PuzzleManager : MonoBehaviour
{
  public static PuzzleManager Instance;

  [SerializeField] private List<GameObject> puzzleItems;
  private List<List<int>> puzzleOrders = new List<List<int>>()
  {
    // new List<int>() { 0, 1, 2, 3, 4, 5, 6, 7, 8 }, // DEBUG
    new List<int>() { 2, 1, 0, 5, 4, 3, 8, 7, 6 }, // 6步
    new List<int>() { 5, 2, 4, 1, 7, 0, 8, 3, 6 }, // 9步
    new List<int>() { 3, 2, 5, 0, 6, 8, 4, 7, 1 }
  };

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

  private void Awake() => Instance = this;
  private void Start() => Init();

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

  private void Init()
  {
    InitItems();
    // Shuffle();
    return;
  }

  // ==================================================
  #region 移动功能

  private bool isMoveLock = false;
  private const float ANIMTIME = .33f;
  public void Move(GameObject mover, GameObject target)
  {
    if (isMoveLock)
    {
      return;
    }

    if (!CanItemMove(mover, target))
    {
      return;
    }

    isMoveLock = true;

    // 自己和空白位置交换
    Vector3 moverPosition = mover.transform.position;
    Vector3 targetPosition = target.transform.position;
    mover.transform.DOMove(targetPosition, ANIMTIME);
    target.transform.DOMove(moverPosition, ANIMTIME).OnComplete(() =>
    {
      // 序号对调
      int moverSiblingIndex = mover.transform.GetSiblingIndex();
      int targetSiblingIndex = target.transform.GetSiblingIndex();
      mover.transform.SetSiblingIndex(targetSiblingIndex);
      target.transform.SetSiblingIndex(moverSiblingIndex);

      UpdateAllPositions();
      DetectWin(); // 检查是否完成

      isMoveLock = false;
    });
    return;
  }

  private bool CanItemMove(GameObject mover, GameObject target)
  {
    ItemHandler moverIH = mover.GetComponent<ItemHandler>();
    ItemHandler targetIH = target.GetComponent<ItemHandler>();

    if (
      (moverIH.Row == targetIH.Row && (moverIH.Column == targetIH.Column - 1 || moverIH.Column == targetIH.Column + 1)) // 同一行的左右互邻
      || // 或
      (moverIH.Column == targetIH.Column && (moverIH.Row == targetIH.Row - 1 || moverIH.Row == targetIH.Row + 1)) // 同一列的上下互邻
    )
    {
      return true;
    }
    else
    {
      return false;
    }
  }

  #endregion
  // ==================================================
  #region 胜利检测

  private void DetectWin()
  {
    if (!CanGameWin()) // 还没赢
    {
      return;
    }
    GameManager.Instance.EndGame();
    return;
  }

  private bool CanGameWin()
  {
    for (int i = 0; i < puzzleItems.Count; i++)
    {
      if (puzzleItems[i].transform.GetSiblingIndex() != i)
      {
        return false;
      }
    }
    return true;
  }

  #endregion
  // ==================================================
  #region Item初始化

  private void InitItems()
  {
    // Init全部ID
    foreach (var item in puzzleItems)
    {
      item.GetComponent<ItemHandler>().ID = item.transform.GetSiblingIndex();
    }

    UpdateAllPositions();
    return;
  }

  /// <summary>
  /// 更新坐标
  /// </summary>
  private void UpdateAllPositions()
  {
    foreach (var item in puzzleItems)
    {
      item.GetComponent<ItemHandler>().Row = item.transform.GetSiblingIndex() / 3;
      item.GetComponent<ItemHandler>().Column = item.transform.GetSiblingIndex() % 3;
    }
    return;
  }

  /// <summary>
  /// 打乱
  /// </summary>
  public void Shuffle()
  {
    // 全随机
    // for (int i = 0; i < puzzleItems.Count; i++)
    // {
    //   int randomIndex = UnityEngine.Random.Range(0, puzzleItems.Count);
    //   puzzleItems[i].gameObject.transform.SetSiblingIndex(randomIndex);
    // }

    List<int> currentOrder = puzzleOrders[UnityEngine.Random.Range(0, puzzleOrders.Count)];
    for (int i = 0; i < currentOrder.Count; i++)
    {
      puzzleItems[currentOrder[i]].transform.SetAsLastSibling(); // 把指定序号安排到最底层
    }

    UpdateAllPositions();
    return;
  }

  #endregion
}