import dateFormat from 'dateformat'
import { PickerValue } from '../../CCWheelPicker/utils'
import { FormatTypes } from './helpers'

export type PickerValueForDate = Omit<PickerValue, 'value'> & { value: string }

const date = new Date()
const year = date.getFullYear()
/**
 * 各スロットのフォーマット
 * mode日時の時だけ
 */
export const dateFormats: FormatTypes[] = [
  {
    label: 'yyyy',
    startOffset: year - 100,
    upperNumber: year + 100,
    requiredDigit: false,
    numberOptions: true,
  }, // 4桁の数字で年を表示。
  {
    label: 'yy',
    startOffset: 0,
    upperNumber: 99,
    requiredDigit: true,
    numberOptions: true,
  }, // 年を最後の2桁で表示；10未満の年には先頭ゼロあり。
  {
    label: 'dd',
    startOffset: 1,
    upperNumber: 31,
    requiredDigit: true,
    numberOptions: true,
  }, // 月の日付としての数字；1桁の日には先頭ゼロあり。
  {
    label: 'd',
    startOffset: 1,
    upperNumber: 31,
    requiredDigit: false,
    numberOptions: true,
  }, // 月の日付としての数字；1桁の日には先頭のゼロなし。
  {
    label: 'mm',
    startOffset: 1,
    upperNumber: 12,
    requiredDigit: true,
    numberOptions: true,
  }, // 月を数字で表示；1桁の月には先頭ゼロあり。
  {
    label: 'm',
    startOffset: 1,
    upperNumber: 12,
    requiredDigit: false,
    numberOptions: true,
  }, // 月を数字で表示；1桁の月には先頭のゼロなし。
  {
    label: 'h',
    startOffset: 0,
    upperNumber: 11,
    requiredDigit: false,
    numberOptions: true,
  }, // 時間を表示；1桁の時間には12時間制で先頭のゼロなし。
  {
    label: 'hh',
    startOffset: 0,
    upperNumber: 11,
    requiredDigit: true,
    numberOptions: true,
  }, // 時間を表示；1桁の時間には12時間制で先頭ゼロあり。
  {
    label: 'HH',
    startOffset: 0,
    upperNumber: 23,
    requiredDigit: true,
    numberOptions: true,
  }, // 時間を表示；1桁の時間には24時間制で先頭ゼロあり。
  {
    label: 'H',
    startOffset: 0,
    upperNumber: 23,
    requiredDigit: false,
    numberOptions: true,
  }, // 時間を表示；1桁の時間には24時間制で先頭のゼロなし。
  {
    label: 'MM',
    startOffset: 0,
    upperNumber: 59,
    requiredDigit: true,
    numberOptions: true,
  }, // 分を数字で表示；1桁の分には先頭ゼロあり。
  {
    label: 'M',
    startOffset: 0,
    upperNumber: 59,
    requiredDigit: false,
    numberOptions: true,
  }, // 分を数字で表示；1桁の分には先頭のゼロなし。
  {
    label: 'ss',
    startOffset: 0,
    upperNumber: 59,
    requiredDigit: true,
    numberOptions: true,
  }, // 秒を数字で表示；1桁の秒には先頭ゼロあり。
  {
    label: 's',
    startOffset: 0,
    upperNumber: 59,
    requiredDigit: false,
    numberOptions: true,
  }, // 秒を数字で表示；1桁の秒には先頭のゼロなし。
]

/**
 * 文字列を日付に変換する
 * @param model
 * @returns
 */
export function transformValueFromDateText(model, slotsFormat) {
  const unitDateInJp = ['年', '月', '日']
  const timeUnitDateInJp = ['時', '分']
  const secondUnitDateInJp = ['秒']
  const signs = ['/', ':']
  let modelFormated = unitDateInJp
    .reduce((acc, cur) => {
      return acc.replaceAll(cur, '/')
    }, model)
    .replaceAll('//', '/')
  modelFormated = timeUnitDateInJp
    .reduce((acc, cur) => {
      return acc.replaceAll(cur, ':')
    }, modelFormated)
    .replaceAll('::', ':')
  modelFormated = secondUnitDateInJp.reduce((acc, cur) => {
    return acc.replaceAll(cur, '')
  }, modelFormated)
  // 末尾に余計な記号がある場合は消去
  if (signs.includes(modelFormated.slice(-1))) modelFormated = modelFormated.slice(0, -1)

  const date = new Date(modelFormated || '')

  return slotsFormat.map((e) => {
    return {
      value: dateFormat(date, e.format),
      label: dateFormat(date, e.format),
    }
  })
}

/** 閏年の判別をする関数
 * @param year　年
 * @returns boolean　閏年の場合はtrue
 */
export function isLeapYear(year: number): boolean {
  if ((year % 4 === 0 && year % 100 !== 0) || year % 400 === 0) {
    return true
  }
  return false
}
