{-# LANGUAGE ScopedTypeVariables, OverloadedStrings #-}

-- | Parsing of HET records.
module Bio.PDB.EventParser.ParseHET(parseHET)
where

import Prelude hiding(String)
import qualified Data.ByteString.Char8 as BS

import Bio.PDB.EventParser.PDBEvents
import Bio.PDB.EventParser.PDBParsingAbstractions


--------------- {{{ HET/HETSYN records
{--
COLUMNS       DATA  TYPE     FIELD         DEFINITION
---------------------------------------------------------------------------------
 1 -  6       Record name   "HET   "
 8 - 10       LString(3)    hetID          Het identifier, right-justified.
13            Character     ChainID        Chain  identifier.
14 - 17       Integer       seqNum         Sequence  number.
18            AChar         iCode          Insertion  code.
21 - 25       Integer       numHetAtoms    Number of HETATM records for the group
                                           present in the entry.
31 - 70       String        text           Text describing Het group.
--}

{-# INLINE hetFields #-}
hetFields = [(6,  mKeyword "record header"     "HET   "            ),
             (7,  mSpc     1                                       ),
             (10, mStr     "hetero group identifier"               ),
             (12, mSpc     2                                       ),
             (13, mChr     "chain identifier"                      ),
             (17, mInt     "sequence number"                       ),
             (18, mChr     "insertion code"                        ),
             (20, mSpc     2                                       ),
             (25, mInt     "number of HETATM records per group"    ),
             (30, pSpc                                             ),
             (70, pStr     "text describing HET group"             )]

-- | Parses a HET record.
--
-- Arguments:
--
-- (1) input line
--
-- (2) input line number
--
-- Result is a monad action returning a list of 'PDBEvent's.
parseHET ::  (Monad m) => String -> Int -> m [PDBEvent]
parseHET line line_no = return $ if null errs
                                   then [result]
                                   else errs
  where
    -- parse
    (fields, errs) = parseFields hetFields line line_no
    [fRec, _, fHetId, _, fChain, fSeqNum, fInsCode, _, fAtmNum, _, fText] = fields
    IFStr  hetId   = fHetId
    IFChar chain   = fChain
    IFInt  seqNum  = fSeqNum
    IFChar insCode = fInsCode
    IFInt  atmNum  = fAtmNum
    IFStr  text    = fText

    -- unpack fields
    result = HET hetId chain seqNum insCode atmNum text

--------------- }}} HET/HETSYN records