#!/bin/bash
set -e

if [ $# != 1 ] ; then
	echo >&2 "Použití: $0 <ročník>"
	exit 1
fi

YEAR=$1
YY1=$((1950+$YEAR))
YY2=$((1951+$YEAR))

# Datum konání
declare -A D
D[START]=$YY1-09-01
D[Z5_DOMACI]=$YY2-01-08
D[Z5_OKRESNI]=$YY2-01-29
D[Z6_DOMACI]=$YY2-03-04
D[Z6_OKRESNI]=$YY2-04-02
D[Z7_DOMACI]=${D[Z6_DOMACI]}
D[Z7_OKRESNI]=${D[Z6_OKRESNI]}
D[Z8_DOMACI]=${D[Z6_DOMACI]}
D[Z8_OKRESNI]=${D[Z6_OKRESNI]}
D[Z9_DOMACI]=${D[Z5_DOMACI]}
D[Z9_OKRESNI]=${D[Z5_OKRESNI]}
D[Z9_KRAJSKE]=$YY2-03-25
D[A_DOMACI]=$YY1-12-03
D[A_SKOLNI]=$YY1-12-10
D[A_KRAJSKE]=$YY2-01-14
D[B_DOMACI]=$YY2-01-21
D[B_SKOLNI]=$YY2-01-28
D[B_KRAJSKE]=$YY2-04-01
D[C_DOMACI]=${D[B_DOMACI]}
D[C_SKOLNI]=${D[B_SKOLNI]}
D[C_KRAJSKE]=${D[B_KRAJSKE]}
D[P_DOMACI]=$YY1-11-15
D[P_KRAJSKE]=$YY2-01-21
D[USTREDNI_PONDELI]=$YY2-03-17

# Délka soutěže v minutách
declare -A L
L[Z5_OKRESNI]=90
L[Z6_OKRESNI]=120
L[Z7_OKRESNI]=120
L[Z8_OKRESNI]=120
L[Z9_OKRESNI]=240
L[Z9_KRAJSKE]=240

# Hacky do výsledkovek
KDE_USTREDNI="Plzeň"
HACK_A_USTREDNI="podhlavicka={$KDE_USTREDNI 16.--18. března $YY2}"
HACK_P_USTREDNI="podhlavicka={$KDE_USTREDNI 18.--20. března $YY2}"

dd()
{
	date -d "$1" -Idate
}

dt()
{
	date -d "$1" -Iminutes
}

create_ss()
{
	local CAT=$1
	local ADV="$2"
	local MIN_GRADE="$3"
	local MAX_GRADE="$4"

	local D_START=${D[START]}
	local D_DOMACI=${D[${CAT}_DOMACI]}
	local D_SKOLNI=${D[${CAT}_SKOLNI]}
	local D_OKRESNI=${D[${CAT}_OKRESNI]}
	local D_KRAJSKE=${D[${CAT}_KRAJSKE]}
	local D_ENROLL=$(dd "+2 days $D_DOMACI")

	bin/create-round --year $YEAR --cat $CAT --seq 1 \
		--level 4 \
		--type domaci --name 'Domácí kolo' \
		--enroll-mode register --enroll-advert "$ADV" \
		--min-rec-grade $MIN_GRADE --max-rec-grade $MAX_GRADE \
		--ct-tasks-start $D_START \
		--ct-submit-end "$D_DOMACI 23:59" \
		--pr-tasks-start $D_START \
		--pr-submit-end "$D_DOMACI 23:59" \
		--enroll-deadline "$D_ENROLL 23:59" \
		--score-successful-limit 20 --score-advance-limit 20
	bin/create-tasks --round $YEAR-$CAT-1 --code $CAT-I-1 \
		--name 'Úloha 1' --points 6 --count 6
	bin/schedule-round-job --round $YEAR-$CAT-1 --switch-to-grading --time $(dd "+1 day $D_DOMACI")

	bin/create-round --year $YEAR --cat $CAT --seq 2 \
		--level 4 \
		--type skolni --name 'Školní kolo' \
		--ct-tasks-start "$D_SKOLNI 10:00" \
		--ct-submit-end "$D_SKOLNI 14:20" \
		--pr-tasks-start $(dt "-1 day $D_SKOLNI 7:00") \
		--pr-submit-end "$D_SKOLNI 18:00" \
		--score-successful-limit 10
	bin/create-tasks --round $YEAR-$CAT-2 --code $CAT-II-1 \
		--name 'Úloha 1' --points 6 --count 3
	bin/schedule-round-job --round $YEAR-$CAT-2 --switch-to-grading --time "$D_SKOLNI 19:00"

	bin/create-round --year $YEAR --cat $CAT --seq 3 \
		--level 1 \
		--type krajske --name 'Krajské kolo' \
		--ct-tasks-start "$D_KRAJSKE 10:00" \
		--ct-submit-end "$D_KRAJSKE 14:20" \
		--pr-tasks-start $(dt "-1 day $D_KRAJSKE 7:00") \
		--pr-submit-end "$D_KRAJSKE 18:00" \
		--publish-score
	bin/create-tasks --round $YEAR-$CAT-3 --code $CAT-III-1 \
		--name 'Úloha 1' --points 6 --count 4
	bin/create-contests $YEAR-$CAT-3
	bin/schedule-round-job --round $YEAR-$CAT-3 --switch-to-grading --time "$D_KRAJSKE 19:00"

	if [ $CAT = A ] ; then
		local D_USTREDNI_DEN1=${D[USTREDNI_PONDELI]}
		bin/create-round --year $YEAR --cat $CAT --seq 4 --part 1 \
			--level 0 \
			--type ustredni --name 'Ústřední kolo (1. den)' \
			--ct-tasks-start "$D_USTREDNI_DEN1 13:00" \
			--ct-submit-end "$D_USTREDNI_DEN1 13:00" \
			--pr-tasks-start "$D_USTREDNI_DEN1 13:00" \
			--pr-submit-end "$D_USTREDNI_DEN1 13:00" \
			--publish-score
		bin/create-tasks --round $YEAR-$CAT-4a --code $CAT-IV-1 \
			--name 'Úloha 1' --points 7 --count 3
		bin/create-contests $YEAR-$CAT-4a \
			--tex-hacks "$HACK_A_USTREDNI"

		local D_USTREDNI_DEN2=$(dd "+1 days ${D[USTREDNI_PONDELI]}")
		bin/create-round --year $YEAR --cat $CAT --seq 4 --part 2 \
			--level 0 \
			--type ustredni --name 'Ústřední kolo (2. den)' \
			--ct-tasks-start "$D_USTREDNI_DEN2 13:00" \
			--ct-submit-end "$D_USTREDNI_DEN2 13:00" \
			--pr-tasks-start "$D_USTREDNI_DEN2 13:00" \
			--pr-submit-end "$D_USTREDNI_DEN2 13:00"
		bin/create-tasks --round $YEAR-$CAT-4b --code $CAT-IV-4 \
			--name 'Úloha 4' --points 7 --count 3
		bin/create-contests $YEAR-$CAT-4b
	fi
}

create_zs()
{
	local GRADE=$1
	local CAT=Z$GRADE
	local D_START=${D[START]}
	local D_DOMACI=${D[${CAT}_DOMACI]}
	local D_OKRESNI=${D[${CAT}_OKRESNI]}
	local D_ENROLL=$(dd "+7 days $D_DOMACI")
	local L_OKRESNI=${L[${CAT}_OKRESNI]}

	bin/create-round --year $YEAR --cat $CAT --seq 1 \
		--level 4 \
		--type domaci --name 'Domácí kolo' \
		--enroll-mode register --enroll-advert "$GRADE. ročník ZŠ" \
		--min-rec-grade $GRADE --max-rec-grade $GRADE \
		--ct-tasks-start $D_START \
		--ct-submit-end "$D_DOMACI 23:59" \
		--enroll-deadline "$D_ENROLL 23:59" \
		--score-successful-limit 20 --score-advance-limit 20
	bin/create-tasks --round $YEAR-$CAT-1 --code $CAT-I-1 \
		--name 'Úloha 1' --points 6 --count 6
	bin/schedule-round-job --round $YEAR-$CAT-1 --switch-to-grading --time $(dd "+1 day $D_DOMACI")

	bin/create-round --year $YEAR --cat $CAT --seq 2 \
		--level 2 \
		--type okresni --name 'Okresní kolo' \
		--ct-tasks-start "$D_OKRESNI 10:00" \
		--ct-submit-end $(dt "$L_OKRESNI minutes $D_OKRESNI 10:20") \
		--pr-tasks-start "$D_OKRESNI 10:00" \
		--pr-submit-end "$D_OKRESNI 18:00" \
		--score-successful-limit $(if [ $CAT = Z9 ] ; then echo 12 ; else echo 9 ; fi) \
		--publish-score
	bin/create-tasks --round $YEAR-$CAT-2 --code $CAT-II-1 \
		--name 'Úloha 1' --points 6 --count $(if [ $CAT = Z9 ] ; then echo 4 ; else echo 3 ; fi)
	bin/create-contests $YEAR-$CAT-2
	bin/schedule-round-job --round $YEAR-$CAT-2 --switch-to-grading --time "$D_OKRESNI 19:00"

	if [ $CAT = Z9 ] ; then
		local D_KRAJSKE=${D[${CAT}_KRAJSKE]}
		local L_KRAJSKE=${L[${CAT}_KRAJSKE]}
		bin/create-round --year $YEAR --cat $CAT --seq 3 \
			--level 1 \
			--type krajske --name 'Krajské kolo' \
			--ct-tasks-start "$D_KRAJSKE 10:00" \
			--ct-submit-end $(dt "$L_KRAJSKE minutes $D_KRAJSKE 10:20") \
			--pr-tasks-start "$D_KRAJSKE 10:00" \
			--pr-submit-end "$D_KRAJSKE 18:00" \
			--score-successful-limit 12 \
			--publish-score
		bin/create-tasks --round $YEAR-$CAT-3 --code $CAT-III-1 \
			--name 'Úloha 1' --points 6 --count 4
		bin/create-contests $YEAR-$CAT-3
		bin/schedule-round-job --round $YEAR-$CAT-3 --switch-to-grading --time "$D_KRAJSKE 19:00"
	fi
}

create_p()
{
	local D_START=${D[START]}
	local D_DOMACI=${D[P_DOMACI]}
	local D_KRAJSKE=${D[P_KRAJSKE]}

	bin/create-round --year $YEAR --cat P --seq 1 \
		--level 1 \
		--type domaci --name 'Domácí kolo' \
		--enroll-mode register --enroll-advert "Programování" \
		--ct-tasks-start $D_START \
		--ct-submit-end "$D_DOMACI 23:59" \
		--online-submit
	bin/create-tasks --round $YEAR-P-1 --code P-I-1 \
		--name 'Úloha 1' --points 10 --type cms --count 2
	bin/create-tasks --round $YEAR-P-1 --code P-I-3 \
		--name 'Úloha 3' --points 10 --count 2
	bin/create-contests $YEAR-P-1
	bin/schedule-round-job --round $YEAR-P-1 --switch-to-grading --time $(dd "+1 day $D_DOMACI 7:00")

	bin/create-round --year $YEAR --cat P --seq 2 \
		--level 1 \
		--type krajske --name 'Krajské kolo' \
		--ct-tasks-start "$D_KRAJSKE 10:00" \
		--ct-submit-end "$D_KRAJSKE 14:20" \
		--pr-tasks-start $(dt "-1 day $D_KRAJSKE 7:00") \
		--pr-submit-end "$D_KRAJSKE 18:00"
	bin/create-tasks --round $YEAR-P-2 --code P-II-1 \
		--name 'Úloha 1' --points 10 --count 4
	bin/create-contests $YEAR-P-2
	bin/schedule-round-job --round $YEAR-P-2 --switch-to-grading --time "$D_KRAJSKE 19:00"

	local D_USTREDNI_DEN1=$(dd "+3 days ${D[USTREDNI_PONDELI]}")
	bin/create-round --year $YEAR --cat P --seq 3 --part 1 \
		--level 0 \
		--type ustredni --name 'Ústřední kolo (1. den)' \
		--ct-tasks-start "$D_USTREDNI_DEN1 13:00" \
		--ct-submit-end "$D_USTREDNI_DEN1 13:00" \
		--pr-tasks-start "$D_USTREDNI_DEN1 13:00" \
		--pr-submit-end "$D_USTREDNI_DEN1 13:00"
	bin/create-tasks --round $YEAR-P-3a --code P-III-1 \
		--name 'Úloha 1' --points 10 --count 3
	bin/create-contests $YEAR-P-3a \
		--tex-hacks "$HACK_P_USTREDNI"

	local D_USTREDNI_DEN2=$(dd "+4 days ${D[USTREDNI_PONDELI]}")
	bin/create-round --year $YEAR --cat P --seq 3 --part 2 \
		--level 0 \
		--type ustredni --name 'Ústřední kolo (2. den)' \
		--ct-tasks-start "$D_USTREDNI_DEN2 13:00" \
		--ct-submit-end "$D_USTREDNI_DEN2 13:00" \
		--pr-tasks-start "$D_USTREDNI_DEN2 13:00" \
		--pr-submit-end "$D_USTREDNI_DEN2 13:00"
	bin/create-tasks --round $YEAR-P-3b --code P-III-4 \
		--name 'Úloha 4' --points 10 --type cms --count 3
	bin/create-contests $YEAR-P-3b
}

create_ss A "3. a 4. ročník středních škol" 12 13
create_ss B "2. ročník středních škol" 11 11
create_ss C "1. ročník středních škol" 10 10

create_zs 9
create_zs 8
create_zs 7
create_zs 6
create_zs 5

create_p