/**
 * Seed: Красная книга Республики Беларусь
 * 80 видов, 8 групп, пищевая сеть, популяционные тренды
 * Запуск: node src/db/seed-red-book.js  (из папки backend/)
 */
require('./migrate');
const db = require('./db');

/* ══════════════════════════════════════════════════════════════════════════
   GUARD — пропустить если уже засеяно
   ══════════════════════════════════════════════════════════════════════════ */
const already = db.prepare("SELECT COUNT(*) as n FROM rb_species").get();
if (already.n > 0) {
  console.log(`Красная книга: уже засеяно ${already.n} видов, пропускаем.`);
  process.exit(0);
}

/* ══════════════════════════════════════════════════════════════════════════
   ГРУППЫ
   ══════════════════════════════════════════════════════════════════════════ */
const insGroup = db.prepare('INSERT INTO rb_groups (name_ru, name_lat, icon, color) VALUES (?,?,?,?)');
const groups = {};
[
  ['Птицы',           'Aves',            '🦅', '#0369a1'],
  ['Млекопитающие',   'Mammalia',        '🦌', '#92400e'],
  ['Растения',        'Plantae',         '🌿', '#166534'],
  ['Насекомые',       'Insecta',         '🦋', '#b45309'],
  ['Рыбы',            'Pisces',          '🐟', '#0e7490'],
  ['Рептилии и амфибии','Reptilia/Amphibia','🦎','#4d7c0f'],
  ['Грибы',           'Fungi',           '🍄', '#7c3aed'],
  ['Мхи и лишайники', 'Bryophyta',       '🌱', '#065f46'],
].forEach(([name_ru, name_lat, icon, color]) => {
  const id = insGroup.run(name_ru, name_lat, icon, color).lastInsertRowid;
  groups[name_ru] = id;
});
console.log('✓ Группы');

/* ══════════════════════════════════════════════════════════════════════════
   БИОМЫ
   ══════════════════════════════════════════════════════════════════════════ */
const insHabitat = db.prepare('INSERT INTO rb_habitats (name, type, description, sound_file) VALUES (?,?,?,?)');
const habitats = {};
[
  ['Широколиственный лес', 'forest',   'Дубравы и грабово-дубовые леса Полесья и центральной Беларуси', 'forest.mp3'],
  ['Хвойный лес',          'conifer',  'Сосновые и еловые боры, тайга северной Беларуси',               'conifer.mp3'],
  ['Болото',               'wetland',  'Верховые и низинные болота, крупнейшие в Европе',                'wetland.mp3'],
  ['Река и озеро',         'river',    'Пресноводные водоёмы: Припять, Нёман, Западная Двина',          'river.mp3'],
  ['Луг и поле',           'meadow',   'Заливные и суходольные луга, агроландшафты',                     'meadow.mp3'],
].forEach(([name, type, description, sound_file]) => {
  const id = insHabitat.run(name, type, description, sound_file).lastInsertRowid;
  habitats[name] = id;
});
console.log('✓ Биомы');

/* ══════════════════════════════════════════════════════════════════════════
   ВИДЫ
   ══════════════════════════════════════════════════════════════════════════ */
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)
  VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)
`);
const insReg = db.prepare('INSERT OR IGNORE INTO rb_species_regions (species_id, region_code) VALUES (?,?)');
const insPop = db.prepare('INSERT INTO rb_population_data (species_id, year, count_estimate, source) VALUES (?,?,?,?)');

function sp(data) {
  const id = insSp.run(
    groups[data.group], habitats[data.habitat] || null,
    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
  ).lastInsertRowid;
  (data.regions || []).forEach(r => insReg.run(id, r));
  (data.popdata || []).forEach(([year, count, src]) => insPop.run(id, year, count, src || 'КК РБ'));
  return id;
}

const ids = {};

db.exec('BEGIN');
try { // species block

/* ── ПТИЦЫ ─────────────────────────────────────────────────────────────── */

ids.orlan = sp({
  group: 'Птицы', habitat: 'Река и озеро',
  name_ru: 'Орлан-белохвост', name_be: 'Арлан-белахвост', name_lat: 'Haliaeetus albicilla',
  category: 'NT', by_category: 'III',
  description: 'Крупнейший хищник среди белорусских орлиных. Размах крыльев достигает 240 см. Гнездится у крупных водоёмов, охотится на рыбу и уток. Пара занимает одно гнездо десятилетиями, достраивая его каждый год — масса гнезда может превышать тонну.',
  fact: 'Орлан развивает скорость пикирования до 100 км/ч. Гнездо одной пары в Беловежской пуще весило 600 кг.',
  threats: ['Беспокойство у гнёзд', 'Отравление свинцом из охотничьей дроби', 'Вырубка леса у водоёмов'],
  conservation: 'Охраняется в заповедниках. Программа мониторинга гнёзд. Запрет охоты.',
  where_to_see: 'НП «Припятский», НП «Браславские озёра», Беловежская пуща',
  model: 'procedural', biomass: 5.5,
  regions: ['brest','gomel','vitebsk','grodno','minsk','mogilev'],
  popdata: [[1990,150,'КК РБ 1993'],[2000,200,'КК РБ 2004'],[2010,280,'КК РБ 2015'],[2024,350,'Мониторинг 2024']],
  trend: [{year:1990,count:150},{year:2000,count:200},{year:2010,count:280},{year:2024,count:350}],
});

ids.chorny_aist = sp({
  group: 'Птицы', habitat: 'Широколиственный лес',
  name_ru: 'Чёрный аист', name_be: 'Чорны бусел', name_lat: 'Ciconia nigra',
  category: 'NT', by_category: 'III',
  description: 'В отличие от белого аиста, чёрный предпочитает глухие леса с ручьями и реками. Оперение с зелёным и пурпурным металлическим блеском. Зимует в Африке южнее Сахары. Чрезвычайно осторожен — при беспокойстве бросает гнездо.',
  fact: 'Чёрный аист преодолевает до 10 000 км во время миграции. В Беларуси гнездится около 900 пар.',
  threats: ['Вырубка старовозрастных лесов', 'Осушение болот', 'Беспокойство у гнёзд'],
  conservation: 'Охраняемые зоны вокруг гнёзд радиусом 200 м. Сохранение старовозрастных деревьев.',
  where_to_see: 'Беловежская пуща, НП «Припятский», ПЗ «Налибокский»',
  model: 'procedural', biomass: 3.0,
  regions: ['brest','gomel','grodno','minsk','vitebsk'],
  popdata: [[1990,600,'КК РБ 1993'],[2005,800,'КК РБ 2004'],[2015,850,'КК РБ 2015'],[2024,920,'Мониторинг 2024']],
  trend: [{year:1990,count:600},{year:2005,count:800},{year:2015,count:850},{year:2024,count:920}],
});

ids.skopa = sp({
  group: 'Птицы', habitat: 'Река и озеро',
  name_ru: 'Скопа', name_be: 'Скапа', name_lat: 'Pandion haliaetus',
  category: 'VU', by_category: 'II',
  description: 'Уникальный хищник, питающийся исключительно рыбой. Ныряет в воду на глубину до 1 м. Пальцы покрыты шипами для удержания скользкой добычи. Строит гнёзда на вершинах сухих деревьев или опорах ЛЭП.',
  fact: 'Скопа — единственная хищная птица мира, охотящаяся только на рыбу и обитающая на всех континентах кроме Антарктиды.',
  threats: ['Деградация рыбных ресурсов', 'Беспокойство у гнёзд', 'Гибель на ЛЭП'],
  conservation: 'Установка искусственных гнездовых платформ. Охранные зоны у гнёзд.',
  where_to_see: 'Браславские озёра, НП «Нарочанский», озёра Витебской области',
  model: 'procedural', biomass: 1.8,
  regions: ['vitebsk','minsk','grodno','brest'],
  popdata: [[1990,50,'КК РБ 1993'],[2005,70,'КК РБ 2004'],[2015,90,'КК РБ 2015'],[2024,110,'Мониторинг 2024']],
  trend: [{year:1990,count:50},{year:2005,count:70},{year:2015,count:90},{year:2024,count:110}],
});

ids.dergach = sp({
  group: 'Птицы', habitat: 'Луг и поле',
  name_ru: 'Коростель', name_be: 'Дзяргач', name_lat: 'Crex crex',
  category: 'VU', by_category: 'III',
  description: 'Скрытная птица влажных лугов. Слышать его легко — самец кричит «дёрг-дёрг» всю ночь, но увидеть почти невозможно. Прилетает поздно весной из Африки. Численность резко падает из-за раннего сенокоса.',
  fact: 'Коростель бежит быстрее, чем летит. Его крик слышен за 1,5 км в тихую ночь.',
  threats: ['Ранний механизированный сенокос', 'Осушение лугов', 'Хищники'],
  conservation: 'Рекомендации по срокам сенокоса (после 1 августа). Сохранение пойменных лугов.',
  where_to_see: 'Пойма Припяти, Нарочанский НП, луга Брестской области',
  biomass: 0.15,
  regions: ['brest','gomel','grodno','minsk','vitebsk','mogilev'],
  popdata: [[1990,5000,'КК РБ 1993'],[2005,3500,'КК РБ 2004'],[2015,2800,'КК РБ 2015'],[2024,2200,'Мониторинг 2024']],
  trend: [{year:1990,count:5000},{year:2005,count:3500},{year:2015,count:2800},{year:2024,count:2200}],
});

ids.zhuravl = sp({
  group: 'Птицы', habitat: 'Болото',
  name_ru: 'Серый журавль', name_be: 'Шэры жураўль', name_lat: 'Grus grus',
  category: 'NT', by_category: 'IV',
  description: 'Символ белорусских болот. Пары создаются на всю жизнь. Весной и осенью собирается на полях в стаи до нескольких тысяч птиц. Токование — один из самых красивых ритуалов среди птиц: прыжки, взмахи крыльями, трубный крик.',
  fact: 'Журавль живёт до 25 лет в дикой природе. Беларусь — один из главных «журавлиных» регионов Европы с населением ~20 000 пар.',
  threats: ['Осушение болот', 'Беспокойство в период гнездования'],
  conservation: 'Сохранение болотных массивов. Охраняемые территории на токовищах.',
  where_to_see: 'НП «Припятский», Ельня, Освейское болото',
  model: 'procedural', biomass: 5.0,
  regions: ['vitebsk','minsk','gomel','brest','grodno','mogilev'],
  trend: [{year:1990,count:15000},{year:2010,count:18000},{year:2024,count:20000}],
});

ids.zmeeyed = sp({
  group: 'Птицы', habitat: 'Широколиственный лес',
  name_ru: 'Змееяд', name_be: 'Змеяед', name_lat: 'Circaetus gallicus',
  category: 'EN', by_category: 'II',
  description: 'Специализированный охотник на рептилий. Питается почти исключительно змеями, в том числе гадюками. Иммунитет к яду позволяет заглатывать змею живой. Редчайший в Беларуси — гнездятся единицы пар.',
  fact: 'Змееяд способен заглотить гадюку длиной 1 м. В Беларуси гнездится не более 15–20 пар.',
  threats: ['Вырубка старых лесов', 'Снижение численности рептилий', 'Беспокойство'],
  conservation: 'Охрана известных гнёзд. Мониторинг численности.',
  where_to_see: 'ПЗ «Полесский», Беловежская пуща',
  biomass: 1.9,
  regions: ['brest','gomel'],
  popdata: [[2000,12,'КК РБ 2004'],[2015,15,'КК РБ 2015'],[2024,18,'Мониторинг 2024']],
  trend: [{year:2000,count:12},{year:2015,count:15},{year:2024,count:18}],
});

ids.vorobiny_sych = sp({
  group: 'Птицы', habitat: 'Хвойный лес',
  name_ru: 'Воробьиный сыч', name_be: 'Верабіны сычык', name_lat: 'Glaucidium passerinum',
  category: 'VU', by_category: 'III',
  description: 'Самая маленькая сова Европы — размером с дрозда. Активна как днём, так и ночью. Делает запасы пищи в дуплах на зиму. Голос — монотонный свист, слышный далеко в лесу.',
  fact: 'Несмотря на размер с воробья, воробьиный сыч охотится на добычу крупнее себя — полёвок и мелких птиц.',
  threats: ['Вырубка старых ельников', 'Исчезновение дупел'],
  conservation: 'Сохранение старовозрастных ельников. Вывешивание искусственных дупел.',
  where_to_see: 'Налибокская пуща, Беловежская пуща, Ельнянский заказник',
  biomass: 0.08,
  regions: ['grodno','vitebsk','minsk'],
});

ids.krasnozobaya_kazarka = sp({
  group: 'Птицы', habitat: 'Река и озеро',
  name_ru: 'Краснозобая казарка', name_be: 'Чырванашыйная казарка', name_lat: 'Branta ruficollis',
  category: 'EN', by_category: 'II',
  description: 'Одна из самых красивых арктических гусей. В Беларуси встречается только во время миграций — зимует на Чёрном море. Численность катастрофически сокращается из-за охоты на зимовках.',
  fact: 'Краснозобая казарка гнездится исключительно в тундре Западной Сибири. Беларусь — транзитный коридор миграции.',
  threats: ['Охота на зимовках', 'Изменение климата', 'Беспокойство на миграционных стоянках'],
  conservation: 'Запрет охоты. Охрана мест остановок на миграции.',
  where_to_see: 'Полесские водохранилища, озёра Витебщины (пролёт)',
  biomass: 1.5,
  regions: ['gomel','brest','vitebsk'],
});

ids.filin = sp({
  group: 'Птицы', habitat: 'Хвойный лес',
  name_ru: 'Филин', name_be: 'Пугач', name_lat: 'Bubo bubo',
  category: 'VU', by_category: 'II',
  description: 'Крупнейшая сова планеты. Ночной охотник, способный атаковать добычу весом до 3 кг. Охотничий участок пары — до 80 км². Низкое токование самца слышно за 4 км в тихую ночь.',
  fact: 'Филин — единственная птица, которая регулярно охотится на других хищников: ловит ястребов и даже молодых орланов.',
  threats: ['Фактор беспокойства', 'Гибель на ЛЭП', 'Оскудение кормовой базы'],
  conservation: 'Охрана гнёзд. Изоляция ЛЭП. Мониторинг популяции.',
  where_to_see: 'Беловежская пуща, ПЗ «Налибокский», НП «Припятский»',
  model: 'procedural', biomass: 2.7,
  regions: ['brest','grodno','gomel','minsk'],
  trend: [{year:1990,count:200},{year:2010,count:250},{year:2024,count:280}],
});

ids.zhuravl_seryi2 = sp({
  group: 'Птицы', habitat: 'Болото',
  name_ru: 'Большой подорлик', name_be: 'Вялікі арол-крычун', name_lat: 'Clanga clanga',
  category: 'EN', by_category: 'II',
  description: 'Один из самых редких орлов Европы. Гнездится в старых лиственных лесах рядом с болотами и поймами. Питается амфибиями, мышевидными грызунами. Особенно уязвим из-за низкой плодовитости — одно яйцо в кладке.',
  fact: 'В мире гнездится менее 10 000 пар большого подорлика. Беларусь — один из ключевых регионов гнездования в Европе.',
  threats: ['Осушение болот и пойм', 'Вырубка пойменных лесов', 'Беспокойство'],
  conservation: 'Охрана гнёзд. Сохранение болотных массивов.',
  where_to_see: 'НП «Припятский», Полесский радиационно-экологический заповедник',
  biomass: 2.0,
  regions: ['gomel','brest','minsk'],
  popdata: [[2000,80,'КК РБ 2004'],[2015,90,'КК РБ 2015'],[2024,100,'Мониторинг 2024']],
  trend: [{year:2000,count:80},{year:2015,count:90},{year:2024,count:100}],
});

/* ── МЛЕКОПИТАЮЩИЕ ──────────────────────────────────────────────────────── */

ids.zubr = sp({
  group: 'Млекопитающие', habitat: 'Широколиственный лес',
  name_ru: 'Зубр европейский', name_be: 'Зубр', name_lat: 'Bison bonasus',
  category: 'VU', by_category: 'III',
  description: 'Крупнейшее наземное млекопитающее Европы. Масса самца достигает 920 кг при высоте в холке 188 см. Вид был полностью истреблён в дикой природе к 1927 году — всё нынешнее поголовье (около 7000 особей в мире) происходит от 12 зубров из зоопарков. Беларусь сыграла ключевую роль в восстановлении вида.',
  fact: 'Зубр может прыгнуть в высоту до 2 м. Беловежская пуща — колыбель восстановления этого вида.',
  threats: ['Инбридинг из-за малой генетической базы', 'Болезни', 'Браконьерство'],
  conservation: 'Беловежская пуща — ключевой центр разведения. Программы реинтродукции в Европе.',
  where_to_see: 'Беловежская пуща (основная популяция), Налибокская пуща',
  model: 'procedural', biomass: 650,
  regions: ['brest','grodno','minsk','vitebsk'],
  popdata: [[1927,0,'Летопись'],[1960,150,'КК РБ'],[1990,850,'КК РБ 1993'],[2010,1500,'КК РБ 2015'],[2024,2000,'Мониторинг 2024']],
  trend: [{year:1927,count:0},{year:1960,count:150},{year:1990,count:850},{year:2010,count:1500},{year:2024,count:2000}],
});

ids.rys = sp({
  group: 'Млекопитающие', habitat: 'Хвойный лес',
  name_ru: 'Рысь евразийская', name_be: 'Рысь', name_lat: 'Lynx lynx',
  category: 'NT', by_category: 'III',
  description: 'Крупнейший кошачий хищник Европы. Ведёт одиночный ночной образ жизни. Охотится главным образом на косуль и зайцев, реже на других оленей. Огромные лапы работают как снегоступы — рысь не проваливается в снег глубиной до 50 см.',
  fact: 'Рысь может прыгнуть на расстояние 7 м. Она единственная крупная кошка, живущая севернее 60° с.ш.',
  threats: ['Браконьерство', 'Фрагментация лесных массивов', 'Снижение кормовой базы'],
  conservation: 'Полный запрет охоты. Охрана крупных лесных массивов. GPS-мониторинг.',
  where_to_see: 'Налибокская пуща, Беловежская пуща, Освейский заказник',
  model: 'procedural', biomass: 22,
  regions: ['grodno','minsk','vitebsk','brest'],
  popdata: [[1990,350,'КК РБ 1993'],[2005,500,'КК РБ 2004'],[2015,650,'КК РБ 2015'],[2024,700,'Мониторинг 2024']],
  trend: [{year:1990,count:350},{year:2005,count:500},{year:2015,count:650},{year:2024,count:700}],
});

ids.medved = sp({
  group: 'Млекопитающие', habitat: 'Хвойный лес',
  name_ru: 'Бурый медведь', name_be: 'Буры мядзведзь', name_lat: 'Ursus arctos',
  category: 'NT', by_category: 'III',
  description: 'Крупнейший хищник фауны Беларуси. Всеяден — рацион на 80% состоит из растительной пищи. Залегает в берлогу с ноября по март. В Беларуси обитает на северо-востоке, сохранились лишь периферийные популяции.',
  fact: 'Медведь чует запах еды с расстояния 20 км. Самка рожает медвежат в берлоге прямо в январе, весящих всего 500 г.',
  threats: ['Браконьерство', 'Фрагментация лесов', 'Деградация кормовой базы'],
  conservation: 'Запрет охоты. Охрана берлог. Мониторинг численности.',
  where_to_see: 'Полоцкий район Витебской области, Освейский заказник',
  model: 'procedural', biomass: 180,
  regions: ['vitebsk','mogilev'],
  popdata: [[1990,80,'КК РБ 1993'],[2005,70,'КК РБ 2004'],[2015,65,'КК РБ 2015'],[2024,60,'Мониторинг 2024']],
  trend: [{year:1990,count:80},{year:2005,count:70},{year:2015,count:65},{year:2024,count:60}],
});

ids.norka = sp({
  group: 'Млекопитающие', habitat: 'Река и озеро',
  name_ru: 'Европейская норка', name_be: 'Еўрапейская норка', name_lat: 'Mustela lutreola',
  category: 'CR', by_category: 'I',
  description: 'Один из самых редких хищников Европы. Конкурентно вытеснена завезённой американской норкой. Держится у небольших рек с захламлёнными берегами. Отличается от американской норкой белым пятном на верхней губе.',
  fact: 'Европейская норка занесена в Красную книгу МСОП как находящаяся под критической угрозой исчезновения. В Беларуси обитает менее 500 особей.',
  threats: ['Конкуренция с американской норкой', 'Охота/отлов', 'Деградация береговой растительности'],
  conservation: 'Программа разведения в неволе. Отлов и стерилизация американской норки. Реинтродукция.',
  where_to_see: 'Полесье, бассейн Немана',
  biomass: 0.6,
  regions: ['brest','gomel','grodno'],
  popdata: [[1990,2000,'КК РБ 1993'],[2005,800,'КК РБ 2004'],[2015,400,'КК РБ 2015'],[2024,300,'Мониторинг 2024']],
  trend: [{year:1990,count:2000},{year:2005,count:800},{year:2015,count:400},{year:2024,count:300}],
});

ids.vydra = sp({
  group: 'Млекопитающие', habitat: 'Река и озеро',
  name_ru: 'Речная выдра', name_be: 'Выдра', name_lat: 'Lutra lutra',
  category: 'NT', by_category: 'III',
  description: 'Полуводный хищник семейства куньих. Мастер плавания — способна задерживать дыхание на 4 минуты. Поедает рыбу, раков, лягушек. Индикатор чистоты водоёмов: там, где живёт выдра, вода чистая.',
  fact: 'Выдра скользит по снегу и льду на брюхе, развивая скорость до 25 км/ч. Каждый день ей нужно съесть 15% своего веса.',
  threats: ['Загрязнение водоёмов', 'Браконьерство', 'Вылов в рыболовные снасти'],
  conservation: 'Охрана водоохранных зон. Запрет охоты. Очистка водоёмов.',
  where_to_see: 'Реки по всей Беларуси, НП «Припятский»',
  biomass: 9,
  regions: ['brest','gomel','grodno','minsk','vitebsk','mogilev'],
  trend: [{year:1990,count:2500},{year:2010,count:3000},{year:2024,count:3200}],
});

ids.bober = sp({
  group: 'Млекопитающие', habitat: 'Река и озеро',
  name_ru: 'Речной бобёр', name_be: 'Рачны бабёр', name_lat: 'Castor fiber',
  category: 'LC', by_category: 'IV',
  description: 'Крупнейший грызун Беларуси. Инженер экосистем: строит плотины, создаёт водоёмы, меняет ландшафт. Был истреблён к XIX веку и успешно реинтродуцирован. Сейчас численность в Беларуси — одна из крупнейших в Европе.',
  fact: 'Бобёр — природный мелиоратор: его плотины повышают уровень грунтовых вод, создают новые биотопы для других видов.',
  threats: ['Охота', 'Уничтожение прибрежной растительности'],
  conservation: 'Регулирование охоты. Охрана пойменных лесов.',
  where_to_see: 'Повсеместно у рек и каналов Беларуси',
  biomass: 25,
  regions: ['brest','gomel','grodno','minsk','vitebsk','mogilev'],
  trend: [{year:1960,count:1000},{year:1990,count:20000},{year:2010,count:50000},{year:2024,count:60000}],
});

ids.zubatka = sp({
  group: 'Млекопитающие', habitat: 'Широколиственный лес',
  name_ru: 'Соня лесная', name_be: 'Лясная соня', name_lat: 'Dryomys nitedula',
  category: 'VU', by_category: 'III',
  description: 'Небольшой ночной грызун смешанных и лиственных лесов. Спит 7–8 месяцев в году — дольше всех млекопитающих Беларуси. Гнездо строит в дуплах или развилках ветвей на высоте 2–5 м.',
  fact: 'Перед зимней спячкой соня увеличивает массу тела вдвое, накапливая жир. Температура тела во сне падает до 1°C.',
  threats: ['Вырубка лиственных лесов', 'Снижение урожая орехов и желудей'],
  conservation: 'Охрана старолесий. Вывешивание дуплянок.',
  where_to_see: 'Беловежская пуща, Налибокская пуща',
  biomass: 0.03,
  regions: ['brest','grodno','minsk'],
});

ids.kosulya = sp({
  group: 'Млекопитающие', habitat: 'Широколиственный лес',
  name_ru: 'Косуля европейская', name_be: 'Еўрапейская казуля', name_lat: 'Capreolus capreolus',
  category: 'LC', by_category: 'IV',
  description: 'Самый распространённый олень Беларуси. Важнейший элемент пищевой цепи — основная добыча волка, рыси и лисы. Рожки самец сбрасывает ежегодно в ноябре. Летом держится одиночно, зимой образует небольшие группы.',
  fact: 'Косуля — чемпион среди оленей по скорости: развивает до 60 км/ч. Рогатый самец защищает территорию площадью до 60 га.',
  threats: ['Интенсивная охота', 'Браконьерство', 'Хищники'],
  conservation: 'Регулирование охотничьей нагрузки. Мониторинг численности.',
  where_to_see: 'Лесные массивы по всей Беларуси',
  model: 'procedural', biomass: 25,
  regions: ['brest','gomel','grodno','minsk','vitebsk','mogilev'],
  trend: [{year:1990,count:80000},{year:2010,count:100000},{year:2024,count:110000}],
});

ids.volk = sp({
  group: 'Млекопитающие', habitat: 'Хвойный лес',
  name_ru: 'Волк', name_be: 'Воўк', name_lat: 'Canis lupus',
  category: 'LC', by_category: 'IV',
  description: 'Крупнейший хищник семейства псовых. Живёт стаями 5–12 особей с чёткой иерархией. Регулирует численность копытных, оздоровляя их популяции. В Беларуси отношение к волку противоречивое — он и символ дикой природы, и угроза для скота.',
  fact: 'Волк за сутки способен пробежать до 70 км. Воя стаи достаточно, чтобы пометить территорию площадью в сотни км².',
  threats: ['Истребление как вредителя', 'Фрагментация ареала'],
  conservation: 'Мониторинг. Компенсации за ущерб скоту.',
  where_to_see: 'Леса по всей Беларуси',
  model: 'procedural', biomass: 40,
  regions: ['brest','gomel','grodno','minsk','vitebsk','mogilev'],
  trend: [{year:1990,count:1800},{year:2005,count:1500},{year:2015,count:1700},{year:2024,count:2000}],
});

/* ── РАСТЕНИЯ ────────────────────────────────────────────────────────────── */

ids.venerina = sp({
  group: 'Растения', habitat: 'Широколиственный лес',
  name_ru: 'Венерин башмачок настоящий', name_be: 'Венерын чаравічак', name_lat: 'Cypripedium calceolus',
  category: 'EN', by_category: 'II',
  description: 'Красивейшая дикая орхидея Беларуси. Цветок напоминает туфельку. Растёт в тенистых лиственных лесах. Живёт до 100 лет, но впервые цветёт только в 15–17 лет. Опыляется только мелкими пчёлами рода Andrena.',
  fact: 'Венерин башмачок — самая долгоживущая травянистая орхидея. Одно растение в Германии было документально прослежено 100 лет на одном месте.',
  threats: ['Незаконный сбор', 'Вырубка лесов', 'Уплотнение почвы', 'Зарастание кустарником'],
  conservation: 'Охрана местонахождений. Культивирование в ботанических садах. Запрет сбора.',
  where_to_see: 'Беловежская пуща (ур. Новый Двор), Налибокская пуща',
  biomass: 0.05,
  regions: ['brest','grodno','minsk','vitebsk'],
  popdata: [[1990,5000,'КК РБ 1993'],[2005,3000,'КК РБ 2004'],[2015,2000,'КК РБ 2015'],[2024,1800,'Мониторинг 2024']],
  trend: [{year:1990,count:5000},{year:2005,count:3000},{year:2015,count:2000},{year:2024,count:1800}],
});

ids.vodyanoy_oreh = sp({
  group: 'Растения', habitat: 'Река и озеро',
  name_ru: 'Водяной орех плавающий', name_be: 'Плывучы вадзяны арэх', name_lat: 'Trapa natans',
  category: 'CR', by_category: 'I',
  description: 'Реликт третичной флоры, живший на Земле ещё 100 миллионов лет назад. Плавающие листья образуют красивую розетку. Плоды съедобны, богаты крахмалом. Сохранился лишь в нескольких озёрах Полесья.',
  fact: 'Водяной орех пережил динозавров. Его плоды с четырьмя «рогами» служили пищей людям ещё в каменном веке.',
  threats: ['Загрязнение и эвтрофикация озёр', 'Колебания уровня воды', 'Конкуренция с другими водными растениями'],
  conservation: 'Охрана озёр. Ограничение хозяйственной деятельности. Культивирование.',
  where_to_see: 'Оз. Червоное (Брестская обл.), оз. Белое (Полесье)',
  biomass: 0.02,
  regions: ['brest','gomel'],
  popdata: [[1990,15000,'КК РБ 1993'],[2005,8000,'КК РБ 2004'],[2015,4000,'КК РБ 2015'],[2024,2500,'Мониторинг 2024']],
  trend: [{year:1990,count:15000},{year:2005,count:8000},{year:2015,count:4000},{year:2024,count:2500}],
});

ids.palchatokorenik = sp({
  group: 'Растения', habitat: 'Болото',
  name_ru: 'Пальчатокоренник мясокрасный', name_be: 'Мяснякраснаты пальчатакарэнік', name_lat: 'Dactylorhiza incarnata',
  category: 'VU', by_category: 'III',
  description: 'Болотная орхидея с плотным колосом розово-лиловых цветков. Растёт на низинных болотах и заболоченных лугах. Микоризный гриб необходим для прорастания семян — без него орхидея не может развиться.',
  fact: 'Семена орхидей настолько малы (0,002 мм), что видны только под микроскопом. В одной коробочке содержится до 10 000 семян.',
  threats: ['Осушение болот', 'Зарастание кустарником', 'Выпас скота'],
  conservation: 'Охрана болотных массивов. Запрет мелиорации.',
  where_to_see: 'Полесье, Налибокская пуща, Осиповичский район',
  biomass: 0.03,
  regions: ['brest','gomel','grodno','minsk'],
});

ids.molochai = sp({
  group: 'Растения', habitat: 'Луг и поле',
  name_ru: 'Прострел луговой', name_be: 'Сонца-трава', name_lat: 'Pulsatilla pratensis',
  category: 'VU', by_category: 'III',
  description: 'Один из первых весенних цветков. Тёмно-фиолетовые бокаловидные цветки появляются ещё при снеге. Покрыт шелковистыми волосками — защита от холода. Сильно сократился из-за сбора на букеты и распашки лугов.',
  fact: 'Прострел — символ весны в Беларуси. Второе название «сон-трава» — легенда гласит, что заснувший рядом с ним видит вещие сны.',
  threats: ['Сбор букетов', 'Распашка луговин', 'Сенокос до плодоношения'],
  conservation: 'Запрет сбора. Охрана луговых заказников.',
  where_to_see: 'Сосновые боры, остепнённые луга по всей Беларуси',
  biomass: 0.01,
  regions: ['brest','gomel','grodno','minsk','vitebsk','mogilev'],
});

ids.lobelia = sp({
  group: 'Растения', habitat: 'Река и озеро',
  name_ru: 'Лобелия Дортмана', name_be: 'Лобелія Дортмана', name_lat: 'Lobelia dortmanna',
  category: 'EN', by_category: 'II',
  description: 'Водное растение олиготрофных озёр. Растёт на песчаном дне на глубине 0,5–3 м. Цветонос возвышается над водой. Сверхчувствителен к загрязнению — индикатор кристально чистой воды.',
  fact: 'Лобелия Дортмана поглощает CO₂ через корни из донных отложений, а не из воды — уникальный для растений способ.',
  threats: ['Эвтрофикация озёр', 'Загрязнение воды', 'Рекреационная нагрузка'],
  conservation: 'Охрана чистых озёр. Ограничение рекреации.',
  where_to_see: 'Браславские озёра, озёра Нарочанской группы',
  biomass: 0.01,
  regions: ['vitebsk','minsk','grodno'],
});

ids.soldanella = sp({
  group: 'Растения', habitat: 'Широколиственный лес',
  name_ru: 'Лунник оживающий', name_be: 'Лунарыя ажываючая', name_lat: 'Lunaria rediviva',
  category: 'VU', by_category: 'III',
  description: 'Многолетнее растение тенистых влажных лесов. Серебристые эллиптические стручки используют для зимних букетов. Редчайшее в Беларуси — известно лишь несколько популяций.',
  fact: 'Название «лунник» происходит от формы плодов — круглых, как луна. После высыхания они становятся прозрачными и серебристыми.',
  threats: ['Сбор для флористики', 'Вырубка тенистых лесов'],
  conservation: 'Запрет сбора. Охрана местонахождений.',
  where_to_see: 'Налибокская пуща, Беловежская пуща',
  biomass: 0.1,
  regions: ['grodno','minsk','brest'],
});

ids.matik = sp({
  group: 'Растения', habitat: 'Болото',
  name_ru: 'Шейхцерия болотная', name_be: 'Балотная шэйхцэрыя', name_lat: 'Scheuchzeria palustris',
  category: 'VU', by_category: 'III',
  description: 'Реликтовое травянистое растение верховых болот. Растёт в сфагновых зарослях у мочажин. Индикатор ненарушенных болотных экосистем. При осушении болот исчезает первым.',
  fact: 'Шейхцерия существует более 10 000 лет — с конца ледникового периода — практически не изменившись.',
  threats: ['Осушение болот', 'Торфоразработки'],
  conservation: 'Охрана верховых болот. Запрет торфоразработок.',
  where_to_see: 'Ельнянский заказник, Освейское болото',
  biomass: 0.01,
  regions: ['vitebsk','minsk','gomel'],
});

/* ── НАСЕКОМЫЕ ────────────────────────────────────────────────────────────── */

ids.makhаon = sp({
  group: 'Насекомые', habitat: 'Луг и поле',
  name_ru: 'Махаон', name_be: 'Махаон', name_lat: 'Papilio machaon',
  category: 'NT', by_category: 'IV',
  description: 'Одна из крупнейших и красивейших бабочек Беларуси. Размах крыльев до 95 мм. Жёлтые крылья с чёрным рисунком и синей каймой. Гусеница поедает листья зонтичных растений. Стал редок из-за распашки лугов с дикими зонтичными.',
  fact: 'Хвостики-отростки на задних крыльях отвлекают хищников — птицы атакуют «ненастоящую голову».',
  threats: ['Распашка лугов с зонтичными растениями', 'Применение пестицидов', 'Сбор коллекционерами'],
  conservation: 'Сохранение лугов с дикими зонтичными. Запрет отлова.',
  where_to_see: 'Луга и опушки по всей Беларуси, Полесье',
  model: 'procedural', biomass: 0.002,
  regions: ['brest','gomel','grodno','minsk','vitebsk','mogilev'],
  trend: [{year:1990,count:100000},{year:2010,count:50000},{year:2024,count:30000}],
});

ids.podolik = sp({
  group: 'Насекомые', habitat: 'Широколиственный лес',
  name_ru: 'Жук-олень', name_be: 'Жук-алень', name_lat: 'Lucanus cervus',
  category: 'VU', by_category: 'II',
  description: 'Крупнейший жук Беларуси. Самцы достигают 9 см. «Рога» — увеличенные жвала, используемые в турнирных боях. Личинка развивается в мёртвой древесине дуба 5–8 лет. Исчезает вместе со старыми дубравами.',
  fact: 'Жук-олень умеет летать, несмотря на тяжёлую «броню». Взрослый жук не ест — живёт всего 1–2 месяца за счёт жировых запасов.',
  threats: ['Вырубка старых дубрав', 'Уборка мёртвой древесины', 'Декоративный сбор'],
  conservation: 'Сохранение старовозрастных дубрав. Оставление валежника.',
  where_to_see: 'Беловежская пуща, Налибокская пуща',
  model: 'procedural', biomass: 0.008,
  regions: ['brest','grodno','minsk'],
});

ids.apollon = sp({
  group: 'Насекомые', habitat: 'Луг и поле',
  name_ru: 'Аполлон', name_be: 'Апалон', name_lat: 'Parnassius apollo',
  category: 'EN', by_category: 'I',
  description: 'Крупная дневная бабочка с полупрозрачными белыми крыльями и красными глазками. Считается одним из красивейших насекомых Европы. В Беларуси сохранились единичные изолированные популяции. Гусеница питается очитком.',
  fact: 'Аполлон — первая бабочка, включённая в Конвенцию CITES (запрет международной торговли). Его коллекционируют вопреки всем запретам.',
  threats: ['Зарастание каменистых склонов кустарником', 'Коллекционирование', 'Применение пестицидов'],
  conservation: 'Строгая охрана популяций. Борьба с зарастанием склонов.',
  where_to_see: 'Окрестности Гродно (единственное местонахождение в РБ)',
  biomass: 0.003,
  regions: ['grodno'],
  popdata: [[2000,500,'КК РБ 2004'],[2015,300,'КК РБ 2015'],[2024,200,'Мониторинг 2024']],
  trend: [{year:2000,count:500},{year:2015,count:300},{year:2024,count:200}],
});

ids.bogomol = sp({
  group: 'Насекомые', habitat: 'Луг и поле',
  name_ru: 'Богомол обыкновенный', name_be: 'Звычайны багамол', name_lat: 'Mantis religiosa',
  category: 'EN', by_category: 'II',
  description: 'Самый известный хищный кузнечик. Передние ноги — ловчий аппарат, реагирующий быстрее, чем успевает моргнуть человек. Самка после спаривания поедает самца. В Беларуси — на северной границе ареала.',
  fact: 'Богомол — единственное насекомое, способное поворачивать голову на 180°. Реакция захвата добычи занимает 0,05 секунды.',
  threats: ['Применение пестицидов', 'Распашка сухих лугов', 'Изменение климата'],
  conservation: 'Охрана сухих травянистых местообитаний.',
  where_to_see: 'Южная Беларусь — Брестская, Гомельская обл.',
  biomass: 0.004,
  regions: ['brest','gomel'],
});

ids.stag_beetle2 = sp({
  group: 'Насекомые', habitat: 'Широколиственный лес',
  name_ru: 'Усач мускусный', name_be: 'Мускусны вусач', name_lat: 'Aromia moschata',
  category: 'VU', by_category: 'III',
  description: 'Ярко-зелёный жук с металлическим блеском. Издаёт сильный запах мускуса, слышный за несколько метров. Личинки развиваются в старых ивах. Встречается вдоль рек с ивняком.',
  fact: 'Мускусный усач — один из немногих жуков, использующих химическую сигнализацию для общения с партнёрами.',
  threats: ['Обрезка и уборка старых ив', 'Осушение пойм'],
  conservation: 'Сохранение старых ив вдоль рек.',
  where_to_see: 'Поймы рек Полесья, долина Немана',
  biomass: 0.004,
  regions: ['brest','gomel','grodno','minsk'],
});

/* ── РЫБЫ ─────────────────────────────────────────────────────────────────── */

ids.sterlyadj = sp({
  group: 'Рыбы', habitat: 'Река и озеро',
  name_ru: 'Стерлядь', name_be: 'Асётр-стэрлядзь', name_lat: 'Acipenser ruthenus',
  category: 'EN', by_category: 'II',
  description: 'Самый мелкий осетр. Реликт доледникового периода — осетры появились 250 миллионов лет назад. В Беларуси исчезала в XX веке и восстанавливается искусственным зарыблением. Ценнейшая промысловая рыба.',
  fact: 'Осетры — живые ископаемые. Их форма тела не менялась 200 миллионов лет. Стерлядь доживает до 30 лет.',
  threats: ['Браконьерство', 'Строительство плотин', 'Загрязнение рек', 'Изъятие из русел гравия'],
  conservation: 'Искусственное воспроизводство. Рыборазводные заводы. Запрет вылова.',
  where_to_see: 'Р. Днепр, р. Припять, р. Сож (редко)',
  biomass: 0.8,
  regions: ['gomel','mogilev','brest'],
  popdata: [[1990,100,'КК РБ 1993'],[2010,500,'после зарыбления'],[2024,1500,'Мониторинг 2024']],
  trend: [{year:1990,count:100},{year:2010,count:500},{year:2024,count:1500}],
});

ids.minog = sp({
  group: 'Рыбы', habitat: 'Река и озеро',
  name_ru: 'Ручьевая минога', name_be: 'Ручаёвая мінога', name_lat: 'Lampetra planeri',
  category: 'VU', by_category: 'III',
  description: 'Древнейший позвоночный — миноги появились 360 миллионов лет назад, ещё до динозавров. Не имеет челюстей. Личинка (амоцет) живёт в иле 3–7 лет с закрытыми глазами. Взрослая минога не питается и гибнет после нереста.',
  fact: 'Ручьевая минога — «живое ископаемое», практически не изменившееся за 360 миллионов лет. Её называют самым примитивным позвоночным.',
  threats: ['Загрязнение малых рек', 'Заиление нерестилищ', 'Мелиорация'],
  conservation: 'Охрана малых рек. Ограничение мелиорации.',
  where_to_see: 'Чистые малые реки Витебской, Гродненской областей',
  biomass: 0.02,
  regions: ['vitebsk','grodno','minsk','mogilev'],
});

ids.usatch = sp({
  group: 'Рыбы', habitat: 'Река и озеро',
  name_ru: 'Усач обыкновенный', name_be: 'Марэна', name_lat: 'Barbus barbus',
  category: 'VU', by_category: 'III',
  description: 'Крупная реофильная рыба быстрых рек. Достигает 90 см. Ищет пищу на дне с помощью чувствительных усиков. Нерестится на каменистых перекатах — именно их исчезновение главная угроза.',
  fact: 'Икра усача ядовита для теплокровных — содержит ихтиотоксин. Местные рыбаки знали об этом и никогда её не ели.',
  threats: ['Добыча гравия', 'Строительство плотин', 'Загрязнение'],
  conservation: 'Сохранение каменистых перекатов. Запрет добычи гравия.',
  where_to_see: 'Р. Западный Буг, р. Нёман',
  biomass: 1.5,
  regions: ['brest','grodno'],
});

ids.rylets = sp({
  group: 'Рыбы', habitat: 'Река и озеро',
  name_ru: 'Подуст обыкновенный', name_be: 'Падуст', name_lat: 'Chondrostoma nasus',
  category: 'EN', by_category: 'II',
  description: 'Стайная рыба горных и предгорных рек. В Беларуси — на восточной границе ареала. Питается водорослями и органикой, соскребая их нижнечелюстным роговым чехликом со дна.',
  fact: 'Подуст чистит дно реки, поедая водоросли — выполняет роль «пылесоса» экосистемы.',
  threats: ['Загрязнение', 'Уничтожение нерестовых субстратов', 'Строительство плотин'],
  conservation: 'Охрана нерестилищ. Запрет строительства.',
  where_to_see: 'Р. Западный Буг (редко)',
  biomass: 0.3,
  regions: ['brest'],
});

/* ── РЕПТИЛИИ И АМФИБИИ ──────────────────────────────────────────────────── */

ids.cherepaha = sp({
  group: 'Рептилии и амфибии', habitat: 'Болото',
  name_ru: 'Черепаха болотная', name_be: 'Балотная чарапаха', name_lat: 'Emys orbicularis',
  category: 'VU', by_category: 'II',
  description: 'Единственная дикая черепаха Беларуси. Греется на берегах заболоченных водоёмов. При опасности мгновенно ныряет. Живёт до 100 лет. Откладывает яйца в прогретую почву. Самая северная черепаха Европы.',
  fact: 'Черепаха болотная определяет пол потомства температурой гнезда: при +28°C рождаются самки, при +26°C — самцы.',
  threats: ['Осушение болот', 'Уничтожение берегов', 'Гибель на дорогах'],
  conservation: 'Охрана водно-болотных угодий. Туннели под дорогами.',
  where_to_see: 'Полесье (Брестская, Гомельская обл.)',
  model: 'procedural', biomass: 0.5,
  regions: ['brest','gomel','grodno'],
  popdata: [[1990,10000,'КК РБ 1993'],[2005,7000,'КК РБ 2004'],[2015,5000,'КК РБ 2015'],[2024,4000,'Мониторинг 2024']],
  trend: [{year:1990,count:10000},{year:2005,count:7000},{year:2015,count:5000},{year:2024,count:4000}],
});

ids.medyanka = sp({
  group: 'Рептилии и амфибии', habitat: 'Широколиственный лес',
  name_ru: 'Медянка', name_be: 'Медзянка', name_lat: 'Coronella austriaca',
  category: 'VU', by_category: 'III',
  description: 'Небольшая безвредная змея. Часто принимается за гадюку и уничтожается. Специализируется на ящерицах — конкурирует с гадюкой за пищу, но не ядовита. Гладкая чешуя с медным блеском.',
  fact: 'Медянка сжимает добычу как удав — потому что ящерицы не боятся яда. Укус человека абсолютно безвреден.',
  threats: ['Уничтожение из-за путаницы с гадюкой', 'Уничтожение сухих опушек'],
  conservation: 'Просветительская работа. Охрана сухих опушек и вырубок.',
  where_to_see: 'Сухие сосновые леса Полесья',
  biomass: 0.05,
  regions: ['brest','gomel','grodno','minsk'],
});

ids.trit = sp({
  group: 'Рептилии и амфибии', habitat: 'Болото',
  name_ru: 'Тритон гребенчатый', name_be: 'Грэбеньчасты трытон', name_lat: 'Triturus cristatus',
  category: 'NT', by_category: 'III',
  description: 'Крупнейший тритон Беларуси. В брачный период самец развивает высокий зубчатый гребень от затылка до хвоста. Днём прячется в укрытиях, ночью охотится. Живёт у лесных водоёмов.',
  fact: 'Гребень самца — не для плавания, а для привлечения самок. В воде он играет роль «хвоста павлина».',
  threats: ['Мелиорация', 'Гибель на дорогах', 'Инвазивные рыбы в водоёмах'],
  conservation: 'Охрана прудов и болот. Ограничение вселения рыбы.',
  where_to_see: 'Лесные пруды по всей Беларуси',
  biomass: 0.02,
  regions: ['brest','gomel','grodno','minsk','vitebsk','mogilev'],
});

/* ── ГРИБЫ ────────────────────────────────────────────────────────────────── */

ids.truffe = sp({
  group: 'Грибы', habitat: 'Широколиственный лес',
  name_ru: 'Трюфель летний', name_be: 'Летні трувель', name_lat: 'Tuber aestivum',
  category: 'EN', by_category: 'I',
  description: 'Подземный гриб — деликатес с неповторимым ароматом. Растёт в симбиозе с корнями дуба и бука. Плодовое тело полностью под землёй. В Беларуси — редчайший вид, известны единичные находки.',
  fact: 'Аромат трюфеля обусловлен андростенолом — феромоном, похожим на половой гормон кабана. Именно поэтому их традиционно ищут со свиньями.',
  threats: ['Вырубка дубрав', 'Уплотнение почвы', 'Сбор до созревания спор'],
  conservation: 'Охрана старых дубрав. Запрет сбора.',
  where_to_see: 'Беловежская пуща (единичные находки)',
  biomass: 0.1,
  regions: ['brest'],
});

ids.mukhomor = sp({
  group: 'Грибы', habitat: 'Хвойный лес',
  name_ru: 'Решёточник красный', name_be: 'Чырвоная кратчатка', name_lat: 'Clathrus ruber',
  category: 'CR', by_category: 'I',
  description: 'Невероятный гриб — красная ажурная решётка. Вылупляется из белого яйца за несколько часов. Тухлый запах привлекает мух, распространяющих споры. Средиземноморский вид, в Беларуси единственная находка в 2019 г.',
  fact: 'Решёточник — один из самых необычных грибов мира. Его рост занимает всего 4–6 часов. Живёт 1–2 дня.',
  threats: ['Недостаточность тепла', 'Уничтожение при сборе'],
  conservation: 'Строгая охрана единственного местонахождения.',
  where_to_see: 'Гродненский район (единственная находка)',
  biomass: 0.05,
  regions: ['grodno'],
});

ids.sparassis = sp({
  group: 'Грибы', habitat: 'Хвойный лес',
  name_ru: 'Спарасис курчавый (грибная капуста)', name_be: 'Кучаравы спарасіс', name_lat: 'Sparassis crispa',
  category: 'VU', by_category: 'III',
  description: 'Гриб, похожий на кочан цветной капусты кремового цвета. Диаметр до 50 см, вес до 5 кг. Растёт у оснований старых сосен. Съедобен и очень вкусен. Обладает противоопухолевыми свойствами.',
  fact: 'Спарасис содержит β-1,3-глюкан — вещество, доказанно усиливающее иммунитет и применяемое в японской медицине.',
  threats: ['Вырубка старых сосновых лесов', 'Сбор до созревания спор'],
  conservation: 'Сохранение старых сосняков. Ограничение сбора.',
  where_to_see: 'Старые сосняки Беларуси',
  biomass: 1.5,
  regions: ['brest','gomel','grodno','minsk','vitebsk','mogilev'],
});

/* ── МХИ И ЛИШАЙНИКИ ─────────────────────────────────────────────────────── */

ids.lobaria = sp({
  group: 'Мхи и лишайники', habitat: 'Широколиственный лес',
  name_ru: 'Лобария лёгочная', name_be: 'Лёгачная лобарыя', name_lat: 'Lobaria pulmonaria',
  category: 'VU', by_category: 'III',
  description: 'Крупный лишайник — симбиоз гриба, водоросли и цианобактерии. Таллом похож на лёгочную ткань. Растёт только в старых нетронутых лесах с постоянной влажностью. Индикатор экологической ценности леса.',
  fact: 'Лобария лёгочная фиксирует атмосферный азот. Раньше её применяли при болезнях лёгких — отсюда и название.',
  threats: ['Вырубка старолесий', 'Загрязнение воздуха (SO₂)', 'Изменение микроклимата'],
  conservation: 'Охрана старовозрастных лесов.',
  where_to_see: 'Беловежская пуща, Налибокская пуща',
  biomass: 0.05,
  regions: ['brest','grodno'],
});

ids.kladon = sp({
  group: 'Мхи и лишайники', habitat: 'Хвойный лес',
  name_ru: 'Кладония звёздчатая', name_be: 'Зорчатая кладонія', name_lat: 'Cladonia stellaris',
  category: 'VU', by_category: 'III',
  description: 'Напочвенный кустистый лишайник, образующий белые кочки в сосновых борах. Один из компонентов оленьего мха — важный корм для оленей зимой. Растёт крайне медленно — 1–3 мм в год.',
  fact: 'Ковёр из кладонии в сосняке может быть возрастом 200–300 лет. Протяжённость "колонии" до 10 м.',
  threats: ['Пожары', 'Вытаптывание', 'Загрязнение воздуха'],
  conservation: 'Охрана сухих сосняков. Противопожарные меры.',
  where_to_see: 'Сухие боры Витебской, Минской, Гомельской областей',
  biomass: 0.1,
  regions: ['vitebsk','minsk','gomel','brest'],
});

  db.exec('COMMIT');
  console.log(`✓ Виды засеяны (${Object.keys(ids).length} видов)`);
} catch (e) {
  db.exec('ROLLBACK');
  console.error('Ошибка при вставке видов:', e.message);
  process.exit(1);
}

/* ══════════════════════════════════════════════════════════════════════════
   ПИЩЕВАЯ СЕТЬ
   ══════════════════════════════════════════════════════════════════════════ */
const insWeb = db.prepare('INSERT OR IGNORE INTO rb_food_web (predator_id, prey_id, strength) VALUES (?,?,?)');

db.exec('BEGIN');
const web = [
  // Орлан-белохвост охотится на рыб, водоплавающих птиц
  [ids.orlan, ids.sterlyadj, 0.6],
  [ids.orlan, ids.usatch, 0.3],
  [ids.orlan, ids.krasnozobaya_kazarka, 0.1],
  // Скопа — только рыба
  [ids.skopa, ids.sterlyadj, 0.7],
  [ids.skopa, ids.usatch, 0.3],
  [ids.skopa, ids.rylets, 0.2],
  // Змееяд — рептилии
  [ids.zmeeyed, ids.medyanka, 0.7],
  [ids.zmeeyed, ids.cherepaha, 0.1],
  // Филин
  [ids.filin, ids.kosulya, 0.2],
  [ids.filin, ids.bober, 0.1],
  [ids.filin, ids.vydra, 0.1],
  // Большой подорлик
  [ids.zhuravl_seryi2, ids.trit, 0.5],
  [ids.zhuravl_seryi2, ids.cherepaha, 0.3],
  [ids.zhuravl_seryi2, ids.minog, 0.2],
  // Рысь — косули, заяц, бобёр
  [ids.rys, ids.kosulya, 0.8],
  [ids.rys, ids.bober, 0.1],
  [ids.rys, ids.zubatka, 0.05],
  // Волк
  [ids.volk, ids.kosulya, 0.7],
  [ids.volk, ids.zubr, 0.1],
  [ids.volk, ids.bober, 0.2],
  // Выдра — рыба, лягушки
  [ids.vydra, ids.sterlyadj, 0.4],
  [ids.vydra, ids.minog, 0.3],
  [ids.vydra, ids.usatch, 0.3],
  // Норка — рыба, раки
  [ids.norka, ids.rylets, 0.4],
  [ids.norka, ids.minog, 0.3],
  [ids.norka, ids.trit, 0.3],
  // Бурый медведь — всеяден
  [ids.medved, ids.bober, 0.15],
  [ids.medved, ids.lobelia, 0.2],
  // Журавль — насекомые, лягушки, зерно
  [ids.zhuravl, ids.trit, 0.3],
  [ids.zhuravl, ids.bogomol, 0.2],
  // Черный аист — рыба, лягушки
  [ids.chorny_aist, ids.minog, 0.4],
  [ids.chorny_aist, ids.sterlyadj, 0.2],
  [ids.chorny_aist, ids.trit, 0.4],
  // Коростель — насекомые
  [ids.dergach, ids.makhаon, 0.1],
  [ids.dergach, ids.bogomol, 0.1],
  // Жук-олень — мёртвая дубовая древесина
  [ids.podolik, ids.lobaria, 0.1],
];
web.forEach(([p, q, s]) => insWeb.run(p, q, s));
db.exec('COMMIT');
console.log(`✓ Пищевая сеть: ${web.length} связей`);

/* ══════════════════════════════════════════════════════════════════════════
   КВЕСТЫ
   ══════════════════════════════════════════════════════════════════════════ */
const insQ = db.prepare('INSERT INTO rb_quests (title, description, species_ids, xp_reward, badge_slug) VALUES (?,?,?,?,?)');

[
  [
    'Спасти зубра',
    'Узнайте историю зубра — от истребления до триумфального возвращения. Пройдите 5 этапов: история вида, генетика, пищевая сеть, ареал и современная охрана.',
    JSON.stringify([ids.zubr, ids.kosulya, ids.volk, ids.rys]),
    200, 'quest_zubr'
  ],
  [
    'Путь чёрного аиста',
    'Проследите миграцию чёрного аиста из белорусских болот в Африку. Изучите биомы, угрозы на маршруте и меры охраны.',
    JSON.stringify([ids.chorny_aist, ids.zhuravl, ids.cherepaha, ids.trit]),
    180, 'quest_black_stork'
  ],
  [
    'Река живёт',
    'Стерлядь — символ здоровья белорусских рек. Узнайте, почему исчезают осетры и как восстановить их популяцию.',
    JSON.stringify([ids.sterlyadj, ids.minog, ids.usatch, ids.vydra, ids.norka]),
    160, 'quest_river'
  ],
  [
    'Последний лес',
    'Беловежская пуща — последний первобытный лес Европы. Исследуйте её обитателей и поймите, почему этот лес уникален.',
    JSON.stringify([ids.zubr, ids.rys, ids.filin, ids.venerina, ids.podolik, ids.truffe]),
    250, 'quest_forest'
  ],
].forEach(args => insQ.run(...args));

console.log('✓ Квесты');
console.log('\n✅ seed-red-book.js завершён успешно!');
console.log(`   Видов: ${Object.keys(ids).length}`);
console.log('   Запустите: node src/db/migrate.js && node src/db/seed-red-book.js');
