using System;
using System.IO;
using System.Text;
using UnityEditor;
using UnityEngine;

namespace ServiceSim.EditorTools
{
    /// <summary>
    /// 地図の上で道を引く確かめ（依頼 v9 の 7 章 A）。
    ///
    /// 店も人も建てず、回さない。サイトの JSON と地図だけで、
    /// 受け渡し口から全卓へ道を引いて、サイトの routes と突き合わせる。
    /// 中身は ServiceSim.MapPlanCheck（Unity の外からも同じものを呼べる）。
    /// </summary>
    public static class ServiceSimMapPlanner
    {
        const string P1Path = "Assets/ServiceSim/Store/StoreLayout_p1_efficient_corner.asset";
        const string P5Path = "Assets/ServiceSim/Store/StoreLayout_p5_crammed.asset";

        [MenuItem("ServiceSim/Map Planner/③⑦ 確かめ A（地図で道を引く・回さない）", false, 34)]
        public static void CheckBoth()
        {
            StringBuilder sb = new StringBuilder();
            sb.AppendLine("# 確かめ A：人のいない店で、受け渡し口から全卓へ道を引く（依頼 v9 の 7 章 A）");
            sb.AppendLine("作った日時: " + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
            sb.AppendLine("店も人も建てていない（JSON と地図だけで引いた）");
            sb.AppendLine();

            RobotSpec spec = AssetDatabase.LoadAssetAtPath<RobotSpec>(ServiceSimSetup.RobotSpecPath);
            if (spec == null)
                sb.AppendLine("※ RobotSpec が見つからないので、道の引き方は既定の値で引きました");

            bool ok = true;
            ok &= One(sb, P1Path, "③ 効率重視型・入口が左下の角", spec);
            sb.AppendLine();
            ok &= One(sb, P5Path, "⑦ ぎっしり型", spec);

            sb.AppendLine();
            sb.AppendLine(ok ? "→ ③⑦ ともに確かめ A は通った" : "→ 通っていないものがある（上の × を見てください）");

            ExperimentPlan plan = AssetDatabase.LoadAssetAtPath<ExperimentPlan>(ServiceSimSetup.ExperimentPlanPath);
            string outDir = plan != null ? plan.screenshotDir : null;
            if (!string.IsNullOrEmpty(outDir))
            {
                try
                {
                    Directory.CreateDirectory(outDir);
                    string txt = Path.Combine(outDir,
                        DateTime.Now.ToString("yyyyMMdd_HHmm") + "_map_planner_checkA.txt");
                    File.WriteAllText(txt, sb.ToString(), new UTF8Encoding(false));
                    sb.AppendLine("書き出し: " + txt);
                }
                catch (Exception e) { sb.AppendLine("書き出せません: " + e.Message); }
            }

            if (ok) Debug.Log("[ServiceSim] " + sb.ToString());
            else Debug.LogError("[ServiceSim] " + sb.ToString());
        }

        static bool One(StringBuilder sb, string assetPath, string label, RobotSpec spec)
        {
            JsonStoreLayout layout = AssetDatabase.LoadAssetAtPath<JsonStoreLayout>(assetPath);
            if (layout == null)
            {
                sb.AppendLine("## " + label + "\n  店の形が見つかりません: " + assetPath);
                return false;
            }
            if (layout.layoutJson == null || layout.mapJson == null)
            {
                sb.AppendLine("## " + label + "（" + layout.layoutFileName + "）");
                sb.AppendLine("  " + (layout.layoutJson == null ? "layoutJson" : "mapJson") +
                              " が入っていません（依頼 v9 の 0 章を確かめてください）");
                return false;
            }

            MapPlanCheck.Result res = MapPlanCheck.Run(
                label + "（" + layout.layoutFileName + "）",
                layout.layoutJson.text, layout.mapJson.text, spec);
            sb.AppendLine(res.report);

            ExperimentPlan plan = AssetDatabase.LoadAssetAtPath<ExperimentPlan>(ServiceSimSetup.ExperimentPlanPath);
            string outDir = plan != null ? plan.screenshotDir : null;
            if (!string.IsNullOrEmpty(outDir) && res.rows.Count > 0)
            {
                try
                {
                    Directory.CreateDirectory(outDir);
                    string csv = Path.Combine(outDir,
                        DateTime.Now.ToString("yyyyMMdd_HHmm") + "_map_plan_" +
                        layout.layoutFileName + ".csv");
                    File.WriteAllText(csv, res.Csv(), new UTF8Encoding(false));
                    sb.AppendLine("  CSV: " + csv);
                }
                catch (Exception e) { sb.AppendLine("  CSV を書けません: " + e.Message); }
            }
            return res.ok;
        }
    }
}
