/**
 * shipSkinFactories — фабрики 2D-текстур "ship-обложек" для куба в ship-режиме.
 *
 * Концепция (как в Geometry Dash): куб остаётся кубом по геометрии, но в ship-режиме
 * на его грани накладывается текстура с силуэтом корабля сбоку. Когда камера смотрит
 * на куб сбоку (sideview) — выглядит как настоящий кораблик.
 *
 * Каждая фабрика = функция (ctx, primary, secondary, time?) => void, рисует на
 * canvas 256×256. Возвращаемый canvas → dataURL → game.scene.setTexture(REF_BODY).
 *
 * primary/secondary — hex-цвета (зависят от выбранного skin-color куба).
 */

const SIZE = 256;

// ---- утилиты ----
function clear(ctx, color) {
    ctx.fillStyle = color;
    ctx.fillRect(0, 0, SIZE, SIZE);
}

function shape(ctx, color, points, stroke = null, strokeWidth = 4) {
    ctx.fillStyle = color;
    ctx.beginPath();
    ctx.moveTo(points[0][0], points[0][1]);
    for (let i = 1; i < points.length; i++) ctx.lineTo(points[i][0], points[i][1]);
    ctx.closePath();
    ctx.fill();
    if (stroke) {
        ctx.strokeStyle = stroke;
        ctx.lineWidth = strokeWidth;
        ctx.stroke();
    }
}

function filledCircle(ctx, color, cx, cy, r) {
    ctx.fillStyle = color;
    ctx.beginPath();
    ctx.arc(cx, cy, r, 0, Math.PI * 2);
    ctx.fill();
}

function filledRect(ctx, color, x, y, w, h) {
    ctx.fillStyle = color;
    ctx.fillRect(x, y, w, h);
}

function gradientBG(ctx, color1, color2) {
    const g = ctx.createLinearGradient(0, 0, 0, SIZE);
    g.addColorStop(0, color1);
    g.addColorStop(1, color2);
    ctx.fillStyle = g;
    ctx.fillRect(0, 0, SIZE, SIZE);
}

// =========================================================================
// SHIP SKINS (15 моделей)
// Нос корабля — направлен ВПРАВО (куб бежит по +X).
// =========================================================================

/** v1 — Классический: серебристый корпус с синим окном. */
function shipClassic(ctx, primary, secondary) {
    gradientBG(ctx, '#1a2a3a', '#0a1525');
    // Корпус — длинный овал
    shape(ctx, primary, [
        [40, 140], [80, 100], [180, 90], [225, 128],
        [180, 165], [80, 175],
    ], secondary, 4);
    // Окошко
    filledCircle(ctx, '#88ccff', 145, 115, 18);
    filledCircle(ctx, '#ffffff', 150, 110, 6);
    // Хвост-крыло
    shape(ctx, secondary, [[40, 140], [25, 100], [60, 130]]);
    shape(ctx, secondary, [[40, 165], [25, 200], [60, 175]]);
    // Огонь сзади
    shape(ctx, '#ff8833', [[10, 150], [40, 138], [40, 167], [10, 155]]);
    shape(ctx, '#ffe44a', [[15, 150], [35, 143], [35, 162], [15, 155]]);
}

/** v2 — Истребитель: красный острый с дельтой. */
function shipFighter(ctx, primary, secondary) {
    gradientBG(ctx, '#2a0a0a', '#100505');
    shape(ctx, '#dd2222', [
        [30, 145], [80, 90], [220, 128], [80, 165],
    ], '#660000', 4);
    // Окошко тёмное
    filledCircle(ctx, '#222', 145, 110, 14);
    // Крылья
    shape(ctx, '#aa1111', [[60, 110], [50, 50], [110, 105]]);
    shape(ctx, '#aa1111', [[60, 145], [50, 205], [110, 150]]);
    // Сопло
    shape(ctx, '#ff5511', [[10, 130], [30, 122], [30, 152], [10, 145]]);
}

/** v3 — Шаттл бело-синий. */
function shipShuttle(ctx, primary, secondary) {
    gradientBG(ctx, '#1a2540', '#0a1530');
    shape(ctx, '#f0f0f0', [
        [35, 130], [60, 90], [180, 90], [225, 128],
        [180, 165], [60, 165],
    ], '#3366aa', 3);
    // Окошки в ряд
    filledRect(ctx, '#4488dd', 80, 105, 90, 15);
    filledRect(ctx, '#bbddff', 85, 108, 80, 9);
    // Крыло сверху и снизу
    shape(ctx, '#2266aa', [[80, 90], [105, 50], [155, 50], [180, 90]]);
    shape(ctx, '#2266aa', [[80, 165], [105, 205], [155, 205], [180, 165]]);
    // Два сопла
    shape(ctx, '#4488ff', [[10, 110], [35, 105], [35, 125], [10, 120]]);
    shape(ctx, '#4488ff', [[10, 145], [35, 140], [35, 160], [10, 155]]);
}

/** v4 — НЛО (диск). */
function shipUfo(ctx, primary, secondary) {
    gradientBG(ctx, '#0a1525', '#000005');
    // Диск
    shape(ctx, '#aaaaaa', [
        [25, 140], [80, 115], [180, 115], [230, 140],
        [180, 165], [80, 165],
    ], '#444', 4);
    // Купол
    filledCircle(ctx, '#88ccff', 128, 100, 35);
    filledCircle(ctx, '#aaeeff', 122, 95, 22);
    // Лампочки снизу
    filledCircle(ctx, '#ffe44a', 70, 165, 6);
    filledCircle(ctx, '#ffe44a', 128, 175, 6);
    filledCircle(ctx, '#ffe44a', 188, 165, 6);
}

/** v5 — Биплан. */
function shipBiplane(ctx, primary, secondary) {
    gradientBG(ctx, '#1a2030', '#0a1020');
    // Корпус коричневый
    shape(ctx, '#cc9933', [
        [40, 135], [70, 110], [200, 115], [225, 128], [200, 142], [70, 145],
    ], '#664400', 3);
    // Винт
    filledRect(ctx, '#222', 220, 80, 6, 95);
    // Два крыла
    filledRect(ctx, '#ddaa44', 60, 65, 130, 12);
    filledRect(ctx, '#aa7722', 60, 180, 130, 12);
    // Стойки между крыльями
    filledRect(ctx, '#cc9933', 75, 77, 4, 103);
    filledRect(ctx, '#cc9933', 175, 77, 4, 103);
    // Кокпит
    filledCircle(ctx, '#333', 140, 115, 12);
}

/** v6 — Сфера. */
function shipSphere(ctx, primary, secondary) {
    gradientBG(ctx, '#0a2010', '#001005');
    filledCircle(ctx, '#44aa66', 128, 128, 80);
    // Полоса
    filledRect(ctx, '#ddee44', 48, 124, 160, 8);
    // Антенна
    filledRect(ctx, '#888', 125, 30, 4, 30);
    filledCircle(ctx, '#ff4444', 127, 30, 8);
    // Окно
    filledCircle(ctx, '#88ccff', 165, 120, 14);
}

/** v7 — Стелс (чёрный). */
function shipStealth(ctx, primary, secondary) {
    gradientBG(ctx, '#0a0a14', '#000000');
    // Треугольник плоский
    shape(ctx, '#1a1a22', [
        [30, 130], [60, 80], [225, 128], [60, 175],
    ], '#444', 2);
    // Красная подсветка
    shape(ctx, '#ff2222', [[40, 155], [220, 130], [40, 162]]);
    // Окошко
    filledRect(ctx, '#330000', 145, 120, 25, 12);
}

/** v8 — Ракета (длинная). */
function shipRocket(ctx, primary, secondary) {
    gradientBG(ctx, '#1a1a25', '#0a0a15');
    // Тело белое
    shape(ctx, '#eeeeee', [
        [40, 120], [180, 120], [220, 128], [180, 145], [40, 145],
    ], '#888', 3);
    // Нос красный
    shape(ctx, '#dd2222', [[180, 120], [225, 128], [180, 145]]);
    // 4 фины хвоста
    shape(ctx, '#dd2222', [[40, 120], [20, 95], [70, 120]]);
    shape(ctx, '#dd2222', [[40, 145], [20, 175], [70, 145]]);
    // Окно
    filledCircle(ctx, '#88ccff', 110, 132, 8);
    // Огонь
    shape(ctx, '#ffe44a', [[10, 125], [40, 128], [40, 140], [10, 140]]);
    shape(ctx, '#ff6611', [[18, 128], [40, 130], [40, 138], [18, 138]]);
}

/** v9 — Дрон. */
function shipDrone(ctx, primary, secondary) {
    gradientBG(ctx, '#0a0a15', '#000005');
    // Тело по центру
    filledRect(ctx, '#222230', 100, 110, 60, 40);
    filledRect(ctx, '#ff0000', 145, 122, 10, 6);  // LED
    // 4 пропеллера по углам
    for (let cx of [70, 190]) {
        for (let cy of [85, 175]) {
            // ножка от центра
            const dx = cx > 128 ? -1 : 1;
            const dy = cy > 128 ? -1 : 1;
            ctx.strokeStyle = '#444';
            ctx.lineWidth = 4;
            ctx.beginPath();
            ctx.moveTo(cx, cy);
            ctx.lineTo(cx + dx * 25, cy + dy * 25);
            ctx.stroke();
            // диск пропеллера
            ctx.globalAlpha = 0.5;
            filledCircle(ctx, '#88aabb', cx, cy, 18);
            ctx.globalAlpha = 1;
            filledCircle(ctx, '#222', cx, cy, 5);
        }
    }
}

/** v10 — Воздушный шар (роуз+корзина). */
function shipBalloon(ctx, primary, secondary) {
    gradientBG(ctx, '#2a1525', '#0a0510');
    // Шар
    filledCircle(ctx, '#dd3366', 128, 95, 60);
    // Полосы
    ctx.strokeStyle = '#aa1144';
    ctx.lineWidth = 3;
    ctx.beginPath(); ctx.arc(128, 95, 60, 0, Math.PI * 2); ctx.stroke();
    ctx.beginPath(); ctx.moveTo(68, 95); ctx.lineTo(188, 95); ctx.stroke();
    ctx.beginPath(); ctx.moveTo(128, 35); ctx.lineTo(128, 155); ctx.stroke();
    // Корзина
    filledRect(ctx, '#996644', 108, 180, 40, 25);
    filledRect(ctx, '#553311', 108, 175, 40, 5);
    // Верёвки
    ctx.strokeStyle = '#553311';
    ctx.lineWidth = 2;
    for (let dx of [-15, -5, 5, 15]) {
        ctx.beginPath(); ctx.moveTo(128 + dx, 150); ctx.lineTo(128 + dx, 180); ctx.stroke();
    }
}

/** v11 — Золотой. */
function shipGolden(ctx, primary, secondary) {
    gradientBG(ctx, '#2a2010', '#0a0805');
    // Корпус золотой
    shape(ctx, '#ffd700', [
        [35, 135], [75, 95], [185, 95], [225, 128],
        [185, 160], [75, 160],
    ], '#aa7700', 4);
    // Окошко тёмное
    filledCircle(ctx, '#221100', 145, 110, 16);
    filledCircle(ctx, '#664400', 148, 107, 6);
    // Крылья двойные
    shape(ctx, '#cc9900', [[75, 95], [95, 50], [135, 50], [115, 95]]);
    shape(ctx, '#cc9900', [[75, 160], [95, 205], [135, 205], [115, 160]]);
    // Декоративная полоса
    filledRect(ctx, '#ffeb55', 80, 125, 100, 6);
    // Огонь
    shape(ctx, '#ff8811', [[10, 120], [35, 125], [35, 145], [10, 140]]);
    shape(ctx, '#ffe44a', [[18, 125], [35, 128], [35, 142], [18, 138]]);
}

/** v12 — Хром. */
function shipChrome(ctx, primary, secondary) {
    // Зеркальный фон
    const g = ctx.createLinearGradient(0, 0, SIZE, SIZE);
    g.addColorStop(0, '#445566');
    g.addColorStop(0.5, '#bbccdd');
    g.addColorStop(1, '#445566');
    ctx.fillStyle = g; ctx.fillRect(0, 0, SIZE, SIZE);
    // Корпус
    shape(ctx, '#eeeeff', [
        [35, 135], [75, 95], [185, 95], [225, 128],
        [185, 160], [75, 160],
    ], '#778899', 3);
    // Блик
    filledRect(ctx, '#ffffff', 90, 100, 80, 6);
    // Кокпит
    filledCircle(ctx, '#3399ff', 145, 115, 16);
    filledCircle(ctx, '#aaddff', 142, 110, 7);
    // Крыло
    shape(ctx, '#ccccdd', [[75, 160], [50, 195], [120, 165]]);
    // Сопло
    shape(ctx, '#44aaff', [[10, 122], [35, 125], [35, 145], [10, 142]]);
}

/** v13 — Пришелец. */
function shipAlien(ctx, primary, secondary) {
    gradientBG(ctx, '#0a2a10', '#001005');
    // Тело — горизонтальный овал
    shape(ctx, '#33aa44', [
        [40, 128], [80, 90], [180, 90], [220, 128],
        [180, 165], [80, 165],
    ], '#226633', 3);
    // 3 глаза
    filledCircle(ctx, '#ffee22', 165, 110, 10);
    filledCircle(ctx, '#ffee22', 180, 128, 10);
    filledCircle(ctx, '#ffee22', 165, 145, 10);
    filledCircle(ctx, '#000', 167, 110, 4);
    filledCircle(ctx, '#000', 182, 128, 4);
    filledCircle(ctx, '#000', 167, 145, 4);
    // Щупальце-хвост
    for (let i = 0; i < 4; i++) {
        filledCircle(ctx, '#338844', 50 - i * 12, 128 + i * 6, 12 - i * 2);
    }
}

/** v14 — Парусник. */
function shipSailship(ctx, primary, secondary) {
    gradientBG(ctx, '#1a2540', '#0a1530');
    // Корпус
    shape(ctx, '#996644', [
        [40, 150], [70, 130], [200, 130], [225, 150],
        [200, 175], [70, 175],
    ], '#553311', 3);
    // Мачта
    filledRect(ctx, '#553311', 130, 50, 4, 80);
    // Парус
    shape(ctx, '#f0f0e0', [[134, 60], [200, 90], [134, 120]], '#888', 2);
    // Флаг
    shape(ctx, '#dd2222', [[130, 50], [115, 45], [130, 60]]);
}

/** v15 — Капсула. */
function shipCapsule(ctx, primary, secondary) {
    gradientBG(ctx, '#0a1525', '#000005');
    // Овальное тело белое
    shape(ctx, '#f0f0f0', [
        [50, 130], [70, 95], [190, 95], [220, 128],
        [190, 160], [70, 160],
    ], '#999', 3);
    // Синяя полоса
    filledRect(ctx, '#3399ff', 60, 124, 160, 8);
    // Окошко
    filledCircle(ctx, '#1144aa', 160, 128, 18);
    filledCircle(ctx, '#88ccff', 155, 122, 8);
    // Сопло
    shape(ctx, '#ff8833', [[15, 122], [50, 125], [50, 142], [15, 140]]);
}

// =========================================================================
// КАТАЛОГ
// =========================================================================
export const SHIP_SKIN_CATALOG = [
    { id: 'ss_v1',  title: 'Классический', draw: shipClassic },
    { id: 'ss_v2',  title: 'Истребитель',  draw: shipFighter },
    { id: 'ss_v3',  title: 'Шаттл',        draw: shipShuttle },
    { id: 'ss_v4',  title: 'НЛО',          draw: shipUfo },
    { id: 'ss_v5',  title: 'Биплан',       draw: shipBiplane },
    { id: 'ss_v6',  title: 'Сфера',        draw: shipSphere },
    { id: 'ss_v7',  title: 'Стелс',        draw: shipStealth },
    { id: 'ss_v8',  title: 'Ракета',       draw: shipRocket },
    { id: 'ss_v9',  title: 'Дрон',         draw: shipDrone },
    { id: 'ss_v10', title: 'Воздушный шар', draw: shipBalloon },
    { id: 'ss_v11', title: 'Золотой',      draw: shipGolden },
    { id: 'ss_v12', title: 'Хром',         draw: shipChrome },
    { id: 'ss_v13', title: 'Пришелец',     draw: shipAlien },
    { id: 'ss_v14', title: 'Парусник',     draw: shipSailship },
    { id: 'ss_v15', title: 'Капсула',      draw: shipCapsule },
];

/** Перерисовать canvas со скином корабля. */
export function renderShipSkin(canvas, skinId, primary = '#66ff66', secondary = '#44aa44', time = 0) {
    const skin = SHIP_SKIN_CATALOG.find(s => s.id === skinId);
    if (!skin) return;
    const ctx = canvas.getContext('2d');
    ctx.imageSmoothingEnabled = false;
    skin.draw(ctx, primary, secondary, time);
}
