module Network.IRC.Bot.Part.NickUser where

import Control.Monad.Trans        (liftIO)
import Data.ByteString            (ByteString)
import Data.ByteString.Char8      (pack, unpack)
import Data.Monoid                ((<>))
import Network.IRC.Bot.BotMonad   (BotMonad(..) )
import Network.IRC.Bot.Types      (User(..))
import Network.IRC.Bot.ErrorCodes
import Network.IRC.Bot.Log        (LogLevel(..))
-- import Network.IRC.Bot.Commands (Ping(..), Pong(..), ping, sendCommand)
import           Network.IRC      (Message(..), showMessage)
import qualified Network.IRC      as IRC
import System.Random              (randomRIO)

nickUserPart :: (BotMonad m) => m ()
nickUserPart =
  do msg <- askMessage
     let cmd = msg_command msg
     case () of
       () | cmd == noNicknameGiven  -> logM Important (showMessage msg)
          | cmd == erroneusNickname -> logM Important (showMessage msg)
          | cmd == nickCollision    -> logM Important (showMessage msg)
          | cmd == nicknameInUse    ->
              do logM Important (showMessage msg)
                 n <- whoami
                 i <- liftIO $ randomRIO (1, 100 :: Int)
                 changeNickUser (n <> pack (show i)) Nothing
          | otherwise -> return ()

changeNickUser :: (BotMonad m) => ByteString -> Maybe User -> m ()
changeNickUser n mUser =
    do sendMessage (IRC.nick n)
       case mUser of
         Nothing -> return ()
         (Just u) ->
             sendMessage (IRC.user (username u) (pack $ hostname u) (pack $ servername u) (realname u))