﻿/* Copyright (C) 2011  Jan Källman
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.

 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU Lesser General Public License for more details.
 *
 * The GNU Lesser General Public License can be viewed at http://www.opensource.org/licenses/lgpl-license.php
 * If you unfamiliar with this license or have questions about it, here is an http://www.gnu.org/licenses/gpl-faq.html
 *
 * All code and executables are provided "as is" with no warranty either express or implied.
 * The author accepts no liability for any damage or loss of business that this product may cause.
 *
 * Code change notes:
 *
 * Author							Change						Date
 *******************************************************************************
 * Mats Alm   		                Added		                2013-12-03
 *******************************************************************************/

using System;
using System.Text.RegularExpressions;

namespace OfficeOpenXml.FormulaParsing.Excel.Functions.DateTime;

public class TimeStringParser {
  private const string _regEx24 = @"^[0-9]{1,2}(\:[0-9]{1,2}){0,2}$";
  private const string _regEx12 = @"^[0-9]{1,2}(\:[0-9]{1,2}){0,2}( PM| AM)$";

  private double GetSerialNumber(int hour, int minute, int second) {
    var secondsInADay = 24d * 60d * 60d;
    return ((double)hour * 60 * 60 + (double)minute * 60 + second) / secondsInADay;
  }

  private void ValidateValues(int hour, int minute, int second) {
    if (second < 0 || second > 59) {
      throw new FormatException("Illegal value for second: " + second);
    }
    if (minute < 0 || minute > 59) {
      throw new FormatException("Illegal value for minute: " + minute);
    }
  }

  public virtual double Parse(string input) {
    return InternalParse(input);
  }

  public virtual bool CanParse(string input) {
    System.DateTime dt;
    return Regex.IsMatch(input, _regEx24)
        || Regex.IsMatch(input, _regEx12)
        || System.DateTime.TryParse(input, out dt);
  }

  private double InternalParse(string input) {
    if (Regex.IsMatch(input, _regEx24)) {
      return Parse24HourTimeString(input);
    }
    if (Regex.IsMatch(input, _regEx12)) {
      return Parse12HourTimeString(input);
    }
    if (System.DateTime.TryParse(input, out var dateTime)) {
      return GetSerialNumber(dateTime.Hour, dateTime.Minute, dateTime.Second);
    }
    return -1;
  }

  private double Parse12HourTimeString(string input) {
    var dayPart = input.Substring(input.Length - 2, 2);
    GetValuesFromString(input, out var hour, out var minute, out var second);
    if (dayPart == "PM") {
      hour += 12;
    }
    ValidateValues(hour, minute, second);
    return GetSerialNumber(hour, minute, second);
  }

  private double Parse24HourTimeString(string input) {
    GetValuesFromString(input, out var hour, out var minute, out var second);
    ValidateValues(hour, minute, second);
    return GetSerialNumber(hour, minute, second);
  }

  private static void GetValuesFromString(
      string input,
      out int hour,
      out int minute,
      out int second) {
    hour = 0;
    minute = 0;
    second = 0;

    var items = input.Split(':');
    hour = int.Parse(items[0]);
    if (items.Length > 1) {
      minute = int.Parse(items[1]);
    }
    if (items.Length > 2) {
      var val = items[2];
      val = Regex.Replace(val, "[^0-9]+$", string.Empty);
      second = int.Parse(val);
    }
  }
}
