"""並列処理"""

import concurrent.futures

from src.batch.bio_sales import create_bio_sales_lot
from src.batch.laundering import sales_laundering
from src.error.exceptions import BatchOperationException


def exec():
    # 並列処理を開始
    with concurrent.futures.ThreadPoolExecutor(max_workers=2) as executor:

        # 実績更新
        future_sales_laundering = executor.submit(sales_laundering.exec)
        # 生物由来ロット分解
        future_create_bio_sales_lot = executor.submit(create_bio_sales_lot.exec)

        # 両方の処理が完了するまで待つ
        concurrent.futures.wait([future_sales_laundering, future_create_bio_sales_lot])

        # エラーがあれば呼び出し元でキャッチする
        sales_laundering_exc = future_sales_laundering.exception()
        create_bio_sales_lot_exc = future_create_bio_sales_lot.exception()

        # いずれかにエラーが発生していれば、１つのエラーとして返す。
        if sales_laundering_exc is not None or create_bio_sales_lot_exc is not None:
            sales_laundering_exc_message = str(sales_laundering_exc) if sales_laundering_exc is not None else ''
            create_bio_sales_lot_exc_message = str(create_bio_sales_lot_exc) if create_bio_sales_lot_exc is not None else ''
            raise BatchOperationException(f'並列処理中にエラーが発生しました。実績更新="{sales_laundering_exc_message}", 生物由来ロット分解={create_bio_sales_lot_exc_message}')

        return
