sunwait
  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  10. 10
  11. 11
  12. 12
  13. 13
  14. 14
  15. 15
  16. 16
  17. 17
  18. 18
  19. 19
  20. 20
  21. 21
  22. 22
  23. 23
  24. 24
  25. 25
  26. 26
  27. 27
  28. 28
  29. 29
  30. 30
  31. 31
  32. 32
  33. 33
  34. 34
  35. 35
  36. 36
  37. 37
  38. 38
  39. 39
  40. 40
  41. 41
  42. 42
  43. 43
  44. 44
  45. 45
  46. 46
  47. 47
  48. 48
  49. 49
  50. 50
  51. 51
  52. 52
  53. 53
  54. 54
  55. 55
  56. 56
  57. 57
  58. 58
  59. 59
  60. 60
  61. 61
  62. 62
  63. 63
  64. 64
  65. 65
  66. 66
  67. 67
  68. 68
  69. 69
  70. 70
  71. 71
  72. 72
  73. 73
  74. 74
  75. 75
  76. 76
  77. 77
  78. 78
  79. 79
  80. 80
  81. 81
  82. 82
  83. 83
  84. 84
  85. 85
  86. 86
  87. 87
  88. 88
  89. 89
  90. 90
  91. 91
  92. 92
  93. 93
  94. 94
  95. 95
  96. 96
  97. 97
  98. 98
  99. 99
  100. 100
  101. 101
  102. 102
  103. 103
  104. 104
  105. 105
  106. 106
  107. 107
  108. 108
  109. 109
  110. 110
  111. 111
  112. 112
  113. 113
  114. 114
  115. 115
  116. 116
  117. 117
  118. 118
  119. 119
  120. 120
  121. 121
  122. 122
  123. 123
  124. 124
  125. 125
#compdef sunwait

# Copyright (C) 2025 Shota FUJI
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program 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 General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <https://www.gnu.org/licenses/>.
#
# SPDX-License-Identifier: GPL-3.0-only

function _sunwait {
	local line state

	_arguments -C \
		{-h,--help}"[Prints usage to stdout and exits]" \
		{-v,--version}"[Prints version to stdout and exits]" \
		"--debug[Prints debug log and shortens wait duration to 1 min]" \
		"--utc[Parses timezone-less dates and times as UTC]" \
		{--lat,--latitude}"[Latitude in degree, signed float or positive float with N/S suffix]:degree:" \
		{--lon,--longitude}"[Longitude in degree, signed float or positive float with E/W suffix]:degree:" \
		"--twilight[Twilight type or angle]:type:->twilight" \
		{-o,--offset}"[Time offset in minutes]:minutes:" \
		"1: :->command" \
		"*::arg:->args"

	case "$state" in
		(command)
			_values "command" \
				"poll[Prints DAY or NIGHT]" \
				"wait[Wait until next sunrise or sunset]" \
				"report[Prints detailed report for sunrise and sunset]" \
				"list[List sunrise and/or sunset for next N days]"
		;;
		(twilight)
			_values "twilight" \
				"daylight" \
				"civil" \
				"nautical" \
				"astronomical"
		;;
		(args)
			case $line[1] in
				(poll)
					_sunwait_poll
				;;
				(wait)
					_sunwait_wait
				;;
				(report)
					_sunwait_report
				;;
				(list)
					_sunwait_list
				;;
			esac
		;;
	esac
}

function _sunwait_poll {
	_arguments "--at[YYYY-MM-DDThh:mm:ssZ]:datetime:"
}

function _sunwait_wait {
	local state

	_arguments -C \
		\*{-e,--event}"[Events to wait]:type:->event"

	case "$state" in
		(event)
			_values "event" \
				"sunrise[Waits for sunrise]" \
				"sunset[Waits for sunset]"
		;;
	esac
}

function _sunwait_report {
	local state

	_arguments -C \
		"--date[Date to generate report for, in YYYY-MM-DD]:date:->date"

	case "$state" in
		(date)
			_values "date" "$(date -Idate)[Current date]"
		;;
	esac
}

function _sunwait_list {
	local state

	_arguments -C \
		"--from[Start date in YYYY-MM-DD]:date:->date" \
		\*{-e,--event}"[Events to print]:type:->event" \
		"1:days:"

	case "$state" in
		(event)
			_values "event" \
				"sunrise[List sunrise times]" \
				"sunset[List sunset times]"
		;;
		(date)
			_values "date" "$(date -Idate)[Current date]"
		;;
	esac
}

if [ "$funcstack[1]" = "_sunwait" ]; then
	_sunwait "$@"
else
	compdef _sunwait sunwait
fi