/**
 * seed-red-book-extra.js
 * Добавляет дополнительные виды, сезонность и пищевые связи.
 * Запуск: node src/db/seed-red-book-extra.js  (из папки backend/)
 * Идемпотентен — не дублирует существующие виды.
 */
require('./migrate');
const db = require('./db');

/* ── helpers ── */
const groupRow   = (name) => db.prepare("SELECT id FROM rb_groups WHERE name_ru = ?").get(name);
const habitatRow = (type) => db.prepare("SELECT id FROM rb_habitats WHERE type = ?").get(type);

const insSp = db.prepare(`
  INSERT INTO rb_species
    (group_id, habitat_id, name_ru, name_be, name_lat, category, by_category,
     description, interesting_fact, threats, conservation, where_to_see,
     photo_url, model_type, population_trend, biomass_kg, season_active)
  VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)
`);
const insReg = db.prepare('INSERT OR IGNORE INTO rb_species_regions (species_id, region_code) VALUES (?,?)');
const insWeb = db.prepare('INSERT OR IGNORE INTO rb_food_web (predator_id, prey_id, strength) VALUES (?,?,?)');

function addSp(data) {
  // Guard: skip if already exists by name_ru
  const existing = db.prepare("SELECT id FROM rb_species WHERE name_ru = ?").get(data.name_ru);
  if (existing) return existing.id;

  const gid = groupRow(data.group)?.id;
  const hid = habitatRow(data.habitat)?.id || null;
  if (!gid) { console.warn(`Group not found: ${data.group}`); return null; }

  const id = insSp.run(
    gid, hid,
    data.name_ru, data.name_be || '', data.name_lat || '',
    data.category, data.by_category || 'III',
    data.description || '', data.fact || '',
    JSON.stringify(data.threats || []),
    data.conservation || '', data.where_to_see || '',
    data.photo || '', data.model || 'silhouette',
    JSON.stringify(data.trend || []),
    data.biomass || 0,
    JSON.stringify(data.seasons || []),
  ).lastInsertRowid;

  (data.regions || []).forEach(r => insReg.run(id, r));
  return id;
}

/* ── existing ids by name ── */
function getId(name) {
  const r = db.prepare("SELECT id FROM rb_species WHERE name_ru = ?").get(name);
  return r?.id || null;
}

db.exec('BEGIN');

/* ══════════════════════════════════════════════════════════════════════════
   НОВЫЕ ВИДЫ — ПТИЦЫ
   ══════════════════════════════════════════════════════════════════════════ */

const pukhlyak = addSp({
  group: 'Птицы', habitat: 'conifer',
  name_ru: 'Пухляк (гаичка буроголовая)', name_be: 'Мухаловка шэрая', name_lat: 'Poecile montanus',
  category: 'NT', by_category: 'IV',
  description: 'Небольшая птица хвойных лесов, запасающая корм в тайниках на зиму. Способна запомнить сотни тайников одновременно. Активна круглый год, не покидает территорию даже в сильные морозы.',
  fact: 'Пухляк запасает до 2000 семян за осень, запоминая каждое место с точностью до нескольких сантиметров.',
  threats: ['Вырубка ельников', 'Конкуренция с синицами'],
  conservation: 'Сохранение разновозрастных хвойных лесов.',
  where_to_see: 'Беловежская пуща, Налибокская пуща, Нарочанский НП',
  biomass: 0.012, seasons: ['10','11','12','1','2','3'],
  regions: ['vitebsk','minsk','grodno'],
});

const lebed = addSp({
  group: 'Птицы', habitat: 'river',
  name_ru: 'Лебедь-шипун', name_be: 'Лебедзь-шыпун', name_lat: 'Cygnus olor',
  category: 'NT', by_category: 'IV',
  description: 'Один из крупнейших летающих птиц мира — масса до 14 кг. Агрессивно защищает гнездо от любых нарушителей. Пары создаются на много лет. В Беларуси гнездится на озёрах, прудах и медленных реках.',
  fact: 'Лебедь-шипун — самая тяжёлая из всех летающих птиц. Чтобы взлететь, ему нужно пробежать по воде 40–50 м.',
  threats: ['Рекреационная нагрузка', 'Свинцовое отравление', 'Беспокойство у гнёзд'],
  conservation: 'Охранные зоны у гнёзд. Ограничение водно-моторного спорта.',
  where_to_see: 'Браславские озёра, Нарочанский НП, Минское море',
  biomass: 10.0, seasons: ['4','5','6','7','8'],
  regions: ['vitebsk','minsk','brest','grodno'],
});

const klikun = addSp({
  group: 'Птицы', habitat: 'river',
  name_ru: 'Лебедь-кликун', name_be: 'Лебедзь-крыкун', name_lat: 'Cygnus cygnus',
  category: 'VU', by_category: 'II',
  description: 'Перелётный лебедь, зимующий в Беларуси. В отличие от шипуна держит шею прямо. Мощный трубный крик слышен далеко. Небольшая гнездовая популяция в Витебской области значительно выросла за последние 30 лет.',
  fact: 'Лебедь-кликун мигрирует на высоте до 8000 м. Зафиксированы особи, долетавшие из Западной Сибири.',
  threats: ['Беспокойство', 'Отравление свинцом', 'Недостаток спокойных зимовальных мест'],
  conservation: 'Охранные зоны. Запрет охоты.',
  where_to_see: 'Браславские озёра (зимовка), Витебская область (гнездование)',
  biomass: 9.0, seasons: ['10','11','12','1','2','3'],
  regions: ['vitebsk','minsk'],
});

const domovoy_sych = addSp({
  group: 'Птицы', habitat: 'meadow',
  name_ru: 'Сыч домовый', name_be: 'Хатні сычык', name_lat: 'Athene noctua',
  category: 'EN', by_category: 'II',
  description: 'Маленькая сова агроландшафтов, живущая в старых постройках, скалах и пнях. Активна в сумерках. В Беларуси редкость — известны единицы гнездовых пар. Численность катастрофически снизилась из-за химизации сельского хозяйства.',
  fact: 'Домовый сыч ловит до 600 мышей и 2000 насекомых в год, являясь природным регулятором грызунов.',
  threats: ['Применение пестицидов', 'Снижение числа старых построек', 'Кошки'],
  conservation: 'Установка гнездовых ящиков. Ограничение пестицидов.',
  where_to_see: 'Брестская область (единичные пары)',
  biomass: 0.18, seasons: ['3','4','5','6','7','8','9'],
  regions: ['brest','gomel'],
});

const velik_kulak = addSp({
  group: 'Птицы', habitat: 'wetland',
  name_ru: 'Большой кроншнеп', name_be: 'Вялікі кроншнеп', name_lat: 'Numenius arquata',
  category: 'EN', by_category: 'II',
  description: 'Крупнейший кулик Беларуси с изогнутым книзу клювом. Гнездится на влажных лугах и болотах. Очень пуглив — уже с 500 метров покидает гнездо при появлении людей. Численность неуклонно сокращается.',
  fact: 'Большой кроншнеп может зондировать почву на глубину 15 см своим клювом, находя дождевых червей по осязанию.',
  threats: ['Ранний сенокос', 'Осушение лугов', 'Хищничество лисиц'],
  conservation: 'Отсрочка сенокоса. Сохранение пойменных лугов.',
  where_to_see: 'Пойма Припяти, Нарочанский НП',
  biomass: 0.7, seasons: ['4','5','6','7'],
  regions: ['brest','gomel','minsk','vitebsk'],
});

/* ══════════════════════════════════════════════════════════════════════════
   НОВЫЕ ВИДЫ — МЛЕКОПИТАЮЩИЕ
   ══════════════════════════════════════════════════════════════════════════ */

const zaets = addSp({
  group: 'Млекопитающие', habitat: 'forest',
  name_ru: 'Заяц-беляк', name_be: 'Заяц-белы', name_lat: 'Lepus timidus',
  category: 'NT', by_category: 'IV',
  description: 'Самый «белорусский» заяц — зимой его мех белеет, что обеспечивает маскировку на снегу. Предпочитает смешанные леса и опушки. Численность регулярно колеблется с периодом 10–11 лет в зависимости от популяции хищников.',
  fact: 'Заяц-беляк может развивать скорость до 70 км/ч и прыгать на 4 м в длину, уходя от преследователей.',
  threats: ['Волки', 'Лисы', 'Охота', 'Уменьшение подлеска'],
  conservation: 'Регулирование охотничьей нагрузки.',
  where_to_see: 'Все крупные леса Беларуси',
  biomass: 3.5, seasons: ['11','12','1','2','3'],
  regions: ['vitebsk','minsk','grodno','brest','gomel','mogilev'],
});

const lasitsa = addSp({
  group: 'Млекопитающие', habitat: 'meadow',
  name_ru: 'Ласка обыкновенная', name_be: 'Ласіца звычайная', name_lat: 'Mustela nivalis',
  category: 'NT', by_category: 'IV',
  description: 'Самый маленький хищник Беларуси весом 70–130 г. Способна следовать за мышами в их норы. Зимой меняет мех на белый. Настоящий «регулятор» популяций полёвок — за год уничтожает до 2000 грызунов.',
  fact: 'Ласка может убивать добычу, в 5 раз тяжелее себя — кроликов и крыс.',
  threats: ['Яды для грызунов', 'Уничтожение живых изгородей'],
  conservation: 'Ограничение использования родентицидов.',
  where_to_see: 'Луга и поля по всей Беларуси',
  biomass: 0.1, seasons: ['1','2','3','4','5','6','7','8','9','10','11','12'],
  regions: ['vitebsk','minsk','grodno','brest','gomel','mogilev'],
});

const night_bat = addSp({
  group: 'Млекопитающие', habitat: 'forest',
  name_ru: 'Широкоушка европейская', name_be: 'Шырокавухая кажан', name_lat: 'Barbastella barbastellus',
  category: 'EN', by_category: 'II',
  description: 'Редкая летучая мышь с характерными широкими ушами. Зимует в пещерах и подвалах. Охотится на ночных бабочек, улавливая их вибрации. Одна из наиболее уязвимых рукокрылых Европы.',
  fact: 'Широкоушка способна поймать до 2000 насекомых за ночь. Её эхолокация настолько совершенна, что она не задевает паутину.',
  threats: ['Утепление зданий', 'Химические обработки леса', 'Беспокойство в зимовочных убежищах'],
  conservation: 'Охрана зимовочных убежищ. Вывешивание летних домиков.',
  where_to_see: 'Беловежская пуща, старые здания Гродненской области',
  biomass: 0.01, seasons: ['4','5','6','7','8','9'],
  regions: ['grodno','brest','minsk'],
});

/* ══════════════════════════════════════════════════════════════════════════
   НОВЫЕ ВИДЫ — РАСТЕНИЯ
   ══════════════════════════════════════════════════════════════════════════ */

const kupena = addSp({
  group: 'Растения', habitat: 'forest',
  name_ru: 'Купена многоцветковая', name_be: 'Купена шматкветкавая', name_lat: 'Polygonatum multiflorum',
  category: 'NT', by_category: 'IV',
  description: 'Изящное тенелюбивое растение тёмных лесов с белыми колокольчатыми цветами. Плоды — тёмно-синие ягоды — ядовиты для человека, но поедаются птицами. Медленно растёт: возраст крупных особей может достигать 50 лет.',
  fact: 'Купена цветёт только один раз в жизни. Название происходит от «купель» — ранее растение применялось в народной медицине.',
  threats: ['Сбор на букеты', 'Рекреационная нагрузка', 'Вырубка лесов'],
  conservation: 'Запрет сбора. Включение в охраняемые участки.',
  where_to_see: 'Беловежская пуща, дубравы Полесья',
  biomass: 0.05, seasons: ['4','5','6'],
  regions: ['grodno','brest','gomel','minsk'],
});

const kruzhevnitsa = addSp({
  group: 'Растения', habitat: 'wetland',
  name_ru: 'Альдрованда пузырчатая', name_be: 'Альдрованда бурбалкавая', name_lat: 'Aldrovanda vesiculosa',
  category: 'CR', by_category: 'I',
  description: 'Единственное в мире водное хищное растение, не имеющее корней. Ловит водных беспозвоночных ловушками, напоминающими венерину мухоловку. Популяции в Беларуси — единственные в центральной Европе. Крайне чувствительна к загрязнению воды.',
  fact: 'Альдрованда — самое быстрое хищное растение в воде: захлопывает ловушку за 0.01 секунды.',
  threats: ['Загрязнение воды', 'Эвтрофикация', 'Зарастание водоёмов'],
  conservation: 'Охрана болотных водоёмов. Восстановление популяций.',
  where_to_see: 'Ольманские болота, Брестская область',
  biomass: 0.001, seasons: ['6','7','8'],
  regions: ['brest'],
});

const korolev_papor = addSp({
  group: 'Растения', habitat: 'forest',
  name_ru: 'Папоротник-орляк', name_be: 'Арляк звычайны', name_lat: 'Pteridium aquilinum',
  category: 'NT', by_category: 'IV',
  description: 'Один из древнейших видов флоры Беларуси — существует без изменений 55 миллионов лет. Образует обширные куртины в сосновых лесах. Молодые побеги («скрипухи») ядовиты для скота, но съедобны для людей после варки.',
  fact: 'Орляк — один из немногих папоротников, покрывающих более 1% суши Земли. Его корневища уходят на глубину 4 м.',
  threats: ['Интенсивные рубки', 'Пожары', 'Иссушение лесов'],
  conservation: 'Охрана старых лесов.',
  where_to_see: 'Хвойные леса по всей Беларуси',
  biomass: 0.3, seasons: ['5','6','7','8','9'],
  regions: ['vitebsk','minsk','grodno','brest','gomel','mogilev'],
});

/* ══════════════════════════════════════════════════════════════════════════
   НОВЫЕ ВИДЫ — НАСЕКОМЫЕ
   ══════════════════════════════════════════════════════════════════════════ */

const rosalia = addSp({
  group: 'Насекомые', habitat: 'forest',
  name_ru: 'Усач альпийский', name_be: 'Вусач альпійскі', name_lat: 'Rosalia alpina',
  category: 'EN', by_category: 'II',
  description: 'Один из красивейших жуков Европы — голубовато-серый с чёрными пятнами, с усами длиннее тела. Личинка живёт в мёртвой буковой древесине. В Беларуси встречается на границе ареала, в Беловежской пуще.',
  fact: 'Усач альпийский — один из символов охраны природы Европы. Его изображение есть на почтовых марках многих стран.',
  threats: ['Вырубка старых буков', 'Удаление мёртвой древесины'],
  conservation: 'Сохранение старых буковых деревьев и валежника.',
  where_to_see: 'Беловежская пуща',
  biomass: 0.003, seasons: ['6','7','8'],
  regions: ['brest'],
});

const pchela_plothnik = addSp({
  group: 'Насекомые', habitat: 'forest',
  name_ru: 'Пчела-плотник', name_be: 'Пчала-сталяр', name_lat: 'Xylocopa violacea',
  category: 'VU', by_category: 'III',
  description: 'Крупнейшая дикая пчела Беларуси — тело до 28 мм с фиолетово-синим блеском крыльев. Не живёт в ульях — самостоятельно прогрызает норы в сухой древесине. Важный опылитель с длинным хоботком для глубоких цветков.',
  fact: 'Пчела-плотник способна прогрызть тоннель длиной 30 см в дубовом бревне.',
  threats: ['Уборка старой и мёртвой древесины', 'Применение инсектицидов'],
  conservation: 'Сохранение старых деревьев. Установка гнездовых брёвен.',
  where_to_see: 'Беловежская пуща, старые сады Брестской области',
  biomass: 0.001, seasons: ['4','5','6','7','8'],
  regions: ['brest','grodno'],
});

const zelenyi_metallik = addSp({
  group: 'Насекомые', habitat: 'meadow',
  name_ru: 'Бронзовка гладкая', name_be: 'Бронзаўка гладкая', name_lat: 'Protaetia aeruginosa',
  category: 'EN', by_category: 'II',
  description: 'Жук с изумрудным металлическим блеском. Личинка развивается в дуплах старых дубов, питаясь перегноем. Взрослые особи питаются цветочным нектаром. Исчезает вместе с вековыми дубами.',
  fact: 'Бронзовка — «инженер экосистем»: личинки рыхлят перегной в дуплах, создавая субстрат для редких растений и других насекомых.',
  threats: ['Вырубка старых дубов', 'Исчезновение дупел', 'Применение инсектицидов'],
  conservation: 'Сохранение старовозрастных дубрав.',
  where_to_see: 'Беловежская пуща, дубравы Налибокской пущи',
  biomass: 0.002, seasons: ['5','6','7'],
  regions: ['brest','grodno','minsk'],
});

/* ══════════════════════════════════════════════════════════════════════════
   НОВЫЕ ВИДЫ — РЫБЫ
   ══════════════════════════════════════════════════════════════════════════ */

const som = addSp({
  group: 'Рыбы', habitat: 'river',
  name_ru: 'Сом обыкновенный', name_be: 'Сом звычайны', name_lat: 'Silurus glanis',
  category: 'NT', by_category: 'IV',
  description: 'Крупнейшая пресноводная рыба Беларуси — достигает 3 м длины и 200 кг. Ведёт ночной образ жизни. Охотится в основном на рыбу, но не брезгует птицами и млекопитающими. В старых реках встречались особи возрастом 60–80 лет.',
  fact: 'Сом может выползать на берег, чтобы охотиться на купающихся уток и голубей — этот феномен наблюдали на р. Биже в Испании.',
  threats: ['Браконьерство', 'Ухудшение качества воды', 'Перекрытие миграционных путей'],
  conservation: 'Ограничение промысла. Охрана нерестилищ.',
  where_to_see: 'Припять, Нёман, Днепр, Западная Двина',
  biomass: 30.0, seasons: ['5','6','7','8','9'],
  regions: ['brest','gomel','grodno','minsk','vitebsk','mogilev'],
});

const taimen = addSp({
  group: 'Рыбы', habitat: 'river',
  name_ru: 'Хариус европейский', name_be: 'Харыус еўрапейскі', name_lat: 'Thymallus thymallus',
  category: 'VU', by_category: 'III',
  description: 'Стремительная рыба холодных чистых рек с высоким, похожим на парус, спинным плавником. Индикатор качества воды — исчезает при малейшем загрязнении. Питается насекомыми, упавшими на поверхность воды.',
  fact: 'Хариус умеет «читать» поверхность воды: он точно определяет, куда упадёт насекомое, и занимает позицию заблаговременно.',
  threats: ['Загрязнение рек', 'Чрезмерный вылов', 'Мелиорация'],
  conservation: 'Охрана чистых рек. Запрет химических обработок водосборов.',
  where_to_see: 'Западная Двина (верховья), Вилия, Нёман (верховья)',
  biomass: 0.3, seasons: ['4','5','6'],
  regions: ['vitebsk','grodno'],
});

/* ══════════════════════════════════════════════════════════════════════════
   НОВЫЕ ВИДЫ — РЕПТИЛИИ И АМФИБИИ
   ══════════════════════════════════════════════════════════════════════════ */

const gadyuka = addSp({
  group: 'Рептилии и амфибии', habitat: 'wetland',
  name_ru: 'Гадюка обыкновенная', name_be: 'Гадзюка звычайная', name_lat: 'Vipera berus',
  category: 'NT', by_category: 'IV',
  description: 'Единственная ядовитая змея Беларуси. Укус редко опасен для взрослого здорового человека, но вызывает болезненный отёк. Питается грызунами, лягушками и ящерицами. Незаменима в экосистеме как регулятор численности грызунов.',
  fact: 'Гадюка рожает живых детёнышей (до 12 штук), а не откладывает яйца. Молодые змеи с первого дня ядовиты.',
  threats: ['Уничтожение людьми', 'Осушение болот', 'Автодороги'],
  conservation: 'Просветительская работа. Охрана болотных участков.',
  where_to_see: 'Болота и леса по всей Беларуси',
  biomass: 0.15, seasons: ['4','5','6','7','8','9'],
  regions: ['vitebsk','minsk','grodno','brest','gomel','mogilev'],
});

const listvy_trit = addSp({
  group: 'Рептилии и амфибии', habitat: 'wetland',
  name_ru: 'Гребенчатый тритон', name_be: 'Грабенчасты трытон', name_lat: 'Triturus cristatus',
  category: 'NT', by_category: 'IV',
  description: 'Крупнейший тритон Беларуси. В брачный период самец развивает зубчатый гребень вдоль всего тела. Обитает во влажных лесах и болотах. Выделяет ядовитые вещества через кожу для защиты от хищников.',
  fact: 'Гребенчатый тритон может прожить 20–25 лет. В воде он дышит через кожу, не нуждаясь в воздухе часами.',
  threats: ['Осушение водоёмов', 'Хищники', 'Загрязнение'],
  conservation: 'Охрана болотных водоёмов. Создание пруд-убежищ.',
  where_to_see: 'Пуща Налибокская, лесные водоёмы Витебской области',
  biomass: 0.02, seasons: ['3','4','5','6'],
  regions: ['vitebsk','minsk','grodno'],
});

/* ══════════════════════════════════════════════════════════════════════════
   НОВЫЕ ВИДЫ — ГРИБЫ
   ══════════════════════════════════════════════════════════════════════════ */

const hleb_grib = addSp({
  group: 'Грибы', habitat: 'forest',
  name_ru: 'Ёж гриб (герций)', name_be: 'Гербій жаўтлявы', name_lat: 'Hericium erinaceus',
  category: 'EN', by_category: 'II',
  description: 'Необычный гриб с длинными белыми иглами, свисающими каскадом с дерева. Живёт на старых дубах и буках. Съедобен и ценится как деликатес. Исчезает вместе со старовозрастными широколиственными лесами.',
  fact: 'Гриб-ёж содержит вещества, стимулирующие рост нейронов. Изучается как потенциальное средство при болезни Альцгеймера.',
  threats: ['Вырубка старых деревьев', 'Сбор грибниками'],
  conservation: 'Сохранение старых дубрав. Запрет сбора.',
  where_to_see: 'Беловежская пуща',
  biomass: 0.5, seasons: ['8','9','10'],
  regions: ['brest'],
});

/* ══════════════════════════════════════════════════════════════════════════
   ОБНОВИТЬ СЕЗОННОСТЬ СУЩЕСТВУЮЩИХ ВИДОВ
   ══════════════════════════════════════════════════════════════════════════ */
const seasonUpdate = db.prepare("UPDATE rb_species SET season_active = ? WHERE name_ru = ?");
const seasonMap = [
  ['Орлан-белохвост',        JSON.stringify(['1','2','3','4','5','6','7','8','9','10','11','12'])],
  ['Чёрный аист',            JSON.stringify(['4','5','6','7','8','9'])],
  ['Скопа',                  JSON.stringify(['4','5','6','7','8','9'])],
  ['Коростель',              JSON.stringify(['5','6','7','8'])],
  ['Серый журавль',          JSON.stringify(['3','4','5','6','7','8','9','10'])],
  ['Филин',                  JSON.stringify(['1','2','3','4','5','6','7','8','9','10','11','12'])],
  ['Зубр',                   JSON.stringify(['1','2','3','4','5','6','7','8','9','10','11','12'])],
  ['Рысь',                   JSON.stringify(['1','2','3','4','5','6','7','8','9','10','11','12'])],
  ['Бурый медведь',          JSON.stringify(['4','5','6','7','8','9','10'])],
  ['Бобёр европейский',      JSON.stringify(['1','2','3','4','5','6','7','8','9','10','11','12'])],
  ['Выдра речная',           JSON.stringify(['1','2','3','4','5','6','7','8','9','10','11','12'])],
  ['Стерлядь',               JSON.stringify(['4','5','6','7','8','9'])],
  ['Болотная черепаха',      JSON.stringify(['4','5','6','7','8','9'])],
  ['Венерин башмачок',       JSON.stringify(['5','6'])],
  ['Водяной орех',           JSON.stringify(['6','7','8','9'])],
  ['Жук-олень',              JSON.stringify(['6','7','8'])],
  ['Махаон',                 JSON.stringify(['5','6','7','8','9'])],
  ['Богомол обыкновенный',   JSON.stringify(['7','8','9'])],
  ['Трюфель белый',          JSON.stringify(['8','9','10','11'])],
];
seasonMap.forEach(([name, json]) => seasonUpdate.run(json, name));

db.exec('COMMIT');
console.log('✓ Дополнительные виды добавлены');
console.log(`  Всего видов: ${db.prepare('SELECT COUNT(*) as n FROM rb_species').get().n}`);
console.log(`  Пищевых связей: ${db.prepare('SELECT COUNT(*) as n FROM rb_food_web').get().n}`);

/* ══════════════════════════════════════════════════════════════════════════
   ПИЩЕВЫЕ СВЯЗИ ДЛЯ НОВЫХ ВИДОВ
   ══════════════════════════════════════════════════════════════════════════ */
db.exec('BEGIN');

const newLinks = [
  // Лебедь-шипун — водные растения
  [lebed, getId('Водяной орех'), 0.4],
  // Лебедь-кликун — водные растения
  [klikun, getId('Водяной орех'), 0.4],
  // Сом — рыба, лягушки
  [som, getId('Стерлядь'), 0.3],
  [som, getId('Хариус европейский'), 0.3],
  // Гадюка — грызуны (опосредованно через тритона)
  [gadyuka, getId('Тритон обыкновенный') || listvy_trit, 0.4],
  // Гребенчатый тритон — насекомые
  [listvy_trit, getId('Богомол обыкновенный'), 0.1],
  // Выдра охотится на хариуса и сома
  [getId('Выдра речная'), som, 0.2],
  [getId('Выдра речная'), taimen, 0.3],
  // Орлан на лебедей (редко)
  [getId('Орлан-белохвост'), lebed, 0.1],
  // Рысь — зайца
  [getId('Рысь'), zaets, 0.4],
  // Волк — зайца
  [getId('Волк обыкновенный'), zaets, 0.3],
  // Ласка — полёвки (через вид)
  [lasitsa, getId('Коростель'), 0.1],
  // Пухляк и семена
  [getId('Воробьиный сыч'), pukhlyak, 0.2],
  // Широкоушка — насекомые
  [night_bat, getId('Махаон'), 0.2],
  [night_bat, getId('Богомол обыкновенный'), 0.2],
].filter(([p, q]) => p && q);

newLinks.forEach(([p, q, s]) => {
  try { insWeb.run(p, q, s); } catch {}
});
db.exec('COMMIT');
console.log(`  Новых пищевых связей: ${newLinks.length}`);
console.log('\n✅ seed-red-book-extra.js завершён!');
