module Text.Han2Zen
    ( han2zen
    , han2zenSafe
    , han2zenSafe'
    ) where

import Data.Maybe

-- | テキスト内の半角カタカナを全角にに変える
han2zen :: String -> String
han2zen x = map hanKanaToZenKana' (chars x)

hanKanaToZenKana' :: String -> Char
hanKanaToZenKana' x = either (error $ "Syntax Error: " ++ x) id $ hanKanaToZenKana x

han2zenSafe :: String -> Either String String
han2zenSafe x = mapM hanKanaToZenKana (chars x)

han2zenSafe' :: String -> [Either String Char]
han2zenSafe' x = map hanKanaToZenKana (chars x)

-- | 半角の濁点の有無で文字ごとに分ける
chars :: String -> [String]
chars [] = []
chars [x] = [[x]]
chars txt
  | isDakuten (txt !! 1) = take 2 txt : chars (drop 2 txt)
  | otherwise            = take 1 txt : chars (drop 1 txt)

-- | 濁点または半濁点を判別する
isDakuten :: Char -> Bool
isDakuten '゙' = True
isDakuten '゚' = True
isDakuten _   = False

-- | 半角を全角文字に
hanKanaToZenKana :: String -> Either String Char
hanKanaToZenKana "。" = Right '。'
hanKanaToZenKana "「" = Right '「'
hanKanaToZenKana "」" = Right '」'
hanKanaToZenKana "、" = Right '、'
hanKanaToZenKana "・" = Right '・'
hanKanaToZenKana "ヲ" = Right 'ヲ'
hanKanaToZenKana "ァ" = Right 'ァ'
hanKanaToZenKana "ィ" = Right 'ィ'
hanKanaToZenKana "ゥ" = Right 'ゥ'
hanKanaToZenKana "ェ" = Right 'ェ'
hanKanaToZenKana "ォ" = Right 'ォ'
hanKanaToZenKana "ャ" = Right 'ャ'
hanKanaToZenKana "ュ" = Right 'ュ'
hanKanaToZenKana "ョ" = Right 'ョ'
hanKanaToZenKana "ッ" = Right 'ッ'
hanKanaToZenKana "ー" = Right 'ー'
hanKanaToZenKana "ア" = Right 'ア'
hanKanaToZenKana "イ" = Right 'イ'
hanKanaToZenKana "ウ" = Right 'ウ'
hanKanaToZenKana "エ" = Right 'エ'
hanKanaToZenKana "オ" = Right 'オ'
hanKanaToZenKana "カ" = Right 'カ'
hanKanaToZenKana "キ" = Right 'キ'
hanKanaToZenKana "ク" = Right 'ク'
hanKanaToZenKana "ケ" = Right 'ケ'
hanKanaToZenKana "コ" = Right 'コ'
hanKanaToZenKana "サ" = Right 'サ'
hanKanaToZenKana "シ" = Right 'シ'
hanKanaToZenKana "ス" = Right 'ス'
hanKanaToZenKana "セ" = Right 'セ'
hanKanaToZenKana "ソ" = Right 'ソ'
hanKanaToZenKana "タ" = Right 'タ'
hanKanaToZenKana "チ" = Right 'チ'
hanKanaToZenKana "ツ" = Right 'ツ'
hanKanaToZenKana "テ" = Right 'テ'
hanKanaToZenKana "ト" = Right 'ト'
hanKanaToZenKana "ナ" = Right 'ナ'
hanKanaToZenKana "ニ" = Right 'ニ'
hanKanaToZenKana "ヌ" = Right 'ヌ'
hanKanaToZenKana "ネ" = Right 'ネ'
hanKanaToZenKana "ノ" = Right 'ノ'
hanKanaToZenKana "ハ" = Right 'ハ'
hanKanaToZenKana "ヒ" = Right 'ヒ'
hanKanaToZenKana "フ" = Right 'フ'
hanKanaToZenKana "ヘ" = Right 'ヘ'
hanKanaToZenKana "ホ" = Right 'ホ'
hanKanaToZenKana "マ" = Right 'マ'
hanKanaToZenKana "ミ" = Right 'ミ'
hanKanaToZenKana "ム" = Right 'ム'
hanKanaToZenKana "メ" = Right 'メ'
hanKanaToZenKana "モ" = Right 'モ'
hanKanaToZenKana "ヤ" = Right 'ヤ'
hanKanaToZenKana "ユ" = Right 'ユ'
hanKanaToZenKana "ヨ" = Right 'ヨ'
hanKanaToZenKana "ラ" = Right 'ラ'
hanKanaToZenKana "リ" = Right 'リ'
hanKanaToZenKana "ル" = Right 'ル'
hanKanaToZenKana "レ" = Right 'レ'
hanKanaToZenKana "ロ" = Right 'ロ'
hanKanaToZenKana "ワ" = Right 'ワ'
hanKanaToZenKana "ン" = Right 'ン'
hanKanaToZenKana "゙" = Right '゛' -- これいる?
hanKanaToZenKana "゚" = Right '゜' -- これいる?
hanKanaToZenKana "ガ" = Right 'ガ'
hanKanaToZenKana "ギ" = Right 'ギ'
hanKanaToZenKana "グ" = Right 'グ'
hanKanaToZenKana "ゲ" = Right 'ゲ'
hanKanaToZenKana "ゴ" = Right 'ゴ'
hanKanaToZenKana "ザ" = Right 'ザ'
hanKanaToZenKana "ジ" = Right 'ジ'
hanKanaToZenKana "ズ" = Right 'ズ'
hanKanaToZenKana "ゼ" = Right 'ゼ'
hanKanaToZenKana "ゾ" = Right 'ゾ'
hanKanaToZenKana "ダ" = Right 'ダ'
hanKanaToZenKana "ヂ" = Right 'ヂ'
hanKanaToZenKana "ヅ" = Right 'ヅ'
hanKanaToZenKana "デ" = Right 'デ'
hanKanaToZenKana "ド" = Right 'ド'
hanKanaToZenKana "バ" = Right 'バ'
hanKanaToZenKana "ビ" = Right 'ビ'
hanKanaToZenKana "ブ" = Right 'ブ'
hanKanaToZenKana "ベ" = Right 'ベ'
hanKanaToZenKana "ボ" = Right 'ボ'
hanKanaToZenKana "パ" = Right 'パ'
hanKanaToZenKana "ピ" = Right 'ピ'
hanKanaToZenKana "プ" = Right 'プ'
hanKanaToZenKana "ペ" = Right 'ペ'
hanKanaToZenKana "ポ" = Right 'ポ'
hanKanaToZenKana "ヴ" = Right 'ヴ'
hanKanaToZenKana [c] = Right c
hanKanaToZenKana xs = Left xs

hanKana :: String
hanKana = "。「」、・ヲァィゥェォャュョッーアイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワン゙゚"

zenKana :: String
zenKana = "。「」、・ヲァィゥェォャュョッーアイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワン゛゜"

daku :: String
daku = "カキクケコサシスセソタチツテトハヒフヘホ"

dakuzen :: String
dakuzen = "ガギグゲゴザジズゼゾダヂヅデドバビブベボ"

handaku :: String
handaku = "ハヒフヘホ"

handakuzen :: String
handakuzen = "パピプペポ"