// common/js/order-scraper-common.js
// 订单抓取脚本的共用基础设施：tiddp（Toast） + getCookies（cookie 取值）
//
// 为什么独立一个文件：
//   product/tb.js、product/pdd.js、product/1688.js 原本各自在 IIFE 内重复定义了
//   同样的 tiddp 和 getCookies（字节近似一致）。抽到 content script 外层作用域
//   后，三个 IIFE 会通过作用域链拿到这里的定义。
//
// 加载顺序要求：
//   manifest.json 的 content_scripts.js 数组里，此文件必须在
//   product/tb.js、product/pdd.js、product/1688.js 之前。
//
// 注意：
//   product/ozon.js 里的 tiddp 有差异（半透明背景、无 min-width），
//   它有自己的版本，不应共用这里的实现。
//   js/adtnfosku.js 和 background.js 也各自有 getCookies 实现（不同上下文），
//   本文件不影响它们。

function tiddp(msg, t = 1500) {
    var m = document.createElement('div');
    m.style.cssText =
        'display:inline-block;padding:10px 20px;color:#fff;text-align:center;' +
        'border-radius:8px;position:fixed;top:50%;left:50%;' +
        'transform:translate(-50%,-50%);z-index:999999999;' +
        'background:rgb(25,36,58);font-size:16px;min-width:400px;' +
        'box-shadow:0 4px 8px rgba(0,0,0,0.2);transition:opacity 0.3s ease;';
    m.innerHTML = msg;
    document.body.appendChild(m);
    setTimeout(function () {
        if (m.parentNode) m.parentNode.removeChild(m);
    }, t);
}

function getCookies() {
    return new Promise(function (resolve) {
        try {
            chrome.runtime.sendMessage(
                {
                    type: 'getCookie',
                    url: config.url.domainz(),
                    name: config.cookieName11,
                },
                function (token) {
                    if (token) {
                        resolve({ token: token });
                    } else {
                        resolve('');
                    }
                }
            );
        } catch (e) {
            resolve('');
        }
    });
}

// -----------------------------------------------------------------------------
// 订单上传：国内订单匹配（matchDomesticOrder）共享实现
//
// 原本 product/tb.js 和 product/1688.js 都有 ~60 行的 sendOrderData，几乎逐字
// 一致；product/pdd.js 里把同样的 HTTP POST 逻辑 inline 在了 poacwewe 里。
// 这里抽成单点实现。平台差异通过 meta 参数注入：
//   meta.qtype       订单来源分类（tb=2、1688=3、pdd=1）
//   meta.statusMap   { '已发货': 2, ..., _empty: 4, _default: 1 } 状态文案到状态码映射
// -----------------------------------------------------------------------------

// 订单状态文案 → 数字状态码
function mapOrderStatus(prompt, statusMap) {
    if (!statusMap) return 1;
    if ((!prompt || prompt === '') && statusMap._empty != null) return statusMap._empty;
    if (prompt in statusMap) return statusMap[prompt];
    return statusMap._default != null ? statusMap._default : 1;
}

// 单笔订单上传；resolve 传 { ok, response, ddstatus }
function submitDomesticOrder(originalOrder, token, meta) {
    var ddstatus = mapOrderStatus(originalOrder.prompt, meta.statusMap);
    var payload = {
        domestic_order_number: originalOrder.orderid,
        pic: originalOrder.pic,
        qtype: meta.qtype,
        express: originalOrder.number,
        ddstatus: ddstatus,
    };
    var remaining = typeof meta.getRemaining === 'function' ? meta.getRemaining() : '';
    return new Promise(function (resolve) {
        chrome.runtime.sendMessage(
            {
                action: 'httpRequest',
                url: config.url.matchDomesticOrder(),
                method: 'POST',
                headers: {
                    Authorization: token,
                    'Content-Type': 'application/json',
                },
                params: payload,
            },
            function (response) {
                if (response && response.error) {
                    console.error('订单' + originalOrder.orderid + '上传失败:', response.error);
                    tiddp(remaining + '：上传失败：id' + originalOrder.orderid + ' 错误信息：' + response.error);
                    resolve({ ok: false, response: response, ddstatus: ddstatus });
                } else {
                    tiddp(
                        remaining + '：上传成功：id' + originalOrder.orderid +
                        '价格：' + originalOrder.pic +
                        '：' + originalOrder.prompt +
                        '(' + ddstatus + ')：' + originalOrder.number +
                        ' 响应信息：' + ((response && response.msg) || '成功')
                    );
                    resolve({ ok: true, response: response, ddstatus: ddstatus });
                }
            }
        );
    });
}

// 批量顺序上传；支持中途停止（shouldContinue()）和间隔节流
async function submitDomesticOrdersBatch(orders, token, meta) {
    if (!orders || orders.length === 0 || !token) return;
    var intervalMs = meta.intervalMs || 0;
    for (var i = 0; i < orders.length; i++) {
        if (typeof meta.shouldContinue === 'function' && !meta.shouldContinue()) break;
        await submitDomesticOrder(orders[i], token, meta);
        if (i < orders.length - 1 && intervalMs > 0) {
            await new Promise(function (r) { setTimeout(r, intervalMs); });
        }
    }
}

// -----------------------------------------------------------------------------
// 订单抓取控制面板（2 输入 + 1 按钮）
//
// 3 个订单抓取文件原来各自写了结构完全相同、仅 class 名与一两个文案不同的 HTML。
// 这里统一成 factory 函数，CSS 只插一次（幂等）。
//
// opts.countLabel     计数输入框前的文案（tb/1688 = '上传几页'、pdd = '上传前面几个'）
// opts.intervalDefault 默认的间隔毫秒（如未指定 localStorage.poacewe）
// opts.countDefault    默认的数量（如未指定 localStorage.poacewe2）
//
// 返回的是 jQuery 元素，原文件继续用 vad.find('#sinda1d') / #sinda2d / #poacewew。
// -----------------------------------------------------------------------------

// -----------------------------------------------------------------------------
// 点击"上传订单"按钮后的前置检查（URL 匹配 / count / cookie），成功则返回 token
// 并把按钮切到"停止上传"红色。失败时已经弹过对应的 tiddp 提示，返回 null。
//
// 原本 tb.js/pdd.js/1688.js 各自重写了这段 13 行代码：
//   if (urlMatch) { if (count) { const cookie = await getCookies(); ... } else ... }
// 现在：const token = await preflightUpload($btn, opts); if (!token) return;
//
// 调用方需要自行管理 offs/opacewe/opacewe2（本函数不触碰这些局部状态），
// 只负责前置校验 + 按钮样式切换。
// -----------------------------------------------------------------------------
async function preflightUpload($btn, opts) {
    opts = opts || {};
    if (typeof opts.siteMatch === 'function' && !opts.siteMatch(location.href)) {
        tiddp(opts.siteMismatchMsg || '请在目标平台页面使用此功能', 2000);
        return null;
    }
    if (typeof opts.getCount === 'function' && !opts.getCount()) {
        tiddp(opts.emptyCountMsg || '请输入上传前几个数量');
        return null;
    }
    var cookie = await getCookies();
    if (!cookie || !cookie.token) {
        tiddp('用户未登录，请先登录', 2000);
        return null;
    }
    $btn.text('停止上传').css('background-color', '#F44336');
    return cookie.token;
}

function createOrderPanel(opts) {
    opts = opts || {};
    // CSS 只注入一次
    if (!document.getElementById('qe-order-panel-style')) {
        var styleEl = document.createElement('style');
        styleEl.id = 'qe-order-panel-style';
        styleEl.textContent =
            '.qe-order-panel{cursor:pointer;width:100%;z-index:9999994;color:#020202;background:#fcfcfc;margin:auto;text-align:center;font-size:10px;padding:6px}' +
            '.qe-order-panel .qe-order-btn{color:#fffefc;border:none;background:linear-gradient(135deg,#1e88e5,#1565c0);border-radius:999px;padding:5px 6px;width:100%}' +
            '.qe-order-panel .qe-order-btn:hover{filter:brightness(1.1)}' +
            '.qe-order-panel .qe-order-input{text-align:center;height:27px;border-width:1px;outline:0;border-style:solid;border-color:#3A5A8A;width:100%;color:rgb(33,57,92);margin:5px 0;border-radius:4px}';
        document.head.appendChild(styleEl);
    }
    var countLabel = opts.countLabel || '上传前面几个';
    var intervalDefault = opts.intervalDefault || 2000;
    var countDefault = opts.countDefault || 30;
    var html =
        '<div class="qe-order-panel">' +
            '<text class="shang_ty">间隔毫秒：</text>' +
            '<input type="text" id="sinda1d" autocomplete="off" class="qe-order-input" style="width:56px;">' +
            '<br/><br/>' +
            '<text class="shang_ty">' + countLabel + '：</text>' +
            '<input type="text" id="sinda2d" autocomplete="off" class="qe-order-input" style="width:56px;">' +
            '<br/><br/>' +
            '<button type="button" class="qe-order-btn" id="poacewew">上传订单</button>' +
        '</div>';
    var $el = $(html);
    $el.find('#sinda1d').val(localStorage.poacewe || intervalDefault);
    $el.find('#sinda2d').val(localStorage.poacewe2 || countDefault);
    return $el;
}
