/*
     Description: 解析后的一些参数，文件，数据等，主要供线程用，每个线程一个实例

     Copyright : All right reserved by ICT

     Author : Zhang Zhonghai
     Date : 2025/12/29
*/
#pragma once

#include <htslib/faidx.h>
#include <htslib/sam.h>

#include <vector>

#include "util/vcf_parser.h"
#include "recal_tables.h"
#include "covariate.h"
#include "util/bam_wrap.h"
#include "util/sam_data.h"
#include "util/stable_array.h"
#include "util/bam_buf.h"

using std::vector;

// 解析后的一些参数，文件，数据等
struct AuxVar {
    //const static int REF_CONTEXT_PAD = 3;                 // 需要做一些填充
    //const static int REFERENCE_HALF_WINDOW_LENGTH = 150;  // 需要额外多取出一些ref序列，防止边界效应

    static constexpr int BAM_BLOCK_NUM = 1000; // 每个线程每次处理1k个bam记录
    static int64_t processedReads;

    sam_hdr_t* header = nullptr;  // bam header
    faidx_t* faidx = nullptr;     // reference index
    char* ref_seq = nullptr;      // reference sequence
    int ref_len = 0;              // reference sequence length
    int offset = 0;               // 在要求的ref序列两边，多余取出的碱基数量
    int64_t threadProcessedReads = 0; // 该线程已经处理的reads数量

    BamArray *bamArr = nullptr;  // bam数据数组

    vector<VCFParser> vcfArr;  // 从vcf中获取已知位点

    PerReadCovariateMatrix readCovariates;  // 每个read对应的协变量矩阵
    RecalTables recalTables;  // 每个线程对应一个recal tables，计算table的时候需要每个线程都有一个，输出bam的时候不需要，因为只读取，不写入

    SamData sd;
    StableArray<int> isSNP, isIns, isDel;  // 该位置是否是SNP, indel位置，0不是，1是
    StableArray<uint8_t> baqArray;
    StableArray<double> snpErrors, insErrors, delErrors;
    StableArray<uint8_t> skips;  // 该位置是否是已知位点

    // only for apply bqsr
    RecalTables* bqsrTable; // 保留一份就够
};