-- Turkish ------------------------------------------------------------------------------------------------------------------------------------------------------------------------


module FuzzyTime.Turkish (showFuzzyTimeTr) where

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


-- showFuzzyTimeTr ----------------------------------------------------------------------------------------------------------------------------------------------------------------


showFuzzyTimeTr :: FuzzyTime -> String

-- FuzzyClock

showFuzzyTimeTr fc@(FuzzyClock _ caps _ _ _ _ _) = capsizeDef caps (showFuzzyTimeTrHlp fc)
showFuzzyTimeTr ft@(FuzzyTimer _ _) = showFuzzyTimeTrHlp ft

showFuzzyTimeTrHlp :: FuzzyTime -> String
showFuzzyTimeTrHlp ft@(FuzzyClock _ _ clock hour _ min style)
	| min == 0			= "saat " ++ getHour Nom hour
	| min `elem` [20..29]
		&& style == 2	= getHour Nom hour ++ " buçuğa " ++ getMin (30-min) ++ " var"
	| min < 30			= getHour Acc hour ++ " " ++ getMin min ++ " geçiyor"
	| min == 30			= if hour `mod` 12 == 0 then "saat yarım" else getHour Nom hour ++ " buçuk"
	| min `elem` [31..40]
		&& style == 2	= getHour Nom hour ++ " buçuğu " ++ getMin (min-30) ++ " geçiyor"
	| min > 30			= getHour Dat (nextFTHour ft) ++ " " ++ getMin (60-min) ++ " var"
	| otherwise			= "Oops, looks like it's " ++ show hour ++ ":" ++ show min ++ "."
	where
	getHour :: Case -> Int -> String
	getHour c h
		| h `mod` 12 == 0	= if clock==12 then numeralTr c 12 else numeralTr c h
		| otherwise			= numeralTr c h
	getMin :: Int -> String
	getMin m
		| m `elem` [15, 45]	= "çeyrek"
		| otherwise			= numeralTr Nom m

-- FuzzyTimer

showFuzzyTimeTrHlp (FuzzyTimer _ mins)
	| mins > 0	= showHelper ++ " sonra"
	| mins == 0	= "şimdi!"
	| mins < 0	= "! " ++ showHelper ++ " önce !"
	where
	showHelper :: String
	showHelper
		| mm > 75	= numeralTr Nom hours ++ (if half then " buçuk" else "") ++ " saat"
		| mm == 75	= "bir saat çeyrek"
		| mm == 60	= "bir saat"
		| mm == 45	= "üç çeyrek"
		| mm == 30	= "yarım saat"
		| mm == 15	= "bir çeyrek"
		| mm >= 1	= numeralTr Nom mm ++ " dakika"
		| 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


-- numeralTr ----------------------------------------------------------------------------------------------------------------------------------------------------------------------


data Case = Nom | Dat | Acc


numeralTr :: Case -> Int -> String
numeralTr c n
	| n < 10			= numeralTrHelper1 c n
	| n `mod` 10 == 0	= numeralTrHelper10 c (n `div` 10)
	| otherwise			= numeralTrHelper10 Nom (n `div` 10) ++ " " ++ numeralTrHelper1 c (n `mod` 10)
	where
	numeralTrHelper1 :: Case -> Int -> String
	numeralTrHelper1 Nom i = ["bir", "iki", "üç", "dört", "beş", "altı", "yedi", "sekiz", "dokuz"] !! (i-1)
	numeralTrHelper1 Dat i = ["bire", "ikiye", "üçe", "dörde", "beşe", "altıya", "yediye", "sekize", "dokuza"] !! (i-1)
	numeralTrHelper1 Acc i = ["biri", "ikiyi", "üçü", "dördü", "beşi", "altıyı", "yediyi", "sekizi", "dokuzu"] !! (i-1)
	numeralTrHelper10 :: Case -> Int -> String
	numeralTrHelper10 Nom i = ["on", "yirmi", "otuz", "kırk", "elli"] !! (i-1)
	numeralTrHelper10 Dat i = ["ona", "yirmiye", "otuza", "kırka", "elliye"] !! (i-1)
	numeralTrHelper10 Acc i = ["onu", "yirmiyi", "otuzu", "kırkı", "elliyi"] !! (i-1)