import { isValidDate } from './marker'

const ISO_RE = /^\s*(\d{4})(-?(\d{2})(-?(\d{2})([T ](\d{2}):?(\d{2})(:?(\d{2})(\.(\d+))?)?(Z|(([-+])(\d{2})(:?(\d{2}))?))?)?)?)?$/

export function parse(str) {
  let m = ISO_RE.exec(str)

  if (m) {
    let marker = new Date(Date.UTC(
      Number(m[1]),
      m[3] ? Number(m[3]) - 1 : 0,
      Number(m[5] || 1),
      Number(m[7] || 0),
      Number(m[8] || 0),
      Number(m[10] || 0),
      m[12] ? Number(`0.${m[12]}`) * 1000 : 0,
    ))

    if (isValidDate(marker)) {
      let timeZoneOffset = null

      if (m[13]) {
        timeZoneOffset = (m[15] === '-' ? -1 : 1) * (
          Number(m[16] || 0) * 60 +
          Number(m[18] || 0)
        )
      }

      return {
        marker,
        isTimeUnspecified: !m[6],
        timeZoneOffset,
      }
    }
  }

  return null
}
