using System;
using System.Linq;
using UniGLTF;
using UniJSON;
using UnityEngine;

namespace UniVRM10
{
    /// <summary>
    /// VRM 拡張に含まれる Material 情報を用いて、マイグレーションを行う.
    /// 前提として、glTF の仕様の範囲で glTFMaterial は既に読み込み済みであると仮定する.
    /// </summary>
    public static class MigrationMaterials
    {
        private const string DontUseExtensionShaderName = "VRM_USE_GLTFSHADER";
        private const string MaterialPropertiesKey = "materialProperties";

        public static void Migrate(glTF gltf, JsonNode vrm0)
        {
            var needsDisablingVertexColor = false;
            var vrm0XMaterialList = vrm0[MaterialPropertiesKey].ArrayItems().ToArray();

            // 1. VRM 拡張のうち、古い Unlit 情報からの取得を試みる.
            if (MigrationLegacyUnlitMaterial.Migrate(gltf, vrm0XMaterialList))
            {
                // NOTE: 古い Unlit である場合、頂点カラー情報を破棄する.
                needsDisablingVertexColor = true;
            }

            // 2. VRM 拡張のうち、UnlitTransparentZWrite 情報からの取得を試みる.
            if (MigrationUnlitTransparentZWriteMaterial.Migrate(gltf, vrm0XMaterialList))
            {
                // NOTE: 古い Unlit である場合、頂点カラー情報を破棄する.
                needsDisablingVertexColor = true;
            }

            try
            {
                // 3. VRM 拡張のうち、MToon 情報からの取得を試みる.
                MigrationMToonMaterial.Migrate(gltf, vrm0);
            }
            catch (Exception ex)
            {
                Debug.LogException(ex);
            }

            if (needsDisablingVertexColor)
            {
                DisableVertexColor(gltf);
            }
        }

        private static void DisableVertexColor(glTF gltf)
        {
            foreach (var mesh in gltf.meshes)
            {
                foreach (var primitive in mesh.primitives)
                {
                    primitive.attributes.COLOR_0 = -1;
                }
            }
        }
    }
}