<?php

namespace App\Console\Commands;

use App\Services\TikTok\TikTokSyncService;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\Process;

class TikTokSync extends Command
{
    protected $signature = 'tiktok:sync
        {--input= : Đường dẫn file danh sách creator (JSON)}
        {--org= : Organization ID hex}
        {--user= : User ID hex (người thực hiện)}
        {--output= : Thư mục lưu kết quả scrape}
        {--headless : Chạy ẩn trình duyệt}
        {--dry-run : Chạy scrape nhưng không ghi vào DB}';

    protected $description = 'Đồng bộ thông tin KOC/KOL từ TikTok Affiliate vào hệ thống';

    protected TikTokSyncService $syncService;

    public function __construct()
    {
        parent::__construct();
        $this->syncService = new TikTokSyncService();
    }

    public function handle(): int
    {
        $dryRun = (bool) $this->option('dry-run');
        $orgHex = $this->option('org');
        $userHex = $this->option('user');
        $inputFile = $this->option('input');
        $outputDir = $this->option('output');

        // Nếu không có org, lấy từ session (chạy web) hoặc hỏi
        if (!$orgHex) {
            $orgHex = session('organization_hex');
            if (!$orgHex) {
                $orgHex = $this->ask('Nhập Organization ID hex');
            }
        }

        if (!$userHex) {
            $userHex = session('user_id_hex');
            if (!$userHex && auth()->check()) {
                $userHex = auth()->user()->hex_id ?? null;
            }
            if (!$userHex) {
                $userHex = $this->ask('Nhập User ID hex');
            }
        }

        $this->line('╔══════════════════════════════════════╗');
        $this->line('║     TIKTOK AFFILIATE CREATOR SYNC    ║');
        $this->line('╚══════════════════════════════════════╝');
        $this->newLine();

        $this->info("Organization: {$orgHex}");
        $this->info("User:         {$userHex}");
        $this->info("Dry run:     " . ($dryRun ? 'Có' : 'Không'));
        if ($dryRun) {
            $this->warn('Chạy ở chế độ dry-run — sẽ không ghi vào database');
        }

        // === Bước 1: Chạy Node.js scraper ===
        $this->newLine();
        $this->line('━ Bước 1: Chạy TikTok scraper...');

        $scraperDir = base_path('tiktok-scraper');
        $scraperScript = escapeshellarg("{$scraperDir}/src/index.js");

        $cmd = "node {$scraperScript}";

        // Build args
        if ($inputFile) {
            $cmd .= ' --input ' . escapeshellarg($inputFile);
        }
        if ($outputDir) {
            $cmd .= ' --output ' . escapeshellarg($outputDir);
        }
        if ($this->option('headless')) {
            $cmd .= ' --headless';
        }

        $this->line("  > Chạy lệnh: {$cmd}");

        // Chạy với thời gian timeout lớn (có thể mất nhiều thời gian)
        $startTime = microtime(true);

        $process = Process::path($scraperDir)
            ->timeout(600) // 10 phút
            ->run($cmd);

        $elapsed = round(microtime(true) - $startTime, 2);

        if ($process->failed()) {
            $this->error("Scraper thất bại sau {$elapsed}s");
            $this->line($process->errorOutput());
            return self::FAILURE;
        }

        // Output scraper
        $output = $process->output();
        $this->line($output);
        $this->info("✓ Scraper hoàn thành sau {$elapsed}s");

        // === Bước 2: Tìm file kết quả mới nhất ===
        $this->newLine();
        $this->line('━ Bước 2: Đọc kết quả scrape...');

        // Mặc định output từ scraper
        $resultPath = ($outputDir ?: "{$scraperDir}/data") . '/scraped_results.json';

        if (!file_exists($resultPath)) {
            // Thử tìm file mới nhất trong thư mục data
            $dataDir = "{$scraperDir}/data";
            $files = glob("{$dataDir}/scraped_results.json");
            if (empty($files)) {
                $this->error('Không tìm thấy file kết quả scrape');
                return self::FAILURE;
            }
            $resultPath = $files[0];
        }

        $this->info("  File kết quả: {$resultPath}");

        // === Bước 3: Đồng bộ vào database ===
        if ($dryRun) {
            $this->newLine();
            $this->warn('Dry-run: bỏ qua bước ghi database');
            $this->line('Xem file kết quả tại: ' . $resultPath);
            return self::SUCCESS;
        }

        $this->newLine();
        $this->line('━ Bước 3: Đồng bộ vào database...');

        $stats = $this->syncService->syncFromJson($resultPath, $orgHex, $userHex);

        if (!$stats['success']) {
            $this->error($stats['error']);
            return self::FAILURE;
        }

        // Hiển thị kết quả
        $this->newLine();
        $this->line('╔══════════════════════════════════════╗');
        $this->line('║         KẾT QUẢ ĐỒNG BỘ            ║');
        $this->line('╚══════════════════════════════════════╝');
        $this->info("  Đã tạo mới:   {$stats['created']}");
        $this->info("  Đã cập nhật:  {$stats['updated']}");
        $this->info("  Đã bỏ qua:    {$stats['skipped']}");

        if (!empty($stats['errors'])) {
            $this->newLine();
            $this->warn('Lỗi:');
            foreach ($stats['errors'] as $err) {
                $this->line("  - {$err}");
            }
        }

        $this->newLine();
        $this->info('✓ Hoàn tất đồng bộ TikTok Affiliate!');

        return self::SUCCESS;
    }
}
