using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Content.Pipeline;
using Microsoft.Xna.Framework.Content.Pipeline.Graphics;
using MMD = MikuMikuDance.Model.Ver1;

using TImport = Microsoft.Xna.Framework.Content.Pipeline.Graphics.NodeContent;

namespace MikuMikuDance.XNA.ModelReach
{
    /// <summary>
    /// MikuMikuDanceのモデルデータをXNAにインポートするためのインポータ(Reach)
    /// </summary>
    /// <remarks>pmdrにすると</remarks>
    [ContentImporter(".pmdr", DisplayName = "MikuMikuDance PMD(Reach) : MikuMikuDance for XNA", CacheImportedData = false, DefaultProcessor = "MMDReachProcessor")]
    public class MMDReachImporter : ContentImporter<TImport>
    {
        /// <summary>
        /// インポート処理
        /// </summary>
        /// <param name="filename">ファイル名</param>
        /// <param name="context">コンテントインポータ</param>
        /// <returns>NodeContent</returns>
        /// <remarks>XNAのインポータから呼び出される</remarks>
        public override TImport Import(string filename, ContentImporterContext context)
        {

            //Identityを設定(コンテンツのロード元の判別等に必要)
            ContentIdentity Identity = new ContentIdentity(filename);
            NodeContent result = new NodeContent();

            //MMDモデルの読み込み
            //ここで注意点だが
            //MMDは左手座標系で、XNAは右手座標系である
            //よって、全てのZ軸情報が逆である
            MikuMikuDance.Model.MMDModel modelBase;
            try
            {
                modelBase = MikuMikuDance.Model.ModelManager.Read(filename, MikuMikuDance.Model.CoordinateType.RightHandedCoordinate);
            }
            catch (Exception e)
            {
                // コンテンツ ID (行番号を含む) を含めて例外を報告します
                throw new InvalidContentException(
                    "Unable to load MMD Model file. Exception:\n" + e.Message,
                    Identity, e);
            }
            //MMDバージョンチェック
            if (modelBase.Version != 1.0f)
                throw new InvalidContentException(
                    "This Importer can read only MMD Model ver 1.0.", Identity);
            //バージョンチェックしたのでMMDVer1にキャスト
            MMD.MMDModel1 model = (MMD.MMDModel1)modelBase;
            
            //これを元にモデルのビルド処理
            result = MMDReachBuilder.Build(model, filename, Identity);
            
            
            //result.filename = filename;
            return result;
        }
    }
}
