import 'package:flutter_custom_calendar/constants/constants.dart';
import 'package:flutter_custom_calendar/model/date_model.dart';
import 'package:flutter_custom_calendar/utils/date_util.dart';
import 'package:flutter_custom_calendar/utils/solar_term_util.dart';

/**
 * 农历的工具类
 */
class LunarUtil {
  static List<int> LUNAR_MONTH_DAYS = [
    1887,
    0x1694,
    0x16aa,
    0x4ad5,
    0xab6,
    0xc4b7,
    0x4ae,
    0xa56,
    0xb52a,
    0x1d2a,
    0xd54,
    0x75aa,
    0x156a,
    0x1096d,
    0x95c,
    0x14ae,
    0xaa4d,
    0x1a4c,
    0x1b2a,
    0x8d55,
    0xad4,
    0x135a,
    0x495d,
    0x95c,
    0xd49b,
    0x149a,
    0x1a4a,
    0xbaa5,
    0x16a8,
    0x1ad4,
    0x52da,
    0x12b6,
    0xe937,
    0x92e,
    0x1496,
    0xb64b,
    0xd4a,
    0xda8,
    0x95b5,
    0x56c,
    0x12ae,
    0x492f,
    0x92e,
    0xcc96,
    0x1a94,
    0x1d4a,
    0xada9,
    0xb5a,
    0x56c,
    0x726e,
    0x125c,
    0xf92d,
    0x192a,
    0x1a94,
    0xdb4a,
    0x16aa,
    0xad4,
    0x955b,
    0x4ba,
    0x125a,
    0x592b,
    0x152a,
    0xf695,
    0xd94,
    0x16aa,
    0xaab5,
    0x9b4,
    0x14b6,
    0x6a57,
    0xa56,
    0x1152a,
    0x1d2a,
    0xd54,
    0xd5aa,
    0x156a,
    0x96c,
    0x94ae,
    0x14ae,
    0xa4c,
    0x7d26,
    0x1b2a,
    0xeb55,
    0xad4,
    0x12da,
    0xa95d,
    0x95a,
    0x149a,
    0x9a4d,
    0x1a4a,
    0x11aa5,
    0x16a8,
    0x16d4,
    0xd2da,
    0x12b6,
    0x936,
    0x9497,
    0x1496,
    0x1564b,
    0xd4a,
    0xda8,
    0xd5b4,
    0x156c,
    0x12ae,
    0xa92f,
    0x92e,
    0xc96,
    0x6d4a,
    0x1d4a,
    0x10d65,
    0xb58,
    0x156c,
    0xb26d,
    0x125c,
    0x192c,
    0x9a95,
    0x1a94,
    0x1b4a,
    0x4b55,
    0xad4,
    0xf55b,
    0x4ba,
    0x125a,
    0xb92b,
    0x152a,
    0x1694,
    0x96aa,
    0x15aa,
    0x12ab5,
    0x974,
    0x14b6,
    0xca57,
    0xa56,
    0x1526,
    0x8e95,
    0xd54,
    0x15aa,
    0x49b5,
    0x96c,
    0xd4ae,
    0x149c,
    0x1a4c,
    0xbd26,
    0x1aa6,
    0xb54,
    0x6d6a,
    0x12da,
    0x1695d,
    0x95a,
    0x149a,
    0xda4b,
    0x1a4a,
    0x1aa4,
    0xbb54,
    0x16b4,
    0xada,
    0x495b,
    0x936,
    0xf497,
    0x1496,
    0x154a,
    0xb6a5,
    0xda4,
    0x15b4,
    0x6ab6,
    0x126e,
    0x1092f,
    0x92e,
    0xc96,
    0xcd4a,
    0x1d4a,
    0xd64,
    0x956c,
    0x155c,
    0x125c,
    0x792e,
    0x192c,
    0xfa95,
    0x1a94,
    0x1b4a,
    0xab55,
    0xad4,
    0x14da,
    0x8a5d,
    0xa5a,
    0x1152b,
    0x152a,
    0x1694,
    0xd6aa,
    0x15aa,
    0xab4,
    0x94ba,
    0x14b6,
    0xa56,
    0x7527,
    0xd26,
    0xee53,
    0xd54,
    0x15aa,
    0xa9b5,
    0x96c,
    0x14ae,
    0x8a4e,
    0x1a4c,
    0x11d26,
    0x1aa4,
    0x1b54,
    0xcd6a,
    0xada,
    0x95c,
    0x949d,
    0x149a,
    0x1a2a,
    0x5b25,
    0x1aa4,
    0xfb52,
    0x16b4,
    0xaba,
    0xa95b,
    0x936,
    0x1496,
    0x9a4b,
    0x154a,
    0x136a5,
    0xda4,
    0x15ac
  ];

  static List<int> SOLAR = [
    1887,
    0xec04c,
    0xec23f,
    0xec435,
    0xec649,
    0xec83e,
    0xeca51,
    0xecc46,
    0xece3a,
    0xed04d,
    0xed242,
    0xed436,
    0xed64a,
    0xed83f,
    0xeda53,
    0xedc48,
    0xede3d,
    0xee050,
    0xee244,
    0xee439,
    0xee64d,
    0xee842,
    0xeea36,
    0xeec4a,
    0xeee3e,
    0xef052,
    0xef246,
    0xef43a,
    0xef64e,
    0xef843,
    0xefa37,
    0xefc4b,
    0xefe41,
    0xf0054,
    0xf0248,
    0xf043c,
    0xf0650,
    0xf0845,
    0xf0a38,
    0xf0c4d,
    0xf0e42,
    0xf1037,
    0xf124a,
    0xf143e,
    0xf1651,
    0xf1846,
    0xf1a3a,
    0xf1c4e,
    0xf1e44,
    0xf2038,
    0xf224b,
    0xf243f,
    0xf2653,
    0xf2848,
    0xf2a3b,
    0xf2c4f,
    0xf2e45,
    0xf3039,
    0xf324d,
    0xf3442,
    0xf3636,
    0xf384a,
    0xf3a3d,
    0xf3c51,
    0xf3e46,
    0xf403b,
    0xf424e,
    0xf4443,
    0xf4638,
    0xf484c,
    0xf4a3f,
    0xf4c52,
    0xf4e48,
    0xf503c,
    0xf524f,
    0xf5445,
    0xf5639,
    0xf584d,
    0xf5a42,
    0xf5c35,
    0xf5e49,
    0xf603e,
    0xf6251,
    0xf6446,
    0xf663b,
    0xf684f,
    0xf6a43,
    0xf6c37,
    0xf6e4b,
    0xf703f,
    0xf7252,
    0xf7447,
    0xf763c,
    0xf7850,
    0xf7a45,
    0xf7c39,
    0xf7e4d,
    0xf8042,
    0xf8254,
    0xf8449,
    0xf863d,
    0xf8851,
    0xf8a46,
    0xf8c3b,
    0xf8e4f,
    0xf9044,
    0xf9237,
    0xf944a,
    0xf963f,
    0xf9853,
    0xf9a47,
    0xf9c3c,
    0xf9e50,
    0xfa045,
    0xfa238,
    0xfa44c,
    0xfa641,
    0xfa836,
    0xfaa49,
    0xfac3d,
    0xfae52,
    0xfb047,
    0xfb23a,
    0xfb44e,
    0xfb643,
    0xfb837,
    0xfba4a,
    0xfbc3f,
    0xfbe53,
    0xfc048,
    0xfc23c,
    0xfc450,
    0xfc645,
    0xfc839,
    0xfca4c,
    0xfcc41,
    0xfce36,
    0xfd04a,
    0xfd23d,
    0xfd451,
    0xfd646,
    0xfd83a,
    0xfda4d,
    0xfdc43,
    0xfde37,
    0xfe04b,
    0xfe23f,
    0xfe453,
    0xfe648,
    0xfe83c,
    0xfea4f,
    0xfec44,
    0xfee38,
    0xff04c,
    0xff241,
    0xff436,
    0xff64a,
    0xff83e,
    0xffa51,
    0xffc46,
    0xffe3a,
    0x10004e,
    0x100242,
    0x100437,
    0x10064b,
    0x100841,
    0x100a53,
    0x100c48,
    0x100e3c,
    0x10104f,
    0x101244,
    0x101438,
    0x10164c,
    0x101842,
    0x101a35,
    0x101c49,
    0x101e3d,
    0x102051,
    0x102245,
    0x10243a,
    0x10264e,
    0x102843,
    0x102a37,
    0x102c4b,
    0x102e3f,
    0x103053,
    0x103247,
    0x10343b,
    0x10364f,
    0x103845,
    0x103a38,
    0x103c4c,
    0x103e42,
    0x104036,
    0x104249,
    0x10443d,
    0x104651,
    0x104846,
    0x104a3a,
    0x104c4e,
    0x104e43,
    0x105038,
    0x10524a,
    0x10543e,
    0x105652,
    0x105847,
    0x105a3b,
    0x105c4f,
    0x105e45,
    0x106039,
    0x10624c,
    0x106441,
    0x106635,
    0x106849,
    0x106a3d,
    0x106c51,
    0x106e47,
    0x10703c,
    0x10724f,
    0x107444,
    0x107638,
    0x10784c,
    0x107a3f,
    0x107c53,
    0x107e48
  ];

  /**
   * 保存每年24节气
   */
  static final Map<int, List<String>> SOLAR_TERMS = new Map();

  /**
   * 公历节日
   */
  static List<String> SOLAR_CALENDAR = [
    "0101元旦",
    "0214情人节",
    "0308妇女节",
    "0312植树节",
    "0315消权日",
    "0401愚人节",
    "0422地球日",
    "0501劳动节",
    "0504青年节",
    "0601儿童节",
    "0701建党节",
    "0801建军节",
    "0910教师节",
    "1001国庆节",
    "1031万圣节",
    "1111光棍节",
    "1224平安夜",
    "1225圣诞节",
  ];

  /**
   * 传统农历节日
   */
  static List<String> TRADITION_FESTIVAL_STR = [
    "除夕",
    "0101春节",
    "0115元宵",
    "0505端午",
    "0707七夕",
    "0815中秋",
    "0909重阳",
  ];

  /**
   * 特殊节日、母亲节和父亲节,感恩节等
   */
  static final Map<int, List<String>> SPECIAL_FESTIVAL = new Map();

  /**
   * 特殊节日的数组
   */
  static List<String> SPECIAL_FESTIVAL_STR = [
    "母亲节",
    "父亲节",
    "感恩节",
  ];

  /**
   * 用来表示1900年到2099年间农历年份的相关信息,共24位bit的16进制表示,其中:
   * 1. 前4位表示该年闰哪个月;
   * 2. 5-17位表示农历年份13个月的大小月分布,0表示小,1表示大;
   * 3. 最后7位表示农历年首(正月初一)对应的公历日期。
   * <p/>
   * 以2014年的数据0x955ABF为例说明:
   * 1001 0101 0101 1010 1011 1111
   * 闰九月 农历正月初一对应公历1月31号
   */
  static final List<int> LUNAR_INFO = [
    0x84B6BF,
    /*1900*/
    0x04AE53,
    0x0A5748,
    0x5526BD,
    0x0D2650,
    0x0D9544,
    0x46AAB9,
    0x056A4D,
    0x09AD42,
    0x24AEB6,
    0x04AE4A,
    /*1901-1910*/
    0x6A4DBE,
    0x0A4D52,
    0x0D2546,
    0x5D52BA,
    0x0B544E,
    0x0D6A43,
    0x296D37,
    0x095B4B,
    0x749BC1,
    0x049754,
    /*1911-1920*/
    0x0A4B48,
    0x5B25BC,
    0x06A550,
    0x06D445,
    0x4ADAB8,
    0x02B64D,
    0x095742,
    0x2497B7,
    0x04974A,
    0x664B3E,
    /*1921-1930*/
    0x0D4A51,
    0x0EA546,
    0x56D4BA,
    0x05AD4E,
    0x02B644,
    0x393738,
    0x092E4B,
    0x7C96BF,
    0x0C9553,
    0x0D4A48,
    /*1931-1940*/
    0x6DA53B,
    0x0B554F,
    0x056A45,
    0x4AADB9,
    0x025D4D,
    0x092D42,
    0x2C95B6,
    0x0A954A,
    0x7B4ABD,
    0x06CA51,
    /*1941-1950*/
    0x0B5546,
    0x555ABB,
    0x04DA4E,
    0x0A5B43,
    0x352BB8,
    0x052B4C,
    0x8A953F,
    0x0E9552,
    0x06AA48,
    0x6AD53C,
    /*1951-1960*/
    0x0AB54F,
    0x04B645,
    0x4A5739,
    0x0A574D,
    0x052642,
    0x3E9335,
    0x0D9549,
    0x75AABE,
    0x056A51,
    0x096D46,
    /*1961-1970*/
    0x54AEBB,
    0x04AD4F,
    0x0A4D43,
    0x4D26B7,
    0x0D254B,
    0x8D52BF,
    0x0B5452,
    0x0B6A47,
    0x696D3C,
    0x095B50,
    /*1971-1980*/
    0x049B45,
    0x4A4BB9,
    0x0A4B4D,
    0xAB25C2,
    0x06A554,
    0x06D449,
    0x6ADA3D,
    0x0AB651,
    0x095746,
    0x5497BB,
    /*1981-1990*/
    0x04974F,
    0x064B44,
    0x36A537,
    0x0EA54A,
    0x86B2BF,
    0x05AC53,
    0x0AB647,
    0x5936BC,
    0x092E50,
    0x0C9645,
    /*1991-2000*/
    0x4D4AB8,
    0x0D4A4C,
    0x0DA541,
    0x25AAB6,
    0x056A49,
    0x7AADBD,
    0x025D52,
    0x092D47,
    0x5C95BA,
    0x0A954E,
    /*2001-2010*/
    0x0B4A43,
    0x4B5537,
    0x0AD54A,
    0x955ABF,
    0x04BA53,
    0x0A5B48,
    0x652BBC,
    0x052B50,
    0x0A9345,
    0x474AB9,
    /*2011-2020*/
    0x06AA4C,
    0x0AD541,
    0x24DAB6,
    0x04B64A,
    0x6a573D,
    0x0A4E51,
    0x0D2646,
    0x5E933A,
    0x0D534D,
    0x05AA43,
    /*2021-2030*/
    0x36B537,
    0x096D4B,
    0xB4AEBF,
    0x04AD53,
    0x0A4D48,
    0x6D25BC,
    0x0D254F,
    0x0D5244,
    0x5DAA38,
    0x0B5A4C,
    /*2031-2040*/
    0x056D41,
    0x24ADB6,
    0x049B4A,
    0x7A4BBE,
    0x0A4B51,
    0x0AA546,
    0x5B52BA,
    0x06D24E,
    0x0ADA42,
    0x355B37,
    /*2041-2050*/
    0x09374B,
    0x8497C1,
    0x049753,
    0x064B48,
    0x66A53C,
    0x0EA54F,
    0x06AA44,
    0x4AB638,
    0x0AAE4C,
    0x092E42,
    /*2051-2060*/
    0x3C9735,
    0x0C9649,
    0x7D4ABD,
    0x0D4A51,
    0x0DA545,
    0x55AABA,
    0x056A4E,
    0x0A6D43,
    0x452EB7,
    0x052D4B,
    /*2061-2070*/
    0x8A95BF,
    0x0A9553,
    0x0B4A47,
    0x6B553B,
    0x0AD54F,
    0x055A45,
    0x4A5D38,
    0x0A5B4C,
    0x052B42,
    0x3A93B6,
    /*2071-2080*/
    0x069349,
    0x7729BD,
    0x06AA51,
    0x0AD546,
    0x54DABA,
    0x04B64E,
    0x0A5743,
    0x452738,
    0x0D264A,
    0x8E933E,
    /*2081-2090*/
    0x0D5252,
    0x0DAA47,
    0x66B53B,
    0x056D4F,
    0x04AE45,
    0x4A4EB9,
    0x0A4D4C,
    0x0D1541,
    0x2D92B5 /*2091-2099*/
  ];

  /**
   * 初始化各种农历、节日
   *
   * @param calendar calendar
   */
  static void setupLunarCalendar(DateModel dateModel) {
    int year = dateModel.year;
    int month = dateModel.month;
    int day = dateModel.day;

//    dateModel.isWeekend = DateUtil.isWeekend(new DateTime(year, month, day));
//    dateModel.isLeapYear = DateUtil.isLeapYear(year);
//    dateModel.isCurrentDay = DateUtil.isCurrentDay(year, month, day);

    List<int> lunar = LunarUtil.solarToLunar(2020, 2, day);

//    dateModel.lunarYear = (lunar[0]);
//    dateModel.lunarMonth = (lunar[1]);
//    dateModel.lunarDay = (lunar[2]);

//    if (lunar[3] == 1) {
//      //如果是闰月
//      dateModel.leapMonth = lunar[1];
//    }
    //24节气
//    String solarTerm = getSolarTerm(year, month, day);
//    dateModel.solarTerm=solarTerm;
//    //公历节日
//    String gregorian = gregorianFestival(month, day);
//    dateModel.gregorianFestival=gregorian;
//    //传统农历节日
//    String festival = getTraditionFestival(lunar[0], lunar[1], lunar[2]);
//    dateModel.traditionFestival=festival;
    //农历格式的日期
    String lunarText = numToChinese(lunar[1], lunar[2], lunar[3]);

//    if (gregorian.isEmpty) {
//      gregorian = getSpecialFestival(year, month, day);
//    }
//    if (solarTerm.isNotEmpty) {
//      dateModel.lunarString = solarTerm;
//    } else if (gregorian.isNotEmpty) {
//      dateModel.lunarString = gregorian;
//    } else if (festival.isNotEmpty) {
//      dateModel.lunarString = festival;
//    } else {
//      dateModel.lunarString = lunarText;
//    }
  }

  /**
   * 公历转农历 Solar To Lunar
   *
   * @param year  公历年
   * @param month 公历月
   * @param day   公历日
   * @return [0]农历年 [1]农历月 [2]农历日 [3]是否闰月 0 false : 1 true
   */
  static List<int> solarToLunar(int year, int month, int day) {
    List<int> lunarInt = new List(4);
    int index = year - SOLAR[0];
    int data = (year << 9) | (month << 5) | (day);
    int solar11;
    if (SOLAR[index] > data) {
      index--;
    }
    solar11 = SOLAR[index];
    int y = getBitInt(solar11, 12, 9);
    int m = getBitInt(solar11, 4, 5);
    int d = getBitInt(solar11, 5, 0);
    int offset = solarToInt(year, month, day) - solarToInt(y, m, d);

    int days = LUNAR_MONTH_DAYS[index];
    int leap = getBitInt(days, 4, 13);

    int lunarY = index + SOLAR[0];
    int lunarM = 1;
    int lunarD;
    offset += 1;

    for (int i = 0; i < 13; i++) {
      int dm = getBitInt(days, 1, 12 - i) == 1 ? 30 : 29;
      if (offset > dm) {
        lunarM++;
        offset -= dm;
      } else {
        break;
      }
    }

    lunarD = offset;
    lunarInt[0] = lunarY;
    lunarInt[1] = lunarM;
    lunarInt[3] = 0;

    if (leap != 0 && lunarM > leap) {
      lunarInt[1] = lunarM - 1;
      if (lunarM == leap + 1) {
        lunarInt[3] = 1;
      }
    }
    lunarInt[2] = lunarD;
    return lunarInt;
  }

  static int getBitInt(int data, int length, int shift) {
    return (data & (((1 << length) - 1) << shift)) >> shift;
  }

  static int solarToInt(int y, int m, int d) {
    m = (m + 9) % 12;
    y = y - (m / 10).toInt();
    return (365 * y +
        (y / 4).toInt() -
        (y / 100).toInt() +
        (y / 400).toInt() +
        ((m * 306 + 5) / 10).toInt() +
        (d - 1));
  }

  /**
   * 返回24节气
   *
   * @param year  年
   * @param month 月
   * @param day   日
   * @return 返回24节气
   */
  static String getSolarTerm(int year, int month, int day) {
    if (!SOLAR_TERMS.containsKey(year)) {
      SOLAR_TERMS.addAll({year: SolarTermUtil.getSolarTerms(year)});
    }
    List<String> solarTerm = SOLAR_TERMS[year];
    String text = "${year}" + getString(month, day);
    String solar = "";
    for (String solarTermName in solarTerm) {
      if (solarTermName.contains(text)) {
        solar = solarTermName.replaceAll(text, "");
        break;
      }
    }
    return solar;
  }

  /**
   * 数字转换为农历节日或者日期
   *
   * @param month 月
   * @param day   日
   * @param leap  1==闰月
   * @return 数字转换为汉字日
   */
  static String numToChinese(int month, int day, int leap) {
    if (day == 1) {
      return numToChineseMonth(month, leap);
    }
    return CalendarConstants.LUNAR_DAY_TEXT[day - 1];
  }

  /**
   * 数字转换为汉字月份
   *
   * @param month 月
   * @param leap  1==闰月
   * @return 数字转换为汉字月份
   */
  static String numToChineseMonth(int month, int leap) {
    if (leap == 1) {
      return "闰" + CalendarConstants.LUNAR_MONTH_TEXT[month - 1];
    }
    return CalendarConstants.LUNAR_MONTH_TEXT[month - 1];
  }

  static String getString(int month, int day) {
    return (month >= 10 ? month.toString() : "0$month") +
        (day >= 10 ? day.toString() : "0$day");
  }

  /**
   * 获取公历节日
   *
   * @param month 公历月份
   * @param day   公历日期
   * @return 公历节日
   */
  static String gregorianFestival(int month, int day) {
    String text = getString(month, day);
    String solar = "";
    for (String aMSolarCalendar in SOLAR_CALENDAR) {
      if (aMSolarCalendar.contains(text)) {
        solar = aMSolarCalendar.replaceAll(text, "");
        break;
      }
    }
    return solar;
  }

  /**
   * 返回传统农历节日
   *
   * @param year  农历年
   * @param month 农历月
   * @param day   农历日
   * @return 返回传统农历节日
   */
  static String getTraditionFestival(int year, int month, int day) {
    if (month == 12) {
      int count = daysInLunarMonth(year, month);
      if (day == count) {
        return TRADITION_FESTIVAL_STR[0]; //除夕
      }
    }
    String text = getString(month, day);
    String festivalStr = "";
    for (String festival in TRADITION_FESTIVAL_STR) {
      if (festival.contains(text)) {
        festivalStr = festival.replaceAll(text, "");
        break;
      }
    }
    return festivalStr;
  }

  /**
   * 传回农历 year年month月的总天数,总共有13个月包括闰月
   *
   * @param year  将要计算的年份
   * @param month 将要计算的月份
   * @return 传回农历 year年month月的总天数
   */
  static int daysInLunarMonth(int year, int month) {
    if ((LUNAR_INFO[year - 1900] & (0x100000 >> month)) == 0)
      return 29;
    else
      return 30;
  }

  /**
   * 获取特殊计算方式的节日
   * 如:每年五月的第二个星期日为母亲节,六月的第三个星期日为父亲节
   * 每年11月第四个星期四定为"感恩节"
   *
   * @param year  year
   * @param month month
   * @param day   day
   * @return 获取西方节日
   */
  static String getSpecialFestival(int year, int month, int day) {
    if (!SPECIAL_FESTIVAL.containsKey(year)) {
      SPECIAL_FESTIVAL.addAll({year: getSpecialFestivals(year)});
    }
    List<String> specialFestivals = SPECIAL_FESTIVAL[year];
    String text = "$year" + getString(month, day);
    String solar = "";
    for (String special in specialFestivals) {
      if (special.contains(text)) {
        solar = special.replaceAll(text, "");
        break;
      }
    }
    return solar;
  }

  /**
   * 获取每年的母亲节和父亲节和感恩节
   * 特殊计算方式的节日
   *
   * @param year 年
   * @return 获取每年的母亲节和父亲节、感恩节
   */
  static List<String> getSpecialFestivals(int year) {
    List<String> festivals = new List(3);
    DateTime dateTime = new DateTime(year, 5, 1);

    //母亲节
    int week = (dateTime.weekday + 1) % 8;
    int startDiff = 7 - week + 1;
    if (startDiff == 7) {
      festivals[0] =
          dateToString(year, 5, startDiff + 1) + SPECIAL_FESTIVAL_STR[0];
    } else {
      festivals[0] =
          dateToString(year, 5, startDiff + 7 + 1) + SPECIAL_FESTIVAL_STR[0];
    }

    //父亲节
    dateTime = new DateTime(year, 6, 1);

    week = (dateTime.weekday + 1) % 8;
    startDiff = 7 - week + 1;
    if (startDiff == 7) {
      festivals[1] =
          dateToString(year, 6, startDiff + 7 + 1) + SPECIAL_FESTIVAL_STR[1];
    } else {
      festivals[1] = dateToString(year, 6, startDiff + 7 + 7 + 1) +
          SPECIAL_FESTIVAL_STR[1];
    }

    //感恩节
    dateTime = new DateTime(year, 11, 1);
    week = (dateTime.weekday + 1) % 8;

    startDiff = 7 - week + 1;
    if (startDiff <= 2) {
      festivals[2] =
          dateToString(year, 11, startDiff + 21 + 5) + SPECIAL_FESTIVAL_STR[2];
    } else {
      festivals[2] =
          dateToString(year, 11, startDiff + 14 + 5) + SPECIAL_FESTIVAL_STR[2];
    }
    return festivals;
  }

  static String dateToString(int year, int month, int day) {
    return "$year" + getString(month, day);
  }
}