<?php

namespace App\Services\TikTok;

use App\Models\Creator;
use App\Support\IdFormatter;
use App\Support\Uuid;
use App\Utils\AuditLog;
use Illuminate\Support\Facades\DB;

/**
 * TikTokSyncService: Xử lý dữ liệu scrape từ TikTok Affiliate
 * và đồng bộ vào bảng creators.
 *
 * Workflow:
 *   TikTokSync (Command) → chạy Node.js scraper
 *   → đọc file JSON kết quả
 *   → TikTokSyncService xử lý từng creator
 *   → CreatorRepository / CreatorService cập nhật DB
 */
class TikTokSyncService
{
    /**
     * Đồng bộ dữ liệu scrape từ file JSON vào database.
     *
     * @param string $jsonPath  Đường dẫn file kết quả scrape
     * @param string $orgHex    Organization ID hex
     * @param string $userIdHex User ID hex (người thực hiện sync)
     * @return array  Thống kê kết quả
     */
    public function syncFromJson(string $jsonPath, string $orgHex, string $userIdHex): array
    {
        if (!file_exists($jsonPath)) {
            return [
                'success' => false,
                'error' => "Không tìm thấy file: {$jsonPath}",
                'updated' => 0,
                'created' => 0,
                'skipped' => 0,
                'errors' => [],
            ];
        }

        $raw = file_get_contents($jsonPath);
        $data = json_decode($raw, true);

        if (!$data || !isset($data['creators']) || !is_array($data['creators'])) {
            return [
                'success' => false,
                'error' => 'File JSON không đúng định dạng (thiếu "creators" array)',
                'updated' => 0,
                'created' => 0,
                'skipped' => 0,
                'errors' => [],
            ];
        }

        return $this->syncCreators($data['creators'], $orgHex, $userIdHex);
    }

    /**
     * Đồng bộ mảng dữ liệu creator vào database.
     */
    public function syncCreators(array $creators, string $orgHex, string $userIdHex): array
    {
        $orgBin = IdFormatter::hexToBinary($orgHex);
        $userBin = IdFormatter::hexToBinary($userIdHex);

        if (!$orgBin) {
            return [
                'success' => false,
                'error' => 'Organization ID không hợp lệ',
                'updated' => 0,
                'created' => 0,
                'skipped' => 0,
                'errors' => [],
            ];
        }

        $stats = [
            'success' => true,
            'updated' => 0,
            'created' => 0,
            'skipped' => 0,
            'errors' => [],
        ];

        foreach ($creators as $item) {
            try {
                // Chỉ xử lý creator tìm thấy có dữ liệu
                if (empty($item['status']) || $item['status'] !== 'found') {
                    $stats['skipped']++;
                    continue;
                }

                $result = $this->syncSingleCreator($item, $orgBin, $userBin, $orgHex);

                if ($result['action'] === 'updated') {
                    $stats['updated']++;
                } elseif ($result['action'] === 'created') {
                    $stats['created']++;
                } else {
                    $stats['skipped']++;
                }
            } catch (\Throwable $e) {
                $name = $item['creator_name'] ?? 'unknown';
                $stats['errors'][] = "{$name}: {$e->getMessage()}";
            }
        }

        return $stats;
    }

    /**
     * Đồng bộ 1 creator:
     * - Nếu đã tồn tại (tìm theo creator_name + organization_id) → cập nhật
     * - Nếu chưa tồn tại → tạo mới
     */
    protected function syncSingleCreator(array $item, string $orgBin, ?string $userBin, string $orgHex): array
    {
        $creatorName = trim($item['creator_name'] ?? '');

        if (empty($creatorName)) {
            return ['action' => 'skipped'];
        }

        // Map dữ liệu từ scrape sang DB fields
        $dbData = $this->mapScrapedData($item);

        // Tìm creator theo tên trong organization
        $existing = Creator::where('creator_name', $creatorName)
            ->where('organization_id', $orgBin)
            ->first();

        if ($existing) {
            // Cập nhật — chỉ ghi đè nếu có dữ liệu mới
            $updateData = [];
            foreach ($dbData as $field => $value) {
                if ($value !== null && $value !== '') {
                    $updateData[$field] = $value;
                }
            }

            if (!empty($updateData)) {
                $existing->update($updateData);

                AuditLog::log(
                    'update_koc',
                    'koc',
                    $existing->hex_id,
                    $creatorName,
                    "Tự động cập nhật từ TikTok Affiliate\n" . $this->buildAuditDetails($updateData),
                    'tiktok-sync'
                );
            }

            return ['action' => 'updated'];
        }

        // Tạo mới creator
        $dbData['id'] = Uuid::uuid7Binary();
        $dbData['organization_id'] = $orgBin;
        $dbData['created_by_id'] = $userBin;

        Creator::create($dbData);

        AuditLog::log(
            'create_koc',
            'koc',
            bin2hex($dbData['id']),
            $creatorName,
            "Tự động tạo từ TikTok Affiliate\n" . $this->buildAuditDetails($dbData),
            'tiktok-sync'
        );

        return ['action' => 'created'];
    }

    /**
     * Map dữ liệu scrape → DB columns
     */
    protected function mapScrapedData(array $item): array
    {
        $data = [
            'creator_name' => trim($item['creator_name'] ?? ''),
            'tiktok_link' => $this->cleanUrl($item['tiktok_link'] ?? null),
            'followers' => $this->normalizeInt($item['followers'] ?? null),
            'average_views' => $this->normalizeInt($item['average_views'] ?? null),
            'audience' => $item['audience'] ?? null,
            'advantages' => $item['advantages'] ?? null,
            'notes' => $item['notes'] ?? null,
        ];

        // Xóa field null/empty
        return array_filter($data, fn ($v) => $v !== null && $v !== '');
    }

    protected function cleanUrl(?string $url): ?string
    {
        if (empty($url)) return null;
        $url = trim($url);
        return filter_var($url, FILTER_VALIDATE_URL) ? $url : null;
    }

    protected function normalizeInt($value): ?int
    {
        if ($value === null || $value === '' || $value === 0) return null;
        return (int) $value;
    }

    protected function buildAuditDetails(array $data): string
    {
        $labels = [
            'creator_name' => 'Tên KOC',
            'tiktok_link' => 'Link TikTok',
            'followers' => 'Followers',
            'average_views' => 'View TB',
            'audience' => 'Tệp KH',
            'advantages' => 'Lợi thế',
            'notes' => 'Ghi chú',
        ];

        $lines = [];
        foreach ($data as $key => $val) {
            $label = $labels[$key] ?? $key;
            if ($val !== null && $val !== '') {
                if (is_int($val)) {
                    $lines[] = "{$label}: " . number_format($val, 0, ',', '.');
                } else {
                    $lines[] = "{$label}: {$val}";
                }
            }
        }

        return implode("\n", $lines);
    }
}
