-- Japanese (petersen at fedoraproject.org) ------------------------------------------------------------------------------------------------------------------------------------------------------------------------


module FuzzyTime.Japanese (showFuzzyTimeJa) where

import {-# SOURCE #-} FuzzyTime
import Data.Char (toLower, toUpper)
import Data.List (intersperse)
import Prelude hiding (min)


-- showFuzzyTimeJa ----------------------------------------------------------------------------------------------------------------------------------------------------------------


showFuzzyTimeJa :: FuzzyTime -> String

-- FuzzyClock

showFuzzyTimeJa fc@(FuzzyClock am _ clock hour _ min style)
	| min == 0	= getHour hour ++ "時"
	| min < 45	= getHour hour ++ "時" ++ getMin min ++ ""
	| min >= 45	= getHour (nextFTHour fc) ++ "時" ++ getMin (60-min) ++ "前"
	| otherwise	= "あら、" ++ show hour ++ "時" ++ show min ++ "分です"
	where
	getHour :: Int -> String
	getHour h
		| h `elem` [0, 24]	= if style==1 then numeralJa clock else "零時"
		| h == 12		= if style==1 then numeralJa 12 else "正午"
		| otherwise		= numeralJa h
	getMin :: Int -> String
	getMin m
		| m == 30		= "半"
		| otherwise		= numeralJa m ++ "分"

-- FuzzyTimer

showFuzzyTimeJa (FuzzyTimer _ mins)
	| mins > 0	= "後 " ++ showHelper
	| mins == 0	= "今です!"
	| mins < 0	= "! " ++ showHelper ++ "前!"
	where
	showHelper :: String
	showHelper
		| mm > 90	= numeralJa hours ++ "時間" ++ (if half then "半" else "")
		| mm == 90	= "一時間半"
		| mm == 75	= "一時間十五分"
		| mm == 60	= "一時間"
		| mm == 45	= "四十五分"
		| mm == 30	= "三十分"
		| mm == 15	= "十五分"
		| mm >= 1	= numeralJa mm ++ "分"
		| otherwise	= "あら、残り " ++ show mins ++ "分"
	hours :: Int
	hours = round $ (fromIntegral mm :: Float) / 60
	mm :: Int
	mm = abs mins
	half :: Bool
	half = mm `mod` 60 == 30


-- numeralJa ----------------------------------------------------------------------------------------------------------------------------------------------------------------------


numeralJa :: Int -> String
numeralJa n
	| n < 20			= numeralJaHelper1 n
	| n `mod` 10 == 0	= numeralJaHelper10 (n `div` 10)
	| otherwise			= numeralJaHelper10 (n `div` 10) ++ numeralJaHelper1 (n `mod` 10)
	where
	numeralJaHelper1 :: Int -> String
	numeralJaHelper1 i = ["一", "二", "三", "四", "五", "六", "七", "八", "九", "十", "十一", "十二", "十三", "十四", "十五", "十六", "十七", "十八", "十九"] !! (i-1)
	numeralJaHelper10 :: Int -> String
	numeralJaHelper10 i = ["二十", "三十", "四十", "五十"] !! (i-2)