/*
* Copyright (c) 2013 by Gerrit Grunwald
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package eu.hansolo.enzo.qlocktwo;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ConcurrentHashMap;
/**
* Created by
* User: hansolo
* Date: 27.02.13
* Time: 15:44
*/
public class QlockGerman implements Qlock {
private static final QlockTwo.Language LANGUAGE = QlockTwo.Language.GERMAN;
private static final String[][] MATRIX = {
{"E", "S", "K", "I", "S", "T", "A", "F", "Ü", "N", "F"},
{"Z", "E", "H", "N", "Z", "W", "A", "N", "Z", "I", "G"},
{"D", "R", "E", "I", "V", "I", "E", "R", "T", "E", "L"},
{"V", "O", "R", "F", "U", "N", "K", "N", "A", "C", "H"},
{"H", "A", "L", "B", "A", "E", "L", "F", "Ü", "N", "F"},
{"E", "I", "N", "S", "X", "Ä", "M", "Z", "W", "E", "I"},
{"D", "R", "E", "I", "A", "U", "I", "V", "I", "E", "R"},
{"S", "E", "C", "H", "S", "N", "L", "A", "C", "H", "T"},
{"S", "I", "E", "B", "E", "N", "Z", "W", "Ö", "L", "F"},
{"Z", "E", "H", "N", "E", "U", "N", "K", "U", "H", "R"}
};
private final ConcurrentHashMap<Integer, String> LOOKUP;
private List<QlockWord> timeList;
public QlockGerman() {
LOOKUP = new ConcurrentHashMap<>();
LOOKUP.putAll(QlockTwo.Language.GERMAN.getLookup());
timeList = new ArrayList<>(10);
}
@Override public String[][] getMatrix() {
return MATRIX;
}
@Override public List<QlockWord> getTime(int minute, int hour) {
if (hour > 12) {
hour -= 12;
}
if (hour <= 0) {
hour += 12;
}
if (minute > 60) {
minute -= 60;
hour++;
}
if (minute < 0) {
minute += 60;
hour--;
}
minute -= minute%5;
timeList.clear();
timeList.add(QlockLanguage.ES);
timeList.add(QlockLanguage.IST);
switch (minute) {
case 0:
if (10 == hour) {
timeList.add(QlockLanguage.ZEHN1);
} else if (1 == hour) {
timeList.add(QlockLanguage.EIN);
} else {
timeList.add(QlockLanguage.valueOf(LOOKUP.get(hour)));
}
timeList.add(QlockLanguage.UHR);
break;
case 5:
timeList.add(QlockLanguage.FÜNF1);
timeList.add(QlockLanguage.NACH);
if (10 == hour) {
timeList.add(QlockLanguage.ZEHN1);
} else if (3 == hour) {
timeList.add(QlockLanguage.DREI1);
} else {
timeList.add(QlockLanguage.valueOf(LOOKUP.get(hour)));
}
break;
case 10:
timeList.add(QlockLanguage.ZEHN);
timeList.add(QlockLanguage.NACH);
if (10 == hour) {
timeList.add(QlockLanguage.ZEHN1);
} else if (3 == hour) {
timeList.add(QlockLanguage.DREI1);
} else {
timeList.add(QlockLanguage.valueOf(LOOKUP.get(hour)));
}
break;
case 15:
timeList.add(QlockLanguage.VIERTEL);
timeList.add(QlockLanguage.NACH);
if (10 == hour) {
timeList.add(QlockLanguage.ZEHN1);
} else if (3 == hour) {
timeList.add(QlockLanguage.DREI1);
} else {
timeList.add(QlockLanguage.valueOf(LOOKUP.get(hour)));
}
break;
case 20:
timeList.add(QlockLanguage.ZWANZIG);
timeList.add(QlockLanguage.NACH);
if (10 == hour) {
timeList.add(QlockLanguage.ZEHN1);
} else if (3 == hour) {
timeList.add(QlockLanguage.DREI1);
} else {
timeList.add(QlockLanguage.valueOf(LOOKUP.get(hour)));
}
break;
case 25:
timeList.add(QlockLanguage.FÜNF1);
timeList.add(QlockLanguage.VOR);
if (9 == hour) {
timeList.add(QlockLanguage.ZEHN1);
} else if (2 == hour) {
timeList.add(QlockLanguage.DREI1);
} else {
timeList.add(QlockLanguage.HALB);
}
addHour(timeList, hour);
break;
case 30:
timeList.add(QlockLanguage.HALB);
addHour(timeList, hour);
break;
case 35:
timeList.add(QlockLanguage.FÜNF1);
timeList.add(QlockLanguage.NACH);
timeList.add(QlockLanguage.HALB);
addHour(timeList, hour);
break;
case 40:
timeList.add(QlockLanguage.ZWANZIG);
timeList.add(QlockLanguage.VOR);
addHour(timeList, hour);
break;
case 45:
timeList.add(QlockLanguage.VIERTEL);
timeList.add(QlockLanguage.VOR);
addHour(timeList, hour);
break;
case 50:
timeList.add(QlockLanguage.ZEHN);
timeList.add(QlockLanguage.VOR);
addHour(timeList, hour);
break;
case 55:
timeList.add(QlockLanguage.FÜNF1);
timeList.add(QlockLanguage.VOR);
addHour(timeList, hour);
break;
}
return timeList;
}
@Override public QlockTwo.Language getLanguage() {
return LANGUAGE;
}
private void addHour(List<QlockWord> timeList, final int HOUR) {
if (HOUR == 12) {
timeList.add(QlockLanguage.EINS);
} else {
if (HOUR + 1 == 5) {
timeList.add(QlockLanguage.FÜNF2);
} else if (HOUR + 1 == 10) {
timeList.add(QlockLanguage.ZEHN1);
} else if (HOUR + 1 == 3) {
timeList.add(QlockLanguage.DREI1);
} else {
timeList.add(QlockLanguage.valueOf(LOOKUP.get(HOUR + 1)));
}
}
}
private enum QlockLanguage implements QlockWord {
EIN(5, 0, 2),
EINS(5, 0, 3),
ZWEI(5, 7, 10),
DREI(2, 0, 3),
DREI1(6, 0, 3),
VIER(6, 7, 10),
FÜNF(4, 7, 10),
FÜNF1(0, 7, 10),
FÜNF2(4, 7, 10),
SECHS(7, 0, 4),
SIEBEN(8, 0, 5),
ACHT(7, 7, 10),
NEUN(9, 3, 6),
ZEHN(1, 0, 3),
ZEHN1(9, 0, 3),
ELF(4, 5, 7),
ZWÖLF(8, 6, 10),
ES(0, 0, 1),
IST(0, 3, 5),
VOR(3, 0, 2),
NACH(3, 7, 10),
VIERTEL(2, 4, 10),
DREIVIERTEL(2, 0, 10),
HALB(4, 0, 3),
ZWANZIG(1, 4, 10),
UHR(9, 8, 10);
private final int ROW;
private final int START;
private final int STOP;
private QlockLanguage(final int ROW, final int START, final int STOP) {
this.ROW = ROW;
this.START = START;
this.STOP = STOP;
}
@Override public int getRow() {
return ROW;
}
@Override public int getStart() {
return START;
}
@Override public int getStop() {
return STOP;
}
}
}