module Network.Skype.Parser.ChatMessage where

import Control.Applicative
import Data.Attoparsec.ByteString.Lazy
import Network.Skype.Parser.Chat
import Network.Skype.Parser.Types
import Network.Skype.Protocol.ChatMessage

chatMessageProperty :: Parser ChatMessageProperty
chatMessageProperty = choice
  [ ChatMessageTimestamp       <$> (property "TIMESTAMP" *> timestamp)
  , ChatMessageFromHandle      <$> (property "FROM_HANDLE" *> userID)
  , ChatMessageFromDisplayName <$> (property "FROM_DISPNAME" *> userDisplayName)
  , ChatMessageType            <$> (property "TYPE" *> chatMessageType)
  , ChatMessageStatus          <$> (property "STATUS" *> chatMessageStatus)
  , ChatMessageLeaveReason     <$> (property "LEAVEREASON" *> (Just <$> chatMessageLeaveReason <|> pure Nothing))
  , ChatMessageChatName        <$> (property "CHATNAME" *> chatID)
  , ChatMessageUsers           <$> (property "USERS" *> userIDs)
  , ChatMessageIsEditable      <$> (property "IS_EDITABLE" *> boolean)
  , ChatMessageEditedBy        <$> (property "EDITED_BY" *> userID)
  , ChatMessageEditedTimestamp <$> (property "EDITED_TIMESTAMP" *> timestamp)
  , ChatMessageOptions         <$> (property "OPTIONS" *> chatOptions)
  , ChatMessageRole            <$> (property "ROLE" *> chatRole)
  , ChatMessageSeen            <$  (string "SEEN" *> endOfInput)
  , ChatMessageBody            <$> (property "BODY" *> chatMessageBody)
  ]
  where
    property prop = string prop *> spaces

    userIDs = userID `sepBy` spaces

chatMessageType :: Parser ChatMessageType
chatMessageType = choice
  [ ChatMessageTypeSetTopic          <$ string "SETTOPIC"
  , ChatMessageTypeSaid              <$ string "SAID"
  , ChatMessageTypeAddedMembers      <$ string "ADDEDMEMBERS"
  , ChatMessageTypeSawMembers        <$ string "SAWMEMBERS"
  , ChatMessageTypeCreatedChatWith   <$ string "CREATEDCHATWITH"
  , ChatMessageTypeLeft              <$ string "LEFT"
  , ChatMessageTypePostedContacts    <$ string "POSTEDCONTACTS"
  , ChatMessageTypeGapInChat         <$ string "GAiN_CHAT"
  , ChatMessageTypeSetRole           <$ string "SETROLE"
  , ChatMessageTypeKicked            <$ string "KICKED"
  , ChatMessageTypeKickBanned        <$ string "KICKBANNED"
  , ChatMessageTypeSetOptions        <$ string "SETOPTIONS"
  , ChatMessageTypeSetPicture        <$ string "SETPICTURE"
  , ChatMessageTypeSetGuideLines     <$ string "SETGUIDELINES"
  , ChatMessageTypeJoinedAsApplicant <$ string "JOINEDASAPPLICANT"
  , ChatMessageTypeEmoted            <$ string "EMOTED"
  , ChatMessageTypeUnkown            <$ string "UNKNOWN"
  ]

chatMessageStatus :: Parser ChatMessageStatus
chatMessageStatus = choice
  [ ChatMessageStatusSending <$ string "SENDING"
  , ChatMessageStatusSent    <$ string "SENT"
  , ChatMessageStatusReceive <$ string "RECEIVE"
  , ChatMessageStatusRead    <$ string "READ"
  ]

chatMessageLeaveReason :: Parser ChatMessageLeaveReason
chatMessageLeaveReason = choice
  [ ChatMessageLeaveReasonUserNotFound          <$ string "USER_NOT_FOUND"
  , ChatMessageLeaveReasonUserIncapable         <$ string "USER_INCAPABLE"
  , ChatMessageLeaveReasonAdderMustBeFriend     <$ string "ADDER_MUST_BE_FRIEND"
  , ChatMessageLeaveReasonAdderMustBeAuthorized <$ string "ADDED_MUST_BE_AUTHORIZED"
  , ChatMessageLeaveReasonUnsubscribe           <$ string "UNSUBSCRIBE"
  ]