<?php
// ===================================================
// getsinkan.pex
// 設置先: /var/www/html/manager/sinkan/
// CLI から直接実行（HTTP経由なし）
// ===================================================

require_once __DIR__ . '/../../rakuten/proxy/config.php';

require_once __DIR__ . '/getsinkan_functions.php';

date_default_timezone_set('Asia/Tokyo');
umask(0002);

$max_time = 60 * 60 * 8;
ini_set("max_execution_time", $max_time);
set_time_limit($max_time);
ini_set('default_socket_timeout', $max_time);

// ログをリセット
$logfile = __DIR__ . '/log/trace_sub.log';
if (file_exists($logfile)) unlink($logfile);

// sinkan固有のパス定義
if (!defined('SINKAN_DIR')) {
    define("SINKAN_DIR",      __DIR__ . '/');
    define("SINKAN_DB_DIR",   __DIR__ . '/db/');
    define("SINKAN_DB_FILE",  __DIR__ . '/db/sinkan_book.db');
    define("SINKAN_CSV_DIR",  __DIR__ . '/csv/');
    define("SINKAN_LOG_DIR",  __DIR__ . '/log/');
    define("SINKAN_LOG_FILE", __DIR__ . '/log/trace_sub.log');
}

// ディレクトリ作成
foreach ([SINKAN_CSV_DIR, SINKAN_LOG_DIR, SINKAN_DB_DIR] as $dir) {
    if (!is_dir($dir)) mkdir($dir, 0775, true);
}

// 日付範囲（1ヶ月前から2ヶ月後まで）
$start = date('Ymd', strtotime('-1 month'));
$end   = date('Ymd', strtotime('+2 months'));

// ===========================
// メイン処理
// ===========================
function processSno(int $sno, int $page_start, int $page_end, string $start, string $end): void
{
    $tmp_path = SINKAN_CSV_DIR . "books_tmp{$sno}.csv";
    $fpath    = SINKAN_CSV_DIR . "books{$sno}-{$page_start}-{$page_end}.csv";

    // tmp ファイルが残っていれば削除
    if (file_exists($tmp_path)) unlink($tmp_path);

    $header = [];
    $line   = 0;

    // DB接続をprocessSnoごとに開く
    $db = new ItemDB();
    $db->exec(createTable());

    for ($gsub_id = 1; $gsub_id <= 29; $gsub_id++) {

        if ($gsub_id == 14 || $gsub_id == 15 || $gsub_id == 24) {
            outputLog("Docmd size={$sno} genre={$gsub_id}");
            continue;
        }

        $genre_id = "001" . sprintf("%03d", $gsub_id);
        outputLog("Docmd size={$sno} genre={$gsub_id}");

        $page = $page_start;
        $stat = 0;

        do {
            outputLog("Docmd size={$sno} genre={$genre_id} page={$page}");

            $params = [
                'size'           => $sno,
                'outOfStockFlag' => '1',
                'sort'           => '-releaseDate',
                'page'           => $page,
                'booksGenreId'   => $genre_id,
            ];

            $response_body = callBooksBookSearch($params);

            if ($response_body === false) {
                outputLog("ERROR size={$sno} genre={$genre_id} page={$page} APIリクエスト失敗");
                $page = $page_end;
            } else {
                $data = json_decode($response_body, true);

                if (empty($data['Items'])) {
                    outputLog("NoData size={$sno} genre={$genre_id} page={$page}");
                    $page = $page_end;
                } else {
                    outputLog("file write name=./csv/books{$sno}-{$page_start}-{$page_end}.csv");

                    if ($line == 0) {
                        $header_row = array_merge(
                            ['size_no', 'genre_id', 'page', 'sales_date_disp'],
                            CSV_COLUMNS
                        );
                        csvAppend($tmp_path, implode("\t", $header_row) . "\n");
                        $line++;

                        $header[] = "'isbn'";
                        $header[] = "'genre_id'";
                        $header[] = "'page'";
                        $header[] = "'schDate'";
                        $header[] = "'schAuthor'";
                        foreach (CSV_COLUMNS as $col) {
                            if ($col !== 'isbn') $header[] = "'" . $col . "'";
                        }
                    }

                    foreach ($data['Items'] as $item_wrap) {
                        $item       = $item_wrap['Item'];
                        $sales_date = $item['salesDate'] ?? '';
                        $sch_date   = createSchDate($sales_date);

                        // $sch_date が1ヶ月前〜2ヶ月後の範囲なら対象
                        if ($sch_date >= $start && $sch_date <= $end) {
                            $stat = 0;   // 範囲内→対象
                            $author = preg_replace("/( |　)/", "", $item['author'] ?? '');
                            csvAppend($tmp_path, buildCsvRow($sno, $genre_id, $page, $sch_date, $item) . "\n");

                            $isbn = $item['isbn'] ?? '';
                            if ($isbn) {
                                $db_data = [$isbn, $genre_id, $page, $sch_date, $author];
                                foreach (CSV_COLUMNS as $col) {
                                    if ($col !== 'isbn') $db_data[] = $item[$col] ?? '';
                                }
                                $sql = $db->isDataExist($isbn)
                                    ? createUpdateSql($header, $db_data, $isbn)
                                    : createInsertSql($header, $db_data);
                                $db->exec($sql);
                            }
                        } elseif ($sch_date < $start) {
                            $stat = -1;  // 1ヶ月前より古い→ループ打ち切り
                            break;
                        }
                    }  // foreach
                }  // else Items
            }  // else response

            $page++;
        } while (($stat >= 0) && ($page <= $page_end));
    }


    // DB接続を明示的に閉じる
    $db->close();

    if (file_exists($tmp_path)) {
        rename($tmp_path, $fpath);
        outputLog("Rename old=./csv/books_tmp{$sno}.csv new=./csv/books{$sno}-{$page_start}-{$page_end}.csv");
    }
}

function goAll(int $sno, string $start, string $end): void
{
    processSno($sno, 1,   30,  $start, $end);
    processSno($sno, 31,  60,  $start, $end);
    processSno($sno, 61,  90,  $start, $end);
    processSno($sno, 91,  99,  $start, $end);
    processSno($sno, 100, 100, $start, $end);
}

function goAll2(int $sno, string $start, string $end): void
{
    processSno($sno, 1,   20,  $start, $end);
    processSno($sno, 21,  40,  $start, $end);
    processSno($sno, 41,  60,  $start, $end);
    processSno($sno, 61,  80,  $start, $end);
    processSno($sno, 81,  99,  $start, $end);
    processSno($sno, 100, 100, $start, $end);
}

goAll(1,  $start, $end);
goAll(2,  $start, $end);
goAll(3,  $start, $end);
goAll(4,  $start, $end);
goAll(5,  $start, $end);
goAll2(6, $start, $end);
goAll(7,  $start, $end);
goAll(8,  $start, $end);
goAll2(9, $start, $end);
goAll(10, $start, $end);

// ===========================
// 古いデータの削除（schDateが2ヶ月前より古いものを削除）
// ===========================
$delete_before = date('Ymd', strtotime('-2 months'));
$db = new ItemDB();
$db->exec(createTable());
$db->exec("DELETE FROM item WHERE schDate < '{$delete_before}'");
$db->close();
outputLog("古いデータ削除完了: schDate < {$delete_before}");
