/**
 * Seed MacroeconomicData and InfrastructureProject tables.
 *
 * MacroeconomicData: 50+ rows — HCMC & Hanoi, quarterly 2023-Q1 → 2025-Q4.
 * InfrastructureProject: 15 real projects with coordinates, status, dates, investment.
 */

import { type PrismaClient } from '@prisma/client';

// =============================================================================
// MacroeconomicData — HCMC & Hanoi, quarterly 2023–2025
// =============================================================================

interface MacroRow {
  province: string;
  indicator: string;
  value: number;
  unit: string;
  period: string;
  source: string;
}

const QUARTERS = [
  '2023-Q1', '2023-Q2', '2023-Q3', '2023-Q4',
  '2024-Q1', '2024-Q2', '2024-Q3', '2024-Q4',
  '2025-Q1', '2025-Q2', '2025-Q3', '2025-Q4',
];

/**
 * Helper: generate quarterly series with a base value and per-quarter growth.
 */
function quarterlySeries(
  province: string,
  indicator: string,
  unit: string,
  source: string,
  baseValue: number,
  quarterlyGrowth: number,
): MacroRow[] {
  return QUARTERS.map((period, i) => ({
    province,
    indicator,
    value: Math.round((baseValue + baseValue * quarterlyGrowth * i) * 100) / 100,
    unit,
    period,
    source,
  }));
}

function buildMacroData(): MacroRow[] {
  const rows: MacroRow[] = [];

  // ── Hồ Chí Minh ──────────────────────────────────────────

  // GDP growth (% YoY per quarter)
  const hcmcGdpGrowth = [5.8, 6.1, 6.4, 6.7, 6.2, 6.5, 6.8, 7.1, 6.9, 7.2, 7.0, 7.3];
  QUARTERS.forEach((q, i) => rows.push({ province: 'Hồ Chí Minh', indicator: 'gdp_growth', value: hcmcGdpGrowth[i]!, unit: '%', period: q, source: 'GSO' }));

  // CPI (% YoY)
  const hcmcCpi = [3.1, 3.3, 3.5, 3.8, 4.0, 3.9, 4.1, 4.2, 3.8, 3.6, 3.5, 3.4];
  QUARTERS.forEach((q, i) => rows.push({ province: 'Hồ Chí Minh', indicator: 'cpi', value: hcmcCpi[i]!, unit: '%', period: q, source: 'GSO' }));

  // Population (persons, grows slowly)
  rows.push(...quarterlySeries('Hồ Chí Minh', 'population', 'người', 'GSO', 9_800_000, 0.003));

  // Construction permits (number per quarter)
  const hcmcPermits = [1250, 1380, 1420, 1510, 1320, 1460, 1550, 1620, 1480, 1590, 1650, 1720];
  QUARTERS.forEach((q, i) => rows.push({ province: 'Hồ Chí Minh', indicator: 'construction_permits', value: hcmcPermits[i]!, unit: 'giấy phép', period: q, source: 'Sở Xây dựng TP.HCM' }));

  // FDI (million USD per quarter)
  const hcmcFdi = [1650, 1800, 1920, 2050, 1780, 1950, 2100, 2200, 1900, 2080, 2150, 2300];
  QUARTERS.forEach((q, i) => rows.push({ province: 'Hồ Chí Minh', indicator: 'fdi', value: hcmcFdi[i]!, unit: 'triệu USD', period: q, source: 'GSO' }));

  // RE transaction volume (number of transactions per quarter)
  const hcmcTxVol = [8500, 9200, 10100, 11500, 9800, 10500, 11200, 12800, 10200, 11000, 11800, 13500];
  QUARTERS.forEach((q, i) => rows.push({ province: 'Hồ Chí Minh', indicator: 're_transaction_volume', value: hcmcTxVol[i]!, unit: 'giao dịch', period: q, source: 'Sở Xây dựng TP.HCM' }));

  // ── Hà Nội ────────────────────────────────────────────────

  // GDP growth
  const hanoiGdpGrowth = [5.2, 5.5, 5.8, 6.0, 5.9, 6.2, 6.5, 6.8, 6.4, 6.7, 6.9, 7.1];
  QUARTERS.forEach((q, i) => rows.push({ province: 'Hà Nội', indicator: 'gdp_growth', value: hanoiGdpGrowth[i]!, unit: '%', period: q, source: 'GSO' }));

  // CPI
  const hanoiCpi = [2.8, 3.0, 3.2, 3.5, 3.7, 3.6, 3.8, 3.9, 3.5, 3.3, 3.2, 3.1];
  QUARTERS.forEach((q, i) => rows.push({ province: 'Hà Nội', indicator: 'cpi', value: hanoiCpi[i]!, unit: '%', period: q, source: 'GSO' }));

  // Population
  rows.push(...quarterlySeries('Hà Nội', 'population', 'người', 'GSO', 8_400_000, 0.0025));

  // Construction permits
  const hanoiPermits = [980, 1050, 1120, 1200, 1060, 1150, 1230, 1310, 1180, 1260, 1340, 1420];
  QUARTERS.forEach((q, i) => rows.push({ province: 'Hà Nội', indicator: 'construction_permits', value: hanoiPermits[i]!, unit: 'giấy phép', period: q, source: 'Sở Xây dựng Hà Nội' }));

  // FDI
  const hanoiFdi = [1400, 1520, 1650, 1750, 1500, 1620, 1780, 1850, 1600, 1730, 1820, 1950];
  QUARTERS.forEach((q, i) => rows.push({ province: 'Hà Nội', indicator: 'fdi', value: hanoiFdi[i]!, unit: 'triệu USD', period: q, source: 'GSO' }));

  // RE transaction volume
  const hanoiTxVol = [7200, 7800, 8500, 9600, 8100, 8800, 9500, 10800, 8600, 9300, 10000, 11200];
  QUARTERS.forEach((q, i) => rows.push({ province: 'Hà Nội', indicator: 're_transaction_volume', value: hanoiTxVol[i]!, unit: 'giao dịch', period: q, source: 'Sở Xây dựng Hà Nội' }));

  return rows;
}

// =============================================================================
// InfrastructureProject — 15 real projects with coordinates
// =============================================================================

interface InfraRow {
  name: string;
  province: string;
  category: string;
  status: string;
  investmentVND: bigint;
  startDate: Date | null;
  completionDate: Date | null;
  description: string;
  impactRadius: number;
  lat: number;
  lng: number;
}

function buildInfraProjects(): InfraRow[] {
  return [
    // 1. Metro Line 1 (Bến Thành – Suối Tiên)
    {
      name: 'Metro Bến Thành – Suối Tiên (Tuyến 1)',
      province: 'Hồ Chí Minh',
      category: 'metro',
      status: 'completed',
      investmentVND: BigInt(43_700_000_000_000),
      startDate: new Date('2012-08-28'),
      completionDate: new Date('2024-12-22'),
      description: 'Tuyến metro đầu tiên TP.HCM, 19.7km, 14 ga. Kết nối Quận 1 – Thủ Đức – Bình Dương.',
      impactRadius: 3.0,
      lat: 10.7721,
      lng: 106.6980,
    },
    // 2. Metro Line 2 (Bến Thành – Tham Lương)
    {
      name: 'Metro Bến Thành – Tham Lương (Tuyến 2)',
      province: 'Hồ Chí Minh',
      category: 'metro',
      status: 'planning',
      investmentVND: BigInt(47_800_000_000_000),
      startDate: new Date('2026-06-01'),
      completionDate: new Date('2032-12-01'),
      description: 'Tuyến metro số 2, 11.3km, 10 ga. Kết nối trung tâm đến Tân Bình, Q12.',
      impactRadius: 2.5,
      lat: 10.7731,
      lng: 106.6930,
    },
    // 3. Thu Duc Innovation District (Khu đô thị sáng tạo Thủ Đức)
    {
      name: 'Khu Đô thị Sáng tạo Tương tác cao phía Đông (Thủ Đức)',
      province: 'Hồ Chí Minh',
      category: 'urban_development',
      status: 'under_construction',
      investmentVND: BigInt(300_000_000_000_000),
      startDate: new Date('2020-01-01'),
      completionDate: new Date('2040-12-01'),
      description: 'Siêu dự án đô thị sáng tạo 21,172ha tại TP. Thủ Đức, gồm khu công nghệ cao, tài chính, giáo dục.',
      impactRadius: 10.0,
      lat: 10.8231,
      lng: 106.7620,
    },
    // 4. Ring Road 3 (Vành đai 3 TP.HCM)
    {
      name: 'Đường Vành đai 3 TP.HCM',
      province: 'Hồ Chí Minh',
      category: 'highway',
      status: 'under_construction',
      investmentVND: BigInt(75_400_000_000_000),
      startDate: new Date('2023-06-18'),
      completionDate: new Date('2026-12-01'),
      description: 'Tuyến vành đai 76km qua TP.HCM, Bình Dương, Đồng Nai, Long An. 4-8 làn xe.',
      impactRadius: 5.0,
      lat: 10.8500,
      lng: 106.7800,
    },
    // 5. Long Thanh International Airport — Phase 1
    {
      name: 'Cảng Hàng không Quốc tế Long Thành – Giai đoạn 1',
      province: 'Đồng Nai',
      category: 'airport',
      status: 'under_construction',
      investmentVND: BigInt(109_000_000_000_000),
      startDate: new Date('2021-01-05'),
      completionDate: new Date('2026-12-01'),
      description: 'Sân bay quốc tế mới, công suất 25 triệu HK/năm (GĐ1), 100 triệu HK/năm (hoàn thành).',
      impactRadius: 15.0,
      lat: 10.9730,
      lng: 107.0070,
    },
    // 6. Can Gio Bridge (Cầu Cần Giờ)
    {
      name: 'Cầu Cần Giờ',
      province: 'Hồ Chí Minh',
      category: 'bridge',
      status: 'planning',
      investmentVND: BigInt(10_000_000_000_000),
      startDate: new Date('2025-12-01'),
      completionDate: new Date('2028-12-01'),
      description: 'Cầu dây văng nối Nhà Bè – Cần Giờ, dài ~3.4km, rộng 6 làn xe. Mở khóa tiềm năng du lịch & BĐS Cần Giờ.',
      impactRadius: 8.0,
      lat: 10.6190,
      lng: 106.7530,
    },
    // 7. Cao tốc TP.HCM – Long Thành – Dầu Giây (mở rộng)
    {
      name: 'Cao tốc TP.HCM – Long Thành – Dầu Giây (mở rộng)',
      province: 'Hồ Chí Minh',
      category: 'highway',
      status: 'under_construction',
      investmentVND: BigInt(9_000_000_000_000),
      startDate: new Date('2024-03-01'),
      completionDate: new Date('2027-06-01'),
      description: 'Mở rộng từ 4 lên 8-10 làn xe, 55km. Giảm ùn tắc kết nối sân bay Long Thành.',
      impactRadius: 4.0,
      lat: 10.8350,
      lng: 106.8600,
    },
    // 8. Cao tốc Bến Lức – Long Thành
    {
      name: 'Cao tốc Bến Lức – Long Thành',
      province: 'Đồng Nai',
      category: 'highway',
      status: 'under_construction',
      investmentVND: BigInt(31_300_000_000_000),
      startDate: new Date('2014-07-01'),
      completionDate: new Date('2026-09-01'),
      description: 'Tuyến cao tốc 57.8km kết nối Long An – TP.HCM – Đồng Nai, vượt sông Sài Gòn.',
      impactRadius: 5.0,
      lat: 10.7200,
      lng: 106.8500,
    },
    // 9. Metro Line 3 Hà Nội (Nhổn – Ga Hà Nội)
    {
      name: 'Metro Nhổn – Ga Hà Nội (Tuyến 3)',
      province: 'Hà Nội',
      category: 'metro',
      status: 'under_construction',
      investmentVND: BigInt(34_800_000_000_000),
      startDate: new Date('2010-09-01'),
      completionDate: new Date('2027-12-01'),
      description: 'Tuyến metro 12.5km, 12 ga, kết nối Nhổn – Cầu Giấy – ga Hà Nội.',
      impactRadius: 2.5,
      lat: 21.0285,
      lng: 105.8542,
    },
    // 10. Metro Line 2A Hà Nội (Cát Linh – Hà Đông)
    {
      name: 'Metro Cát Linh – Hà Đông (Tuyến 2A)',
      province: 'Hà Nội',
      category: 'metro',
      status: 'completed',
      investmentVND: BigInt(18_000_000_000_000),
      startDate: new Date('2011-10-10'),
      completionDate: new Date('2021-11-06'),
      description: 'Tuyến đường sắt trên cao đầu tiên Hà Nội, 13.1km, 12 ga.',
      impactRadius: 2.0,
      lat: 21.0033,
      lng: 105.8245,
    },
    // 11. Vành đai 4 Hà Nội
    {
      name: 'Đường Vành đai 4 – Vùng Thủ đô Hà Nội',
      province: 'Hà Nội',
      category: 'highway',
      status: 'under_construction',
      investmentVND: BigInt(85_800_000_000_000),
      startDate: new Date('2023-06-25'),
      completionDate: new Date('2027-12-01'),
      description: 'Tuyến vành đai 112km qua Hà Nội, Hưng Yên, Bắc Ninh. 6 làn cao tốc.',
      impactRadius: 6.0,
      lat: 21.0500,
      lng: 105.9000,
    },
    // 12. Sân bay Tân Sơn Nhất – Nhà ga T3
    {
      name: 'Nhà ga T3 Sân bay Tân Sơn Nhất',
      province: 'Hồ Chí Minh',
      category: 'airport',
      status: 'under_construction',
      investmentVND: BigInt(10_990_000_000_000),
      startDate: new Date('2022-12-01'),
      completionDate: new Date('2025-04-30'),
      description: 'Nhà ga hành khách T3, công suất 20 triệu HK/năm, nâng tổng công suất TSN lên 50 triệu.',
      impactRadius: 5.0,
      lat: 10.8188,
      lng: 106.6590,
    },
    // 13. Cảng trung chuyển quốc tế Cần Giờ
    {
      name: 'Cảng Trung chuyển Quốc tế Cần Giờ',
      province: 'Hồ Chí Minh',
      category: 'port',
      status: 'planning',
      investmentVND: BigInt(113_000_000_000_000),
      startDate: new Date('2025-06-01'),
      completionDate: new Date('2035-12-01'),
      description: 'Siêu cảng trung chuyển container quốc tế tại Cần Giờ, công suất 10-15 triệu TEU/năm.',
      impactRadius: 12.0,
      lat: 10.4110,
      lng: 106.9480,
    },
    // 14. Đường sắt tốc độ cao Bắc – Nam (GĐ1)
    {
      name: 'Đường sắt Tốc độ cao Bắc – Nam (Giai đoạn 1)',
      province: 'Hà Nội',
      category: 'railway',
      status: 'planning',
      investmentVND: BigInt(670_000_000_000_000),
      startDate: new Date('2027-01-01'),
      completionDate: new Date('2035-12-01'),
      description: 'Đoạn Hà Nội – Vinh & Nha Trang – TP.HCM, tốc độ thiết kế 350km/h.',
      impactRadius: 10.0,
      lat: 21.0028,
      lng: 105.8440,
    },
    // 15. Cao tốc Mỹ Phước – Tân Vạn (mở rộng)
    {
      name: 'Cao tốc Mỹ Phước – Tân Vạn (mở rộng)',
      province: 'Bình Dương',
      category: 'highway',
      status: 'under_construction',
      investmentVND: BigInt(4_500_000_000_000),
      startDate: new Date('2023-09-01'),
      completionDate: new Date('2026-06-01'),
      description: 'Mở rộng kết nối các KCN Bình Dương với TP.HCM, từ 4 lên 8 làn xe.',
      impactRadius: 3.0,
      lat: 10.9800,
      lng: 106.6530,
    },
  ];
}

// =============================================================================
// Public seed function
// =============================================================================

export async function seedMacroAndInfra(prisma: PrismaClient) {
  console.log('📈 Seeding macroeconomic data...');

  const macroData = buildMacroData();
  for (const d of macroData) {
    await prisma.macroeconomicData.upsert({
      where: {
        province_indicator_period: {
          province: d.province,
          indicator: d.indicator,
          period: d.period,
        },
      },
      create: d,
      update: { value: d.value, unit: d.unit, source: d.source },
    });
  }
  console.log(`  ✓ ${macroData.length} macroeconomic data points seeded (HCMC + Hanoi, quarterly 2023–2025)`);

  console.log('🏗️ Seeding infrastructure projects...');

  const infraProjects = buildInfraProjects();
  for (const p of infraProjects) {
    const existing = await prisma.infrastructureProject.findFirst({
      where: { name: p.name, province: p.province },
    });
    if (existing) {
      // Update existing record with coordinates and dates if missing
      await prisma.$executeRaw`
        UPDATE "InfrastructureProject"
        SET "status" = ${p.status},
            "investmentVND" = ${p.investmentVND},
            "startDate" = ${p.startDate},
            "completionDate" = ${p.completionDate},
            "description" = ${p.description},
            "impactRadius" = ${p.impactRadius},
            "location" = ST_SetSRID(ST_MakePoint(${p.lng}, ${p.lat}), 4326),
            "updatedAt" = NOW()
        WHERE "id" = ${existing.id}
      `;
    } else {
      await prisma.$executeRaw`
        INSERT INTO "InfrastructureProject" (
          "id", "name", "province", "category", "status",
          "investmentVND", "startDate", "completionDate",
          "description", "impactRadius", "location",
          "createdAt", "updatedAt"
        ) VALUES (
          gen_random_uuid(), ${p.name}, ${p.province}, ${p.category}, ${p.status},
          ${p.investmentVND}, ${p.startDate}, ${p.completionDate},
          ${p.description}, ${p.impactRadius},
          ST_SetSRID(ST_MakePoint(${p.lng}, ${p.lat}), 4326),
          NOW(), NOW()
        )
      `;
    }
  }
  console.log(`  ✓ ${infraProjects.length} infrastructure projects seeded (with coordinates)`);
}
