module Text.SortByPinyin 

(
  pinyin_char_map
, show_pinyin
, compare_chinese_char_by_pinyin
, compare_chinese_string_by_pinyin
)


where

import Air.Env
import Prelude ()
import Air.TH
import Air.Extra

import qualified Data.Char as Char

import qualified Data.Text.Read as Text.Read
import qualified Data.Text as Text

import qualified Data.ByteString.Char8 as StrictByteString

import qualified Data.Map as Map

import Text.SortByPinyinData (sort_by_pinyin_data)

pinyin_data = sort_by_pinyin_data

pinyins = pinyin_data.lines.reject (starts_with "#")


pinyin_char_map :: Map.Map Char String
pinyin_char_map = 
  pinyins
    .map (split "\t")
    .map (take 2)
    .reject (length > is_not 2)
    .map (\(x:y:_) -> (x,y))
    .map_fst hex_to_char
    .concatMap (\(x,y) -> 
              case x of 
                Nothing -> []
                Just x' -> [(x',y)]
                )
    .to_h

hex_to_char :: String -> Maybe Char
hex_to_char x = 
  case Text.Read.hexadecimal (Text.pack x) of
    Left _ -> Nothing
    Right (int_value,_) -> Just - Char.chr int_value

show_pinyin :: Char -> Maybe String
show_pinyin x = pinyin_char_map.Map.lookup x

compare_chinese_char_by_pinyin :: Char -> Char -> Ordering
compare_chinese_char_by_pinyin x y =
  let x_pinyin = show_pinyin x
      y_pinyin = show_pinyin y
  in
  
  case x_pinyin of
    Nothing -> compare x y
    Just x_pinyin_string ->
      case y_pinyin of
        Nothing -> compare x y
        Just y_pinyin_string ->
          compare x_pinyin_string y_pinyin_string


compare_chinese_string_by_pinyin :: String -> String -> Ordering
compare_chinese_string_by_pinyin [] ys = LT
compare_chinese_string_by_pinyin xs [] = GT
compare_chinese_string_by_pinyin (x:xs) (y:ys) = 
  case compare_chinese_char_by_pinyin x y of
    EQ -> compare_chinese_string_by_pinyin xs ys
    LT -> LT
    GT -> GT