#!/usr/bin/env tsx
/**
 * Remove region-wide service areas from worker profiles and normalize customer cities.
 * - All ENTIRE_* region-wide areas → removed from workers
 * - Workers who only had ENTIRE_DAVAO_REGION → expanded to all Davao region cities
 * - Workers left with no areas → DAVAO_CITY fallback
 * - Customer city "Entire Davao Region" / "Entire Mindanao" → Davao City
 */
import { PrismaClient } from '@prisma/client';
import {
  DAVAO_REGION_CITIES,
  REGION_WIDE_SERVICE_AREAS,
  WORKER_SELECTABLE_SERVICE_AREAS,
} from '@ehandyhire/shared';

const prisma = new PrismaClient();
const SELECTABLE = new Set<string>(WORKER_SELECTABLE_SERVICE_AREAS);
const REGION_WIDE_AREAS = [...REGION_WIDE_SERVICE_AREAS];
const FALLBACK_AREA = 'DAVAO_CITY';
const DAVAO_CITIES = [...DAVAO_REGION_CITIES];

async function main() {
  const regionWideRows = await prisma.workerServiceArea.findMany({
    where: { area: { in: [...REGION_WIDE_AREAS] } },
    select: { id: true, workerId: true, area: true },
  });

  const davaoOnlyWorkerIds = new Set<string>();

  for (const row of regionWideRows) {
    if (row.area !== 'ENTIRE_DAVAO_REGION') continue;
    const workerAreas = await prisma.workerServiceArea.findMany({
      where: { workerId: row.workerId },
      select: { area: true },
    });
    const cityAreas = workerAreas.filter((sa) => SELECTABLE.has(sa.area));
    if (cityAreas.length === 0) {
      davaoOnlyWorkerIds.add(row.workerId);
    }
  }

  if (regionWideRows.length > 0) {
    await prisma.workerServiceArea.deleteMany({
      where: { area: { in: [...REGION_WIDE_AREAS] } },
    });
    console.log(`Removed ${regionWideRows.length} region-wide worker service area row(s).`);
  } else {
    console.log('No region-wide worker service areas found.');
  }

  for (const workerId of davaoOnlyWorkerIds) {
    await prisma.workerServiceArea.createMany({
      data: DAVAO_CITIES.map((area) => ({ workerId, area })),
      skipDuplicates: true,
    });
  }
  if (davaoOnlyWorkerIds.size > 0) {
    console.log(
      `Expanded ENTIRE_DAVAO_REGION to ${DAVAO_CITIES.length} cities for ${davaoOnlyWorkerIds.size} worker(s).`
    );
  }

  const workers = await prisma.workerProfile.findMany({
    where: { deletedAt: null },
    select: {
      id: true,
      serviceAreas: { select: { id: true, area: true } },
    },
  });

  let fallbackAdded = 0;
  let invalidRemoved = 0;

  for (const worker of workers) {
    const invalid = worker.serviceAreas.filter((sa) => !SELECTABLE.has(sa.area));
    if (invalid.length > 0) {
      await prisma.workerServiceArea.deleteMany({
        where: { id: { in: invalid.map((sa) => sa.id) } },
      });
      invalidRemoved += invalid.length;
    }

    const remaining = worker.serviceAreas.filter((sa) => SELECTABLE.has(sa.area));
    if (remaining.length === 0) {
      await prisma.workerServiceArea.create({
        data: { workerId: worker.id, area: FALLBACK_AREA },
      });
      fallbackAdded += 1;
    }
  }

  if (invalidRemoved > 0) {
    console.log(`Removed ${invalidRemoved} other unselectable service area row(s).`);
  }
  if (fallbackAdded > 0) {
    console.log(`Added ${FALLBACK_AREA} fallback for ${fallbackAdded} worker(s) with no areas.`);
  }

  const customerCityUpdates = await prisma.customerProfile.updateMany({
    where: {
      OR: [
        { city: { contains: 'Entire Davao' } },
        { city: { contains: 'Entire Mindanao' } },
        { city: { equals: 'ENTIRE_DAVAO_REGION' } },
        { city: { equals: 'ENTIRE_MINDANAO' } },
      ],
    },
    data: { city: 'Davao City' },
  });
  if (customerCityUpdates.count > 0) {
    console.log(`Updated ${customerCityUpdates.count} customer profile city value(s).`);
  }

  const total = await prisma.workerServiceArea.count();
  console.log(`Done. ${workers.length} worker profile(s), ${total} service area row(s) total.`);
}

main()
  .catch((err) => {
    console.error(err);
    process.exit(1);
  })
  .finally(() => prisma.$disconnect());
