-- French -------------------------------------------------------------------------------------------------------------------------------------------------------------------------


module FuzzyTime.French (showFuzzyTimeFr) where

import {-# SOURCE #-} FuzzyTime
import Prelude hiding (min)


-- showFuzzyTimeFr ----------------------------------------------------------------------------------------------------------------------------------------------------------------


showFuzzyTimeFr :: FuzzyTime -> String

-- FuzzyClock

showFuzzyTimeFr fc@(FuzzyClock _ caps _ _ _ _ _) = capsizeDef caps (showFuzzyTimeFrHlp fc)
showFuzzyTimeFr ft@(FuzzyTimer _ _) = showFuzzyTimeFrHlp ft

showFuzzyTimeFrHlp :: FuzzyTime -> String
showFuzzyTimeFrHlp fc@(FuzzyClock _ _ clock hour _ min style)
	| min == 0	= getHour hour
	| min <= 30	= getHour hour ++ " " ++ getMin min
	| min > 30	= getHour (nextFTHour fc) ++ " moins " ++ getMin (60-min)
	| otherwise	= "Oops, looks like it's " ++ show hour ++ ":" ++ show min ++ "."
	where
	getHour :: Int -> String
	getHour h
		| h `elem` [0, 24]	= if style==1 then numeralFr clock ++ getHourWord clock else "minuit"
		| h == 12			= if style==1 then numeralFr 12 else "midi"
		| otherwise			= numeralFr h ++ getHourWord h
	getHourWord :: Int -> String
	getHourWord h = if h==1 then " heure" else " heures"
	getMin :: Int -> String
	getMin m
		| min == 15			= "et quart"
		| min == 30			= "et demie"
		| min == 45			= "le quart"
		| otherwise			= numeralFr m

-- FuzzyTimer

showFuzzyTimeFrHlp (FuzzyTimer _ mins)
	| mins > 0	= "dans " ++ showHelper
	| mins == 0	= "maintenant!"
	| mins < 0	= "! il y a " ++ showHelper ++ " !"
	where
	showHelper :: String
	showHelper
		| mm > 90	= numeralFr hours ++ " heures " ++ (if half then " et demie" else "")
		| mm == 90	= "une heure et demie"
		| mm == 75	= "une heure et quart"
		| mm == 60	= "une heure"
		| mm == 45	= "trois quarts d’heure"
		| mm == 30	= "une demie d’heure"
		| mm == 15	= "un quart d’heure"
		| mm > 1	= numeralFr mm ++ " minutes"
		| mm == 1	= "une 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


-- numeralFr ----------------------------------------------------------------------------------------------------------------------------------------------------------------------


numeralFr :: Int -> String
numeralFr n
	| n < 20			= numeralFrHelper1 n
	| n `mod` 10 == 0	= numeralFrHelper10 (n `div` 10)
	| otherwise			= numeralFrHelper10 (n `div` 10) ++ "-" ++ numeralFrHelper1 (n `mod` 10)
	where
	numeralFrHelper1 :: Int -> String
	numeralFrHelper1 i = ["une", "deux", "trois", "quatre", "cinq", "six", "sept", "huit", "neuf", "dix", "onze", "douze", "treize", "quatorze", "quinze", "seize", "dix-sept", "dix-huit", "dix-neuf"] !! (i-1)
	numeralFrHelper10 :: Int -> String
	numeralFrHelper10 i = ["vingt", "trente", "quarante", "cinquante"] !! (i-2)