{-# LANGUAGE DeriveDataTypeable          #-}
{-# LANGUAGE DeriveGeneric               #-}
{-# LANGUAGE FlexibleContexts            #-}
{-# LANGUAGE FlexibleInstances           #-}
{-# LANGUAGE MultiParamTypeClasses       #-}
{-# LANGUAGE OverloadedStrings           #-}
{-# LANGUAGE StrictData                  #-}
{-# LANGUAGE TypeFamilies                #-}
{-# OPTIONS_GHC -fno-warn-name-shadowing #-}

-- |
-- Module      :  Data.BAM.Version1_6.BAM.Alignment.Base
-- 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.BAM.Alignment.Base ( -- * BAM version 1.6 alignment mandatory and optional data types
                                                BAM_V1_6_BAM_Alignment(..)
                                              ) where

import Data.BAM.Version1_6.BAM.Alignment.OptionalFields.Base

import Data.ByteString
import Data.Int
import Data.Sequence
import Data.Word
import Data.Data
import Generics.Deriving.Base

-- | Custom BAM (version 1.6) @"BAM_V1_6_BAM_Alignment"@ data type.
--
-- See section 4.2 of the [SAM v1.6](http://samtools.github.io/hts-specs/SAMv1.pdf) specification documentation.
data BAM_V1_6_BAM_Alignment = BAM_V1_6_BAM_Alignment
  { BAM_V1_6_BAM_Alignment -> Word32
bam_v1_6_bam_alignment_block_size     :: Word32                                    -- ^ Total length of the alignment
                                                                                       -- record, excluding this field.
  , BAM_V1_6_BAM_Alignment -> Int32
bam_v1_6_bam_alignment_refID          :: Int32                                     -- ^ Reference sequence ID, -1 <= refID <= n_ref;
                                                                                       -- -1 for a read without a mapping position.
  , BAM_V1_6_BAM_Alignment -> Int32
bam_v1_6_bam_alignment_pos            :: Int32                                     -- ^ 0-based leftmost coordinate (= POS - 1).
  , BAM_V1_6_BAM_Alignment -> Word8
bam_v1_6_bam_alignment_l_read_name    :: Word8                                     -- ^ Length of read_name below (= length(QNAME) + 1).
  , BAM_V1_6_BAM_Alignment -> Word8
bam_v1_6_bam_alignment_mapq           :: Word8                                     -- ^ Mapping quality (= MAPQ).
  , BAM_V1_6_BAM_Alignment -> Word16
bam_v1_6_bam_alignment_bin            :: Word16                                    -- ^ BAI index bin, see Section 4.2.1.
  , BAM_V1_6_BAM_Alignment -> Word16
bam_v1_6_bam_alignment_n_cigar_op     :: Word16                                    -- ^ Number of operations in CIGAR,
                                                                                       -- see section 4.2.2.
  , BAM_V1_6_BAM_Alignment -> Word16
bam_v1_6_bam_alignment_flag           :: Word16                                    -- ^ Bitwise flags (= FLAG).
  , BAM_V1_6_BAM_Alignment -> Word32
bam_v1_6_bam_alignment_l_seq          :: Word32                                    -- ^ Length of SEQ.
  , BAM_V1_6_BAM_Alignment -> Int32
bam_v1_6_bam_alignment_next_refID     :: Int32                                     -- ^ Ref-ID of the next seqment
                                                                                       -- (-1 <= next_refID <= n_ref).
  , BAM_V1_6_BAM_Alignment -> Int32
bam_v1_6_bam_alignment_next_pos       :: Int32                                     -- ^ 0-based leftmost pos of the
                                                                                       -- next segment (= PNEXT - 1).
  , BAM_V1_6_BAM_Alignment -> Int32
bam_v1_6_bam_alignment_tlen           :: Int32                                     -- ^ Template length (= TLEN).
  , BAM_V1_6_BAM_Alignment -> ByteString
bam_v1_6_bam_alignment_read_name      :: ByteString                                -- ^ Read name; NUL-terminated
                                                                                       -- (QNAME with trailing 0x00/'\0').
  , BAM_V1_6_BAM_Alignment -> Seq Word32
bam_v1_6_bam_alignment_cigar          :: Seq Word32                                -- ^ CIGAR; op_len<<4<<|op.
                                                                                       -- 'MIDNSHP=X' -> '012345678'.
  , BAM_V1_6_BAM_Alignment -> Seq Word8
bam_v1_6_bam_alignment_seq            :: Seq Word8                                 -- ^ 4-bit encoded read:
                                                                                       -- '=ACMGRSVTWYHKDBN' -> [0,15].
                                                                                       -- See section 4.2.3.
  , BAM_V1_6_BAM_Alignment -> ByteString
bam_v1_6_bam_alignment_qual           :: ByteString                                -- ^ Phred-scaled base qualities.
                                                                                       -- See section 4.2.3.
  , BAM_V1_6_BAM_Alignment -> Seq BAM_V1_6_BAM_Alignment_OptionalFields
bam_v1_6_bam_alignment_optionalfields :: Seq BAM_V1_6_BAM_Alignment_OptionalFields -- ^ List of auxiliary data. 
                                                                                       -- See section 4.2.4
  } deriving ((forall x. BAM_V1_6_BAM_Alignment -> Rep BAM_V1_6_BAM_Alignment x)
-> (forall x.
    Rep BAM_V1_6_BAM_Alignment x -> BAM_V1_6_BAM_Alignment)
-> Generic BAM_V1_6_BAM_Alignment
forall x. Rep BAM_V1_6_BAM_Alignment x -> BAM_V1_6_BAM_Alignment
forall x. BAM_V1_6_BAM_Alignment -> Rep BAM_V1_6_BAM_Alignment x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. BAM_V1_6_BAM_Alignment -> Rep BAM_V1_6_BAM_Alignment x
from :: forall x. BAM_V1_6_BAM_Alignment -> Rep BAM_V1_6_BAM_Alignment x
$cto :: forall x. Rep BAM_V1_6_BAM_Alignment x -> BAM_V1_6_BAM_Alignment
to :: forall x. Rep BAM_V1_6_BAM_Alignment x -> BAM_V1_6_BAM_Alignment
Generic,Typeable)

instance Eq BAM_V1_6_BAM_Alignment where
  BAM_V1_6_BAM_Alignment Word32
bam_v1_6_bam_alignment_block_size1
                         Int32
bam_v1_6_bam_alignment_refID1
                         Int32
bam_v1_6_bam_alignment_pos1
                         Word8
bam_v1_6_bam_alignment_l_read_name1
                         Word8
bam_v1_6_bam_alignment_mapq1
                         Word16
bam_v1_6_bam_alignment_bin1
                         Word16
bam_v1_6_bam_alignment_n_cigar_op1
                         Word16
bam_v1_6_bam_alignment_flag1
                         Word32
bam_v1_6_bam_alignment_l_seq1
                         Int32
bam_v1_6_bam_alignment_next_refID1
                         Int32
bam_v1_6_bam_alignment_next_pos1
                         Int32
bam_v1_6_bam_alignment_tlen1
                         ByteString
bam_v1_6_bam_alignment_read_name1
                         Seq Word32
bam_v1_6_bam_alignment_cigar1
                         Seq Word8
bam_v1_6_bam_alignment_seq1
                         ByteString
bam_v1_6_bam_alignment_qual1
                         Seq BAM_V1_6_BAM_Alignment_OptionalFields
bam_v1_6_bam_alignment_optional_fields1 == :: BAM_V1_6_BAM_Alignment -> BAM_V1_6_BAM_Alignment -> Bool
==
    BAM_V1_6_BAM_Alignment Word32
bam_v1_6_bam_alignment_block_size2
                           Int32
bam_v1_6_bam_alignment_refID2
                           Int32
bam_v1_6_bam_alignment_pos2
                           Word8
bam_v1_6_bam_alignment_l_read_name2
                           Word8
bam_v1_6_bam_alignment_mapq2
                           Word16
bam_v1_6_bam_alignment_bin2
                           Word16
bam_v1_6_bam_alignment_n_cigar_op2
                           Word16
bam_v1_6_bam_alignment_flag2
                           Word32
bam_v1_6_bam_alignment_l_seq2
                           Int32
bam_v1_6_bam_alignment_next_refID2
                           Int32
bam_v1_6_bam_alignment_next_pos2
                           Int32
bam_v1_6_bam_alignment_tlen2
                           ByteString
bam_v1_6_bam_alignment_read_name2
                           Seq Word32
bam_v1_6_bam_alignment_cigar2
                           Seq Word8
bam_v1_6_bam_alignment_seq2
                           ByteString
bam_v1_6_bam_alignment_qual2
                           Seq BAM_V1_6_BAM_Alignment_OptionalFields
bam_v1_6_bam_alignment_optional_fields2 =
      Word32
bam_v1_6_bam_alignment_block_size1      Word32 -> Word32 -> Bool
forall a. Eq a => a -> a -> Bool
==  Word32
bam_v1_6_bam_alignment_block_size2  Bool -> Bool -> Bool
&&
      Int32
bam_v1_6_bam_alignment_refID1           Int32 -> Int32 -> Bool
forall a. Eq a => a -> a -> Bool
==  Int32
bam_v1_6_bam_alignment_refID2       Bool -> Bool -> Bool
&&
      Int32
bam_v1_6_bam_alignment_pos1             Int32 -> Int32 -> Bool
forall a. Eq a => a -> a -> Bool
==  Int32
bam_v1_6_bam_alignment_pos2         Bool -> Bool -> Bool
&&
      Word8
bam_v1_6_bam_alignment_l_read_name1     Word8 -> Word8 -> Bool
forall a. Eq a => a -> a -> Bool
==  Word8
bam_v1_6_bam_alignment_l_read_name2 Bool -> Bool -> Bool
&&
      Word8
bam_v1_6_bam_alignment_mapq1            Word8 -> Word8 -> Bool
forall a. Eq a => a -> a -> Bool
==  Word8
bam_v1_6_bam_alignment_mapq2        Bool -> Bool -> Bool
&&
      Word16
bam_v1_6_bam_alignment_bin1             Word16 -> Word16 -> Bool
forall a. Eq a => a -> a -> Bool
==  Word16
bam_v1_6_bam_alignment_bin2         Bool -> Bool -> Bool
&&
      Word16
bam_v1_6_bam_alignment_n_cigar_op1      Word16 -> Word16 -> Bool
forall a. Eq a => a -> a -> Bool
==  Word16
bam_v1_6_bam_alignment_n_cigar_op2  Bool -> Bool -> Bool
&&
      Word16
bam_v1_6_bam_alignment_flag1            Word16 -> Word16 -> Bool
forall a. Eq a => a -> a -> Bool
==  Word16
bam_v1_6_bam_alignment_flag2        Bool -> Bool -> Bool
&&
      Word32
bam_v1_6_bam_alignment_l_seq1           Word32 -> Word32 -> Bool
forall a. Eq a => a -> a -> Bool
==  Word32
bam_v1_6_bam_alignment_l_seq2       Bool -> Bool -> Bool
&&
      Int32
bam_v1_6_bam_alignment_next_refID1      Int32 -> Int32 -> Bool
forall a. Eq a => a -> a -> Bool
==  Int32
bam_v1_6_bam_alignment_next_refID2  Bool -> Bool -> Bool
&&
      Int32
bam_v1_6_bam_alignment_next_pos1        Int32 -> Int32 -> Bool
forall a. Eq a => a -> a -> Bool
==  Int32
bam_v1_6_bam_alignment_next_pos2    Bool -> Bool -> Bool
&&
      Int32
bam_v1_6_bam_alignment_tlen1            Int32 -> Int32 -> Bool
forall a. Eq a => a -> a -> Bool
==  Int32
bam_v1_6_bam_alignment_tlen2        Bool -> Bool -> Bool
&&
      ByteString
bam_v1_6_bam_alignment_read_name1       ByteString -> ByteString -> Bool
forall a. Eq a => a -> a -> Bool
==  ByteString
bam_v1_6_bam_alignment_read_name2   Bool -> Bool -> Bool
&&
      Seq Word32
bam_v1_6_bam_alignment_cigar1           Seq Word32 -> Seq Word32 -> Bool
forall a. Eq a => a -> a -> Bool
==  Seq Word32
bam_v1_6_bam_alignment_cigar2       Bool -> Bool -> Bool
&&
      Seq Word8
bam_v1_6_bam_alignment_seq1             Seq Word8 -> Seq Word8 -> Bool
forall a. Eq a => a -> a -> Bool
==  Seq Word8
bam_v1_6_bam_alignment_seq2         Bool -> Bool -> Bool
&&
      ByteString
bam_v1_6_bam_alignment_qual1            ByteString -> ByteString -> Bool
forall a. Eq a => a -> a -> Bool
==  ByteString
bam_v1_6_bam_alignment_qual2        Bool -> Bool -> Bool
&&
      Seq BAM_V1_6_BAM_Alignment_OptionalFields
bam_v1_6_bam_alignment_optional_fields1 Seq BAM_V1_6_BAM_Alignment_OptionalFields
-> Seq BAM_V1_6_BAM_Alignment_OptionalFields -> Bool
forall a. Eq a => a -> a -> Bool
==  Seq BAM_V1_6_BAM_Alignment_OptionalFields
bam_v1_6_bam_alignment_optional_fields2

instance Show BAM_V1_6_BAM_Alignment where
  show :: BAM_V1_6_BAM_Alignment -> String
show ( BAM_V1_6_BAM_Alignment Word32
block_size
                                Int32
refID
                                Int32
pos
                                Word8
l_read_name
                                Word8
mapq
                                Word16
bin
                                Word16
n_cigar_op
                                Word16
flag
                                Word32
l_seq
                                Int32
next_refID
                                Int32
next_pos
                                Int32
tlen
                                ByteString
read_name
                                Seq Word32
cigar
                                Seq Word8
seq
                                ByteString
qual
                                Seq BAM_V1_6_BAM_Alignment_OptionalFields
optionalfields
       ) =
    String
"BAM_V1_6_BAM_Alignment { "                   String -> ShowS
forall a. [a] -> [a] -> [a]
++
    String
"bam_v1_6_bam_alignment_block_size = "        String -> ShowS
forall a. [a] -> [a] -> [a]
++
    (Word32 -> String
forall a. Show a => a -> String
show Word32
block_size)                             String -> ShowS
forall a. [a] -> [a] -> [a]
++
    String
" , bam_v1_6_bam_alignment_refID = "          String -> ShowS
forall a. [a] -> [a] -> [a]
++
    (Int32 -> String
forall a. Show a => a -> String
show Int32
refID)                                  String -> ShowS
forall a. [a] -> [a] -> [a]
++
    String
" , bam_v1_6_bam_alignment_pos = "            String -> ShowS
forall a. [a] -> [a] -> [a]
++
    (Int32 -> String
forall a. Show a => a -> String
show Int32
pos)                                    String -> ShowS
forall a. [a] -> [a] -> [a]
++
    String
" , bam_v1_6_bam_alignment_l_read_name = "    String -> ShowS
forall a. [a] -> [a] -> [a]
++
    (Word8 -> String
forall a. Show a => a -> String
show Word8
l_read_name)                            String -> ShowS
forall a. [a] -> [a] -> [a]
++
    String
" , bam_v1_6_bam_alignment_mapq = "           String -> ShowS
forall a. [a] -> [a] -> [a]
++
    (Word8 -> String
forall a. Show a => a -> String
show Word8
mapq)                                   String -> ShowS
forall a. [a] -> [a] -> [a]
++
    String
" , bam_v1_6_bam_alignment_bin = "            String -> ShowS
forall a. [a] -> [a] -> [a]
++
    (Word16 -> String
forall a. Show a => a -> String
show Word16
bin)                                    String -> ShowS
forall a. [a] -> [a] -> [a]
++
    String
" , bam_v1_6_bam_alignment_n_cigar_op = "     String -> ShowS
forall a. [a] -> [a] -> [a]
++
    (Word16 -> String
forall a. Show a => a -> String
show Word16
n_cigar_op)                             String -> ShowS
forall a. [a] -> [a] -> [a]
++
    String
" , bam_v1_6_bam_alignment_flag = "           String -> ShowS
forall a. [a] -> [a] -> [a]
++
    (Word16 -> String
forall a. Show a => a -> String
show Word16
flag)                                   String -> ShowS
forall a. [a] -> [a] -> [a]
++
    String
" , bam_v1_6_bam_alignment_l_seq = "          String -> ShowS
forall a. [a] -> [a] -> [a]
++
    (Word32 -> String
forall a. Show a => a -> String
show Word32
l_seq)                                  String -> ShowS
forall a. [a] -> [a] -> [a]
++
    String
" , bam_v1_6_bam_alignment_next_refID = "     String -> ShowS
forall a. [a] -> [a] -> [a]
++
    (Int32 -> String
forall a. Show a => a -> String
show Int32
next_refID)                             String -> ShowS
forall a. [a] -> [a] -> [a]
++
    String
" , bam_v1_6_bam_alignment_next_pos = "       String -> ShowS
forall a. [a] -> [a] -> [a]
++
    (Int32 -> String
forall a. Show a => a -> String
show Int32
next_pos)                               String -> ShowS
forall a. [a] -> [a] -> [a]
++
    String
" , bam_v1_6_bam_alignment_tlen = "           String -> ShowS
forall a. [a] -> [a] -> [a]
++
    (Int32 -> String
forall a. Show a => a -> String
show Int32
tlen)                                   String -> ShowS
forall a. [a] -> [a] -> [a]
++
    String
" , bam_v1_6_bam_alignment_read_name = "      String -> ShowS
forall a. [a] -> [a] -> [a]
++
    (ByteString -> String
forall a. Show a => a -> String
show ByteString
read_name)                              String -> ShowS
forall a. [a] -> [a] -> [a]
++
    String
" , bam_v1_6_bam_alignment_cigar = "          String -> ShowS
forall a. [a] -> [a] -> [a]
++
    (Seq Word32 -> String
forall a. Show a => a -> String
show Seq Word32
cigar)                                  String -> ShowS
forall a. [a] -> [a] -> [a]
++
    String
" , bam_v1_6_bam_alignment_seq = "            String -> ShowS
forall a. [a] -> [a] -> [a]
++
    (Seq Word8 -> String
forall a. Show a => a -> String
show Seq Word8
seq)                                    String -> ShowS
forall a. [a] -> [a] -> [a]
++
    String
" , bam_v1_6_bam_alignment_qual = "           String -> ShowS
forall a. [a] -> [a] -> [a]
++
    (ByteString -> String
forall a. Show a => a -> String
show ByteString
qual)                                   String -> ShowS
forall a. [a] -> [a] -> [a]
++
    String
" , bam_v1_6_bam_alignment_optionalfields = " String -> ShowS
forall a. [a] -> [a] -> [a]
++
    (Seq BAM_V1_6_BAM_Alignment_OptionalFields -> String
forall a. Show a => a -> String
show Seq BAM_V1_6_BAM_Alignment_OptionalFields
optionalfields)                         String -> ShowS
forall a. [a] -> [a] -> [a]
++
    String
" }"