-- Norwegian (Bokmål) (thanks arnvidr from forums.gentoo.org) ---------------------------------------------------------------------------------------------------------------------


module FuzzyTime.Norwegian (showFuzzyTimeNb) where

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


-- showFuzzyTimeNb ----------------------------------------------------------------------------------------------------------------------------------------------------------------


showFuzzyTimeNb :: FuzzyTime -> String

-- FuzzyClock

showFuzzyTimeNb fc@(FuzzyClock _ caps _ _ _ _ _) = capsizeDef caps (showFuzzyTimeNbHlp fc)
showFuzzyTimeNb ft@(FuzzyTimer _ _) = showFuzzyTimeNbHlp ft

showFuzzyTimeNbHlp :: FuzzyTime -> String
showFuzzyTimeNbHlp fc@(FuzzyClock _ _ clock hour _ min style)
	| min == 0				= getHour hour
	| min `elem` [20..29]	= getMin (30-min) ++ " på halv " ++ getHour (nextFTHour fc)
	| min < 30				= getMin min ++ " over " ++ getHour hour
	| min `elem` [31..40]	= getMin (min-30) ++ " over halv " ++ getHour (nextFTHour fc)
	| min == 30				= "halv " ++ getHour (nextFTHour fc)
	| min > 30				= getMin (60-min) ++ " på " ++ 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 numeralNb clock else "midnatt"
		| otherwise			= numeralNb h
	getMin :: Int -> String
	getMin m
		| m `elem` [15, 45]	= "kvart"
		| otherwise 		= numeralNb m

-- FuzzyTimer

showFuzzyTimeNbHlp (FuzzyTimer _ mins)
	| mins > 0	= "om " ++ showHelper
	| mins == 0	= "nå!"
	| mins < 0	= "! for " ++ showHelper ++ " siden !"
	where
	showHelper :: String
	showHelper
		| mm > 90	= numeralNb hours ++ (if half then " og en halv" else "") ++ " time"
		| mm == 90	= "halvannen time"
		| mm == 75	= "en time og ett kvarter"
		| mm == 60	= "en time"
		| mm == 45	= "tre kvarter"
		| mm == 30	= "halv time"
		| mm == 15	= "en kvarter"
		| mm > 1	= numeralNb mm ++ " minutter"
		| mm == 1	= "en minutt"
		| 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


-- numeralDa ----------------------------------------------------------------------------------------------------------------------------------------------------------------------


numeralNb :: Int -> String
numeralNb n
	| n < 20			= numeralNbHelper1 n
	| n `mod` 10 == 0	= numeralNbHelper10 (n `div` 10)
	| otherwise			= numeralNbHelper10 (n `div` 10) ++ " " ++ numeralNbHelper1 (n `mod` 10)
	where
	numeralNbHelper1 :: Int -> String
	numeralNbHelper1 i = ["en", "to", "tre", "fire", "fem", "seks", "sju", "åtte", "ni", "ti", "elleve", "tolv", "tretten", "fjorten", "femten", "seksten", "sytten", "atten", "nitten"] !! (i-1)
	numeralNbHelper10 :: Int -> String
	numeralNbHelper10 i = ["tjue", "tretti", "førti", "femti"] !! (i-2)