{-# LANGUAGE DeriveDataTypeable #-}
{-|
Module      : Network.EAP.Types
Description : Provides types and definitions for EAP as per RFC 3748
Copyright   : (c) Erick Gonzalez, 2017
License     : BSD3
Maintainer  : erick@codemonkeylabs.de
Stability   : experimental
Portability : POSIX

The types in this module are pretty much self explanatory. See RFC 3748 for further information
on what a given type or definition means.

-}
module Network.EAP.Types where

import Data.ByteString.Lazy.Char8        (ByteString)
import Data.Data                         (Data)
import Data.Word                         (Word8)

data Packet = Packet { getPacketType    :: PacketType,
                       getPacketId      :: Word8,
                       getPacketMessage :: Maybe Message }
            deriving (Show, Eq, Data)

data PacketType = RequestPacket
                | ResponsePacket
                | SuccessPacket
                | FailurePacket
                  deriving (Show, Eq, Data)

instance Enum PacketType where
    toEnum 1 = RequestPacket
    toEnum 2 = ResponsePacket
    toEnum 3 = SuccessPacket
    toEnum 4 = FailurePacket
    toEnum n = error $ "Invalid EAP packet type " ++ show n
    fromEnum RequestPacket  = 1
    fromEnum ResponsePacket = 2
    fromEnum SuccessPacket  = 3
    fromEnum FailurePacket  = 4

data Message = IdentityMessage         { getIdentityMessage         :: ByteString }
             | NotificationMessage     { getNotificationMessage     :: ByteString }
             | NakMessage              { getAuthenticationType      :: Word8 }
             | MD5ChallengeMessage     { getMD5ChallengeValue       :: ByteString,
                                         getMD5ChallengeName        :: ByteString }
             | OTPMessage              { getOTPMessage              :: ByteString }
             | GenericTokenCardMessage { getGenericTokenCardMessage :: ByteString }
               deriving (Show, Eq, Data)