module FuzzyTime.German (showFuzzyTimeDe) where
import FuzzyTime
import Prelude hiding (min)
showFuzzyTimeDe :: FuzzyTime -> String
showFuzzyTimeDe fc@(FuzzyClock _ caps _ _ _ _ _) = capsizeDef caps (showFuzzyTimeDeHlp fc)
showFuzzyTimeDe ft@(FuzzyTimer _ _) = showFuzzyTimeDeHlp ft
showFuzzyTimeDeHlp :: FuzzyTime -> String
showFuzzyTimeDeHlp fc@(FuzzyClock _ _ clock hour _ min style)
| min == 0 = if getHour hour `elem` ["Mitternacht", "Mittag"] then getHour hour else getHour hour ++ " Uhr"
| min == 15
&& style == 3 = "Viertel " ++ getHour (nextFTHour fc)
| min `elem` [23..29]
&& style >= 2 = getMin (30min) ++ " vor halb " ++ getHour (nextFTHour fc)
| min < 30 = getMin min ++ " nach " ++ getHour hour
| min `elem` [31..37]
&& style >= 2 = getMin (min30) ++ " nach halb " ++ getHour (nextFTHour fc)
| min == 30 = "halb " ++ getHour (nextFTHour fc)
| min == 45
&& style == 3 = "Dreiviertel " ++ getHour (nextFTHour fc)
| min > 30 = getMin (60min) ++ " vor " ++ getHour (nextFTHour fc)
| otherwise = "Oops, looks like it's " ++ show hour ++ ":" ++ show min ++ "."
where
getHour :: Int -> String
getHour h
| h `elem` [0, 24] = if style==1 then
numeralDe clock
else
if min /=30 then "Mitternacht" else numeralDe clock
| otherwise = numeralDe h
getMin :: Int -> String
getMin m
| m `elem` [15, 45] = "Viertel"
| otherwise = numeralDe m
showFuzzyTimeDeHlp (FuzzyTimer _ mins)
| mins > 0 = "in " ++ showHelper
| mins == 0 = "jetzt!"
| mins < 0 = "! vor " ++ showHelper ++ " !"
where
showHelper :: String
showHelper
| mm >= 90 = numeralDe hours ++ (if half then "einhalb" else "") ++ " Stunden"
| mm == 75 = "einer Stunde und fünfzehn Minuten"
| mm == 60 = "einer Stunde"
| mm == 45 = "einer Dreiviertelstunde"
| mm == 30 = "eine halbe Stunde"
| mm == 15 = "einer ViertelStunde"
| mm > 1 = numeralDe mm ++ " Minuten"
| mm == 1 = "einer Minute"
| otherwise = "Oops, it looks like there's " ++ show mins ++ " left."
hours :: Int
hours = round $ (fromIntegral mm :: Float) / 60
mm :: Int
mm = abs mins
half :: Bool
half = mm `mod` 60 == 30
numeralDe :: Int -> String
numeralDe n
| n < 20 = numeralDeHelper1 n
| n `mod` 10 == 0 = numeralDeHelper10 (n `div` 10)
| otherwise = numeralDeHelper1 (n `mod` 10) ++ "und" ++ numeralDeHelper10 (n `div` 10)
where
numeralDeHelper1 :: Int -> String
numeralDeHelper1 i = ["ein", "zwei", "drei", "vier", "fünf", "sechs", "sieben", "acht", "neun", "zehn", "elf", "zwőlf", "dreizehn", "vierzehn", "fünfzehn", "sechzehn", "siebzehn", "achtzehn", "neunzehn"] !! (i1)
numeralDeHelper10 :: Int -> String
numeralDeHelper10 i = ["zwanzig", "dreissig", "vierzig", "fünfzig"] !! (i2)