using UnityEditor;
using UnityEditor.SceneManagement;
using UnityEngine;
using UnityEngine.SceneManagement;

namespace ServiceSim.EditorTools
{
    /// <summary>
    /// 座っている客の形（見た目だけ）を用意して、PeopleSpawner に入れる。
    ///
    /// 10/21 に頼まれた「客が座っていることが画面で分かるように」が入っていなかったのは、
    /// 出す・消す仕掛けはあったのに、その形の prefab
    /// （People/SeatedGuestBody.prefab）が一度も作られていなかったため。
    /// 参照が空のとき SeatedGuest.ShowSeated が黙って戻るので、だれも気づけなかった。
    ///
    /// 同じことが起きないように、
    ///   ・Build Store は毎回ここを通って用意し直す
    ///   ・この1つだけを押せるメニューも置く（押した結果を Console に必ず出す）
    ///   ・用意できなかったときは、SeatedGuest 側も警告を出す
    ///
    /// 形は当たり判定（Collider）・PersonBody・NavMeshAgent を持たない。
    /// NavMesh（コライダーの形で焼く）・ロボットの前のセンサー（コライダーを見る）・
    /// 人がよける処理（PersonBody を見る）のどれにも入らない。
    /// </summary>
    public static class ServiceSimSeatedBody
    {
        [MenuItem("ServiceSim/座っている客の形を用意する", false, 22)]
        public static void EnsureFromMenu()
        {
            PeopleSpec spec = AssetDatabase.LoadAssetAtPath<PeopleSpec>(ServiceSimSetup.PeopleSpecPath);
            if (spec == null)
            {
                Debug.LogError("[ServiceSim] PeopleSpec が見つかりません: " + ServiceSimSetup.PeopleSpecPath);
                return;
            }

            PeopleSpawner spawner = UnityEngine.Object.FindObjectOfType<PeopleSpawner>();
            if (spawner == null)
            {
                Debug.LogError("[ServiceSim] シーンに PeopleSpawner がありません。" +
                               "ServiceSim_Family シーンを開いてください");
                return;
            }

            if (!Ensure(spawner, spec)) return;

            Debug.Log("[ServiceSim] 座っている客の形を用意しました" +
                      "\n  prefab: " + ServiceSimSetup.SeatedBodyPrefabPath +
                      "\n  高さ " + spec.seatedBodyHeight.ToString("0.##") + " m（ベンチの箱 1.1 m・" +
                      "仕切り 1.2 m より高く、立っている客 1.7 m より低い）" +
                      "\n  色: 立っている客と同じ黄色（Mat_Guest）" +
                      "\n  当たり判定・PersonBody・NavMeshAgent は持たない（見た目だけ）" +
                      "\n  このあと ServiceSim/Build Store を押すと、8 割の卓に座った客が出ます");
        }

        /// <summary>
        /// 形の prefab を用意して PeopleSpawner に入れる。入れ替えたら true。
        /// すでに同じものが入っていても true（用意できている、という意味）。
        /// </summary>
        public static bool Ensure(PeopleSpawner spawner, PeopleSpec spec)
        {
            if (spawner == null || spec == null) return false;

            GameObject prefab = ServiceSimSetup.EnsureSeatedBodyPrefab(spec);
            if (prefab == null)
            {
                Debug.LogError("[ServiceSim] 座っている客の形（prefab）を作れませんでした: " +
                               ServiceSimSetup.SeatedBodyPrefabPath);
                return false;
            }

            if (spawner.seatedBodyPrefab == prefab) return true;

            spawner.seatedBodyPrefab = prefab;
            EditorUtility.SetDirty(spawner);
            EditorSceneManager.MarkSceneDirty(SceneManager.GetActiveScene());
            Debug.Log("[ServiceSim] PeopleSpawner に座っている客の形を入れました" +
                      "（シーンを保存すると、回すときもこの形が出ます）");
            return true;
        }
    }
}
