#!/usr/bin/env python3
# -*- coding: utf-8 -*-

"""
extract_linkage.py

功能：
    - 从 COBOL 源文件中提取 LINKAGE SECTION.
    - 把该段落保存到 <原文件名>_linkage.cob
    -（可选）生成不包含 LINKAGE SECTION 的文件 <原文件名>_no_linkage.cob

使用方法：
    python extract_linkage.py  your_program.cbl
"""
import shutil
import sys
import re
from pathlib import Path

from pilot.job.impl.base_job import BaseJob

# --------------------------------------------------------------
# 正则：匹配 COBOL 章节标题（DATA DIVISION., PROCEDURE DIVISION. …）
SECTION_HEADER_RE = re.compile(
    r'^(?P<name>(?:IDENTIFICATION|ENVIRONMENT|DATA|PROCEDURE)\s+DIVISION\.)',
    re.IGNORECASE
)

LINKAGE_START = "LINKAGE SECTION."
END_SENTENCE_RE = re.compile(r'\.\s*$')          # 行末只剩句点（可能前有空格）

class SplitDataBaseJob(BaseJob):

    out_data_file_path = ''
    linkage_data_file_path = ''

    def extract_linkage(self, source_path):
        """
        把 source_path 中的 LINKAGE SECTION 提取出来，返回两个字符串：
            - linkage_text   : 包含 "LINKAGE SECTION." 以及其后所有行（直到段落结束）
            - remaining_text : 原文件去掉上述部分后的内容
        """
        lines = source_path.read_text(encoding='utf-8').splitlines(keepends=True)

        in_linkage = False
        linkage_buf = []
        remaining_buf = []

        for idx, line in enumerate(lines):
            stripped = line.strip().upper()

            # 1️⃣ 检测到 LINKAGE SECTION. 的起始行
            if not in_linkage and stripped.startswith(LINKAGE_START):
                in_linkage = True
                linkage_buf.append(line)          # 把起始行也保存进去
                continue

            if in_linkage:
                linkage_buf.append(line)

                # 2️⃣ 判断段落是否结束：
                #    - 行本身只剩句点（.）   OR
                #    - 下一行是另一个 DIVISION 标题（如 PROCEDURE DIVISION.）
                #      （因为在 COBOL 中 SECTION 结束后往往会出现新的 DIVISION）
                if END_SENTENCE_RE.search(line):
                    # 检查下一行是否是新的 DIVISION（防止把后面的段落一起吃掉）
                    next_line = lines[idx + 1] if idx + 1 < len(lines) else ''
                    if SECTION_HEADER_RE.search(next_line.strip().upper()):
                        in_linkage = False
                    # 也可以仅靠句点结束，这里保持两种兼容
                continue

            # 不在 LINKAGE SECTION 里的行直接写入剩余缓冲区
            remaining_buf.append(line)

        linkage_text = ''.join(linkage_buf).strip('\n')
        remaining_text = ''.join(remaining_buf).rstrip('\n')

        return linkage_text, remaining_text


    def main(self):
        if 'COPY' not in self.file_path.upper():
            src_path = Path(self.file_path)
            linkage, remaining = self.extract_linkage(src_path)

            # ---------- 生成输出文件 ----------
            out_dir = src_path.parent
            base_name = src_path.stem

            target_folder_path =  out_dir / base_name

            target_folder_path.mkdir(parents=True, exist_ok=True)

            if not linkage:
                shutil.copy2(self.file_path, target_folder_path)
                self.out_data_file_path = target_folder_path / Path(self.file_path).name
            else:
                # 1) LINKAGE SECTION 单独文件
                linkage_file = target_folder_path / f"{base_name}.linkage.cob"
                linkage_file.write_text(linkage + '\n', encoding='utf-8')

                self.linkage_data_file_path = linkage_file

                # 2) （可选）去掉 LINKAGE SECTION 的文件
                no_linkage_file = target_folder_path / f"{base_name}.cob"
                no_linkage_file.write_text(remaining + '\n', encoding='utf-8')

                self.out_data_file_path = no_linkage_file
        else:
            self.out_data_file_path = self.file_path

    def run(self):
        self.main()

        super().run()