package org.linlinjava.jz.db.dto.hm.calendar;

import java.text.ParseException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import org.linlinjava.jz.db.util.JsonUtil;
import org.linlinjava.jz.db.util.hm.CalendarUtil;
import org.linlinjava.jz.db.util.hm.HolidayUtil;
import org.linlinjava.jz.db.util.hm.HolidayUtil.holidays;

import lombok.Data;

/**
 * 日历 月
 * 
 * @author lu
 *
 */
@Data
public class CalendarDto {
	private String currentMonth;// 当前月2020-12
	private String lastMonth;// 上一月2020-11
	private String nextMonth;// 下一月 2021-01
	private List<EveryDay> everyDay;// 月的每一天
	private String currentDay;// 当天 2020-12-16

	/**
	 * 设置业务中的休息日
	 * 
	 * @param c
	 * @param restDay
	 * @return
	 */
	public static CalendarDto setBusinessRestDay(CalendarDto cd, String[] restDay) {
		if (cd == null || cd.getEveryDay() == null || restDay == null) {
			return cd;
		}

		for (EveryDay e : cd.getEveryDay()) {
			for (String r : restDay) {
				if (e.getDayymd().equals(r)) {
					e.setRestDay(true);
					break;
				}
			}
			if (!e.isRestDay()) {
				e.setRestDay(false);
			}
		}
		return cd;
	}

	/**
	 * 根据 某年月 获取日历
	 * 
	 * @param dateym 2020-12
	 * @return
	 */
	public static CalendarDto currentDayMonth(String dateym) {
		CalendarDto cd = new CalendarDto();

		Date date = new Date();
		try {
			date = CalendarUtil.dft.parse(dateym);
		} catch (ParseException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		cd.setCurrentDay(CalendarUtil.getCurrDay());// 当天
		cd.setCurrentMonth(dateym);// 当前月 CalendarUtil.getCurrMonth(date)
		cd.setLastMonth(CalendarUtil.getLastMonth(date));// 上一个月
		cd.setNextMonth(CalendarUtil.getPreMonth(date));// 下一个月

//		cd.setEveryDay(everyDay);
		// 日历面板天数
		List<String> riliTemp = monthCalendar(cd);

		// 设置节假日
		List<EveryDay> monthHoliday = getMonthHoliday(cd, riliTemp);

		cd.setEveryDay(monthHoliday);

		return cd;
	}

	/**
	 * 节假日
	 * 
	 * @param cd
	 * @param riliTemp
	 * @return
	 */
	private static List<EveryDay> getMonthHoliday(CalendarDto cd, List<String> riliTemp) {
		List<EveryDay> tempEveryDay = new ArrayList<EveryDay>();
		for (String s : riliTemp) {
			EveryDay ed = new EveryDay();
			ed.setDayymd(s);// 天ymd
			ed.setWeek(CalendarUtil.ofWeek(s));// 周几

			String tian = s.substring(s.lastIndexOf("-") + 1, s.length());
			ed.setDay(Integer.parseInt(tian));// 数字天

			// 是否属于当月
			String dangyue = s.substring(0, s.lastIndexOf("-"));
			if (cd.getCurrentMonth().equals(dangyue)) {
				ed.setIsSameMonth(true);
			} else {
				ed.setIsSameMonth(false);
			}

			ed.setHoliday(false);// 默认没有节假日

			// 判断节假日 和节假日名称
			holidays hd = HolidayUtil.getHoliday(s);
			if (null != hd) {
				ed.setHoliday(hd.isHoliday());
				ed.setFestival(hd.getName());
			}
			tempEveryDay.add(ed);
		}

		// 判断 ofMohLine; 日历一月的第几行（第几周）最多6行
		for (int i = 1; i <= tempEveryDay.size(); i++) {
			int zou = i / 7;
			int yu = i % 7;
			if (yu > 0) {
				zou = zou + 1;
			}
			tempEveryDay.get(i-1).setOfMohLine(zou);
		}

		return tempEveryDay;
	}

	// 当月日历
	private static List<String> monthCalendar(CalendarDto cd) {
		List<String> riliTemp = new ArrayList<String>();

		List<String> dangyue = CalendarUtil.getDayListOfMonth(cd.getCurrentMonth());// 当月天数;
		List<String> shangyue = CalendarUtil.getDayListOfMonth(cd.getLastMonth());// 上月
		List<String> xiayue = CalendarUtil.getDayListOfMonth(cd.getNextMonth());// 下个月;

		// 判断当月第一天是周几 1-7 1是周一，7是周日
		// 当月最后一天是周几 1-7
		int firstDay = CalendarUtil.ofWeek(dangyue.get(0));
		int endDay = CalendarUtil.ofWeek(dangyue.get(dangyue.size() - 1));

		// 第一行日历的行填充前一月的后几天

		if (firstDay != 1) {// 不是星期一
			List<String> subList = shangyue.subList(shangyue.size() - firstDay + 1, shangyue.size());
			riliTemp.addAll(subList);
		}

		// 当月
		riliTemp.addAll(dangyue);

		// 最后一行填充下一月的前几天
		if (endDay != 7) {// 不是周日
			List<String> subList = xiayue.subList(0, 7 - endDay);
			riliTemp.addAll(subList);
		}

		return riliTemp;
	}

	public static void main(String[] args) {

		System.out.println(JsonUtil.getJson(currentDayMonth("2021-03")));
	}

}
