/********************************************************************/
/* Copyright (c) 2019 System fugen G.K. and Yuzi Mizuno          */
/* All rights reserved.                                             */
/********************************************************************/
/********************************************************************/
#include "stdafx.h"
#include "mg/MGStl.h"
#include "mg/Ofstream.h"

#include "resource.h"
#include "IO/GLObjExporter.h"
#include "IO/GLStlExporter.h"
#include "IO/util.h"


#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

CGLObjExporter::CGLObjExporter()
	 : CGLFileExporter(IDS_FILTER_OBJ)
{
}

bool CGLObjExporter::Save(const MGGroup& group){
	// 一度stlで保存し、stlからobjに変換し保存している

	// 読み込まれたファイル名を取得
	CString fileName = GetFileName();

	// 拡張子を一旦とる
	fileName.Replace(_T(".obj"), _T(""));

	// GUIDを生成する
	GUID guid;
	::CoCreateGuid(&guid);
	// 文字列に変換
	WCHAR ws[40];
	ZeroMemory(ws, sizeof(WCHAR)*40);
	::StringFromGUID2(guid, ws, 40);

	// stlファイルとobjファイルのパス名を生成
	// stlファイル名には、guidを付与する
	CString stlFilePath = fileName + ws + _T(".stl");
	CString objFilePath = fileName + _T(".obj");

	// 一度stlで保存する
	CGLStlExporter stlExporter;
	int fileNum;
	stlExporter.Save(group, stlFilePath, fileNum);

	MGStl stl;
	CString newStlFilePath = stlFilePath;
	CString newObjFilePath = objFilePath;
	// stlで保存する際に、メッシュデータが多い場合stlファイルが複数作成されるので、
	// objファイルも複数作成する必要がある。
	// 出力したstlのファイル数分ループする。
	for (int i = 0; i < fileNum; i++){
		if (fileNum >= 2){
			// ファイル数が複数ある場合は、添え字を付ける
			newStlFilePath = AddNumberToPath(stlFilePath, _T("-%02d"), i);
			newObjFilePath = AddNumberToPath(objFilePath, _T("-%02d"), i);
		}

		// stlファイルを一度読み込む
		stl.LoadFile(newStlFilePath);
		// objファイルとして保存する
		std::ofstream fout(newObjFilePath);
		stl.SaveObjFormatFromStl(fout);

		// 出力ウインドに出力したファイルのメッセージを表示
		CString str, strMsg;
		strMsg.Format(IDS_SAVE_SUCCESS, newObjFilePath);
		str.Format(IDS_INFORMATION, strMsg);
		COUT << (TCAST)str << std::endl;

		// 使用したstlファイルは削除する
		DeleteFile(newStlFilePath);
	}

	return true;
}
