﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
using Word = Microsoft.Office.Interop.Word;


namespace Gosh.Officer.Core.Logic.Editor.GoshWord.Revision {
	public class RevPosPainterOfFooters : RevPosPainter {
		/// <summary>
		/// 本文の改訂箇所に改訂線を引く。
		/// </summary>
		/// <param name="pos">改訂箇所</param>
		protected override void addLine(RevPos pos) {
			foreach (Word.Section wordSection in pos.fRange.Sections) {
				//改訂箇所のレンジを選択する。（選択しないと線が引けない。）
				pos.fRange.Select();

				//改訂線を引く。
				Word.Shapes shapes
					= wordSection.Footers[Word.WdHeaderFooterIndex.wdHeaderFooterPrimary].Shapes;
				paintLine(pos, shapes);
			}
		}


		/// <summary>
		/// 本文の改訂箇所を取得する。
		/// </summary>
		/// <param name="objDoc">アクティブドキュメント</param>
		/// <returns>改訂箇所リスト</returns>
		protected override List<RevPos> getRevPos(Word.Document objDoc) {
			List<RevPos> revPos = new List<RevPos>();

			foreach (Word.Section sec in objDoc.Sections) {
				foreach (Word.HeaderFooter footer in sec.Footers) {
					foreach (Word.Revision rev in footer.Range.Revisions) {
						Word.WdRevisionType revType = rev.Type;

						//挿入箇所だけを対象に処理する。
						if (revType == Word.WdRevisionType.wdRevisionInsert) {
							revPos.Add(RevPos.create(rev.Range));
						}
						rev.Accept();
					}
				}
			}

			return revPos;
		}

		/// <summary>
		/// すべての改訂箇所に改訂線を引く
		/// </summary>
		/// <param name="objDoc"></param>
		/// <param name="revMark"></param>
		public override void paintRevisionLine(Word.Document objDoc, string revMark) {
			fRevMark = revMark;
			List<RevPos> revPosForFooters = getRevPos(objDoc);

			IOrderedEnumerable<RevPos> sortedRevPosForFooters =
				revPosForFooters.
				OrderBy(a => a.fStart.fPage).OrderBy(a => a.fEnd.fPage).
				ThenBy(a => a.fStart.fHeight).ThenBy(a => a.fEnd.fHeight);

			//隣接する改訂履歴をマージ
			List<RevPos> resultPosForFooters
				= RevPos.mergeRevPosition(revPosForFooters, 20.0F);

			//改訂線を引く
			foreach (RevPos pos in revPosForFooters) {
				addLine(pos);
			}
		}
	}
}
