/*
     Description: 排序第一阶段的并行流水线实现代码

     Copyright : All right reserved by ICT

     Author : Zhang Zhonghai
     Date : 2026/05/23
*/

#include "phase_1.h"

#include <spdlog/spdlog.h>

#include "common_data.h"
#include "phase_1_read.h"
#include "phase_1_uncompress.h"
#include "phase_1_write.h"
#include "util/profiling.h"

std::string getFileNameWithoutExt(const std::string& filepath) {
    // 1. 找到最后一个路径分隔符
    size_t sep = filepath.find_last_of("/\\");
    size_t nameStart = (sep == std::string::npos) ? 0 : sep + 1;

    // 2. 找到最后一个点（作为扩展名的分隔符）
    size_t dot = filepath.find_last_of('.');

    // 3. 仅当点位于文件名起始之后时，才认为是扩展名
    if (dot != std::string::npos && dot > nameStart) {
        return filepath.substr(nameStart, dot - nameStart);
    }
    return filepath.substr(nameStart);
}

std::string getFilePathWithoutExt(const std::string& filepath) {
    // 1. 找到最后一个路径分隔符
    size_t sep = filepath.find_last_of("/\\");
    size_t nameStart = (sep == std::string::npos) ? 0 : sep + 1;

    // 2. 找到最后一个点（作为扩展名的分隔符）
    size_t dot = filepath.find_last_of('.');

    // 3. 仅当点位于文件名起始之后时，才认为是扩展名
    if (dot != std::string::npos && dot > nameStart) {
        return filepath.substr(0, dot);
    }
    return filepath;
}

void phase1Pipeline(Phase1PipelineArg& p) {

    PROF_G_BEG(mid_all);
    /* create threads */
    pthread_t tidArr[3]; // 2-stage pipeline
    pthread_create(&tidArr[0], NULL, phase1ReadFile, &p);
    pthread_create(&tidArr[1], NULL, phase1Uncompress, &p);
    pthread_create(&tidArr[2], NULL, phase1MemCopy, &p);

    for (int i = 0; i < 3; ++i) pthread_join(tidArr[i], NULL);

    spdlog::info("all bams num: {}", p.bamNum);

    PROF_G_END(mid_all);
}