" =============================================================================
" Filename: autoload/calendar/day.vim
" Author: itchyny
" License: MIT License
" Last Change: 2015/03/29 06:29:20.
" =============================================================================

let s:save_cpo = &cpo
set cpo&vim

" Day object switching the calendar based on the user's setting.
function! calendar#day#new(y, m, d) abort
  return calendar#day#{calendar#setting#get('calendar')}#new(a:y, a:m, a:d)
endfunction

" Day object from mjd.
function! calendar#day#new_mjd(mjd) abort
  return calendar#day#{calendar#setting#get('calendar')}#new_mjd(a:mjd)
endfunction

" Today.
function! calendar#day#today() abort
  return calendar#day#new_mjd(calendar#day#today_mjd())
endfunction

" Today's mjd.
function! calendar#day#today_mjd() abort
  let [y, m, d] = s:ymd()
  if has_key(s:, '_y') && s:_y == [y, m, d]
    return s:_m
  endif
  let s:_y = [y, m, d]
  let s:_m = calendar#day#gregorian#new(y, m, d).mjd
  return s:_m
endfunction

" Today's [ year, month, day ].
if exists('*strftime')
  function! s:ymd() abort
    return [strftime('%Y') * 1, strftime('%m') * 1, strftime('%d') * 1]
  endfunction
else
  function! s:ymd() abort
    return [system('date "+%Y"') * 1, system('date "+%m"') * 1, system('date "+%d"') * 1]
  endfunction
endif

" Join the year, month and day using the endian, separator settings.
function! calendar#day#join_date(ymd) abort
  let endian = calendar#setting#get('date_endian')
  let use_month_name = calendar#setting#get('date_month_name')
  let sep1 = calendar#setting#get('date_separator')
  let sep2 = use_month_name ? '' : sep1
  let ymd = a:ymd
  if len(a:ymd) == 3
    let [y, m, d] = a:ymd
    let mm = use_month_name ? calendar#message#get('month_name')[m - 1] : m
    if endian ==# 'big'
      let ymd = [y, sep1, mm, sep2, d]
    elseif endian ==# 'middle'
      let ymd = [mm, sep2, d, sep1, y]
    else
      let ymd = [d, sep2, mm, sep1, y]
    endif
  elseif len(a:ymd) == 2
    let [m, d] = a:ymd
    let mm = use_month_name ? calendar#message#get('month_name')[m - 1] : m
    if endian ==# 'big' || endian ==# 'middle'
      let ymd = [mm, sep2, d]
    else
      let ymd = [d, sep2, mm]
    endif
  endif
  return join(ymd, '')
endfunction

let &cpo = s:save_cpo
unlet s:save_cpo