{-# LANGUAGE DeriveDataTypeable    #-}
{-# LANGUAGE DeriveGeneric         #-}
{-# LANGUAGE FlexibleContexts      #-}
{-# LANGUAGE FlexibleInstances     #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE OverloadedStrings     #-}
{-# LANGUAGE StrictData            #-}
{-# LANGUAGE TypeFamilies          #-}

-- |
-- Module      :  Data.BAM.Version1_6.BGZFBlock
-- Copyright   :  (c) Matthew Mosior 2024
-- License     :  BSD-style
-- Maintainer  :  mattm.github@gmail.com
-- Portability :  portable
--
-- = Description
--
-- This library enables the decoding/encoding of SAM, BAM and CRAM file formats.

module Data.BAM.Version1_6.BGZFBlock ( -- * BAM_V1_6_BGZFBlock version 1.6 data type
                                       BAM_V1_6_BGZFBlock(..)
                                     ) where

import Data.BAM.Version1_6.BAM
import Data.BAM.Version1_6.GZipHeader

import Data.Data
import Data.Word
import Generics.Deriving.Base

-- | Custom @"BAM_V1_6_BGZFBlock"@ (BAM version 1.6) data type.
--
-- See the [SAM v1.6](http://samtools.github.io/hts-specs/SAMv1.pdf) specification documentation.
data BAM_V1_6_BGZFBlock = BAM_V1_6_BGZFBlock
  { BAM_V1_6_BGZFBlock -> BAM_V1_6_GZipHeader
bam_v1_6_bgzfblock_gzip_header                :: BAM_V1_6_GZipHeader -- ^ GZip 10 byte header.
                                                                         -- This contains a magic number (1f 08),
                                                                         -- the compression method (08 for DEFLATE),
                                                                         -- 1-byte of header flags,
                                                                         -- a 4-byte timestamp,
                                                                         -- compression flags,
                                                                         -- and the operating system ID.
  , BAM_V1_6_BGZFBlock -> Word8
bam_v1_6_bgzfblock_subfield_identifier_one    :: Word8               -- ^ This should be 'B'.
  , BAM_V1_6_BGZFBlock -> Word8
bam_v1_6_bgzfblock_subfield_identifier_two    :: Word8               -- ^ This should be 'C'.
  , BAM_V1_6_BGZFBlock -> Word16
bam_v1_6_bgzfblock_subfield_length            :: Word16              -- ^ This should be '02 00'.
  , BAM_V1_6_BGZFBlock -> Word16
bam_v1_6_bgzfblock_total_block_size_minus_one :: Word16              -- ^ The payload of the BGZF
                                                                         -- extra field is a 16-bit unsigned
                                                                         -- integer in little endian format.
                                                                         -- This integer gives the size of the
                                                                         -- containing BGZF block minus one.
  , BAM_V1_6_BGZFBlock -> BAM_V1_6_BAM
bam_v1_6_bgzfblock_cdata                      :: BAM_V1_6_BAM        -- ^ Compressed DATA by zlib::deflate().
                                                                         -- The data in this field will be
                                                                         -- in a decompressed and
                                                                         -- useable state.
  , BAM_V1_6_BGZFBlock -> Word32
bam_v1_6_bgzfblock_crc32                      :: Word32              -- ^ CRC-32.
  , BAM_V1_6_BGZFBlock -> Word32
bam_v1_6_bgzfblock_isize                      :: Word32              -- ^ Input SIZE (length of uncompressed data).
  } deriving ((forall x. BAM_V1_6_BGZFBlock -> Rep BAM_V1_6_BGZFBlock x)
-> (forall x. Rep BAM_V1_6_BGZFBlock x -> BAM_V1_6_BGZFBlock)
-> Generic BAM_V1_6_BGZFBlock
forall x. Rep BAM_V1_6_BGZFBlock x -> BAM_V1_6_BGZFBlock
forall x. BAM_V1_6_BGZFBlock -> Rep BAM_V1_6_BGZFBlock x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. BAM_V1_6_BGZFBlock -> Rep BAM_V1_6_BGZFBlock x
from :: forall x. BAM_V1_6_BGZFBlock -> Rep BAM_V1_6_BGZFBlock x
$cto :: forall x. Rep BAM_V1_6_BGZFBlock x -> BAM_V1_6_BGZFBlock
to :: forall x. Rep BAM_V1_6_BGZFBlock x -> BAM_V1_6_BGZFBlock
Generic,Typeable)

instance Eq BAM_V1_6_BGZFBlock where
  BAM_V1_6_BGZFBlock BAM_V1_6_GZipHeader
bam_v1_6_bgzfblock_gzip_header1
                     Word8
bam_v1_6_bgzfblock_subfield_identifier_one1
                     Word8
bam_v1_6_bgzfblock_subfield_identifier_two1
                     Word16
bam_v1_6_bgzfblock_subfield_length1
                     Word16
bam_v1_6_bgzfblock_total_block_size_minus_one1
                     BAM_V1_6_BAM
bam_v1_6_bgzfblock_cdata1
                     Word32
bam_v1_6_bgzfblock_crc321
                     Word32
bam_v1_6_bgzfblock_isize1 == :: BAM_V1_6_BGZFBlock -> BAM_V1_6_BGZFBlock -> Bool
==
    BAM_V1_6_BGZFBlock BAM_V1_6_GZipHeader
bam_v1_6_bgzfblock_gzip_header2
                       Word8
bam_v1_6_bgzfblock_subfield_identifier_one2
                       Word8
bam_v1_6_bgzfblock_subfield_identifier_two2
                       Word16
bam_v1_6_bgzfblock_subfield_length2
                       Word16
bam_v1_6_bgzfblock_total_block_size_minus_one2
                       BAM_V1_6_BAM
bam_v1_6_bgzfblock_cdata2
                       Word32
bam_v1_6_bgzfblock_crc322
                       Word32
bam_v1_6_bgzfblock_isize2 =
      BAM_V1_6_GZipHeader
bam_v1_6_bgzfblock_gzip_header1                BAM_V1_6_GZipHeader -> BAM_V1_6_GZipHeader -> Bool
forall a. Eq a => a -> a -> Bool
== BAM_V1_6_GZipHeader
bam_v1_6_bgzfblock_gzip_header2                Bool -> Bool -> Bool
&&
      Word8
bam_v1_6_bgzfblock_subfield_identifier_one1    Word8 -> Word8 -> Bool
forall a. Eq a => a -> a -> Bool
== Word8
bam_v1_6_bgzfblock_subfield_identifier_one2    Bool -> Bool -> Bool
&&
      Word8
bam_v1_6_bgzfblock_subfield_identifier_two1    Word8 -> Word8 -> Bool
forall a. Eq a => a -> a -> Bool
== Word8
bam_v1_6_bgzfblock_subfield_identifier_two2    Bool -> Bool -> Bool
&&
      Word16
bam_v1_6_bgzfblock_subfield_length1            Word16 -> Word16 -> Bool
forall a. Eq a => a -> a -> Bool
== Word16
bam_v1_6_bgzfblock_subfield_length2            Bool -> Bool -> Bool
&&
      Word16
bam_v1_6_bgzfblock_total_block_size_minus_one1 Word16 -> Word16 -> Bool
forall a. Eq a => a -> a -> Bool
== Word16
bam_v1_6_bgzfblock_total_block_size_minus_one2 Bool -> Bool -> Bool
&&
      BAM_V1_6_BAM
bam_v1_6_bgzfblock_cdata1                      BAM_V1_6_BAM -> BAM_V1_6_BAM -> Bool
forall a. Eq a => a -> a -> Bool
== BAM_V1_6_BAM
bam_v1_6_bgzfblock_cdata2                      Bool -> Bool -> Bool
&&
      Word32
bam_v1_6_bgzfblock_crc321                      Word32 -> Word32 -> Bool
forall a. Eq a => a -> a -> Bool
== Word32
bam_v1_6_bgzfblock_crc322                      Bool -> Bool -> Bool
&&
      Word32
bam_v1_6_bgzfblock_isize1                      Word32 -> Word32 -> Bool
forall a. Eq a => a -> a -> Bool
== Word32
bam_v1_6_bgzfblock_isize2

instance Show BAM_V1_6_BGZFBlock where
  show :: BAM_V1_6_BGZFBlock -> String
show (BAM_V1_6_BGZFBlock BAM_V1_6_GZipHeader
gzip_header
                           Word8
subfield_identifier_one
                           Word8
subfield_identifier_two
                           Word16
subfield_length
                           Word16
total_block_size_minus_one
                           BAM_V1_6_BAM
cdata
                           Word32
crc32
                           Word32
isize
       ) =
    String
"BAM_V1_6_BGZFBlock { "                               String -> ShowS
forall a. [a] -> [a] -> [a]
++
    String
"bam_v1_6_bgzfblock_gzip_header = "                   String -> ShowS
forall a. [a] -> [a] -> [a]
++
    (BAM_V1_6_GZipHeader -> String
forall a. Show a => a -> String
show BAM_V1_6_GZipHeader
gzip_header)                                    String -> ShowS
forall a. [a] -> [a] -> [a]
++
    String
" , bam_v1_6_bgzfblock_subfield_identifier_one = "    String -> ShowS
forall a. [a] -> [a] -> [a]
++
    (Word8 -> String
forall a. Show a => a -> String
show Word8
subfield_identifier_one)                        String -> ShowS
forall a. [a] -> [a] -> [a]
++
    String
" , bam_v1_6_bgzfblock_subfield_identifier_two = "    String -> ShowS
forall a. [a] -> [a] -> [a]
++
    (Word8 -> String
forall a. Show a => a -> String
show Word8
subfield_identifier_two)                        String -> ShowS
forall a. [a] -> [a] -> [a]
++
    String
" , bam_v1_6_bgzfblock_subfield_length = "            String -> ShowS
forall a. [a] -> [a] -> [a]
++
    (Word16 -> String
forall a. Show a => a -> String
show Word16
subfield_length)                                String -> ShowS
forall a. [a] -> [a] -> [a]
++
    String
" , bam_v1_6_bgzfblock_total_block_size_minus_one = " String -> ShowS
forall a. [a] -> [a] -> [a]
++
    (Word16 -> String
forall a. Show a => a -> String
show Word16
total_block_size_minus_one)                     String -> ShowS
forall a. [a] -> [a] -> [a]
++
    String
" , bam_v1_6_bgzfblock_cdata = "                      String -> ShowS
forall a. [a] -> [a] -> [a]
++
    (BAM_V1_6_BAM -> String
forall a. Show a => a -> String
show BAM_V1_6_BAM
cdata)                                          String -> ShowS
forall a. [a] -> [a] -> [a]
++
    String
" , bam_v1_6_bgzfblock_crc32 = "                      String -> ShowS
forall a. [a] -> [a] -> [a]
++
    (Word32 -> String
forall a. Show a => a -> String
show Word32
crc32)                                          String -> ShowS
forall a. [a] -> [a] -> [a]
++
    String
" , bam_v1_6_bgzfblock_isize = "                      String -> ShowS
forall a. [a] -> [a] -> [a]
++
    (Word32 -> String
forall a. Show a => a -> String
show Word32
isize)                                          String -> ShowS
forall a. [a] -> [a] -> [a]
++
    String
" }"