/**
 * Additive city + sample listing upsert — does NOT drop the database.
 * Run: npm run upsert:cities
 */
import { connectDb, disconnectDb } from "../src/db/mongoose";
import { createId } from "../src/db/ids";
import { City, Property, PropertyUpdate, User } from "../src/db/models";
import { TUNISIA_CITIES } from "../src/data/tunisiaCities";

const NEIGHBORHOODS: Record<string, { en: string[]; ar: string[] }> = {
  tunis: {
    en: ["Lac 2", "Centre Ville", "Mutuelleville", "Les Berges du Lac"],
    ar: ["البحيرة 2", "وسط المدينة", "الموتويلفيل", "ضفاف البحيرة"],
  },
  "la-marsa": {
    en: ["Corniche", "Sidi Bou Said road", "Plage"],
    ar: ["الكورنيش", "طريق سيدي بوسعيد", "الشاطئ"],
  },
  gammarth: {
    en: ["Les Côtes de Carthage", "Beach road"],
    ar: ["سواحل قرطاج", "طريق الشاطئ"],
  },
  hammamet: {
    en: ["Yasmine", "Medina", "Centre"],
    ar: ["الياسمين", "المدينة العتيقة", "الوسط"],
  },
  nabeul: {
    en: ["Centre", "Dar Chaabane road"],
    ar: ["الوسط", "طريق دار شعبان"],
  },
  sousse: {
    en: ["Port El Kantaoui", "Medina", "Boujaafar"],
    ar: ["القنطاوي", "المدينة العتيقة", "بوجعفر"],
  },
  monastir: {
    en: ["Corniche", "Airport road", "Centre"],
    ar: ["الكورنيش", "طريق المطار", "الوسط"],
  },
  mahdia: {
    en: ["Borj El Kebir area", "Corniche"],
    ar: ["منطقة برج الكبير", "الكورنيش"],
  },
  sfax: {
    en: ["Sidi Mansour", "Centre Ville"],
    ar: ["سيدي منصور", "وسط المدينة"],
  },
  djerba: {
    en: ["Houmt Souk", "Midoun", "Aghir"],
    ar: ["حومة السوق", "ميدون", "أغهير"],
  },
  tozeur: {
    en: ["Palm grove", "Centre"],
    ar: ["واحة النخيل", "الوسط"],
  },
  bizerte: {
    en: ["Old Port", "Corniche"],
    ar: ["الميناء القديم", "الكورنيش"],
  },
  kairouan: {
    en: ["Medina", "Aghlabid basins area"],
    ar: ["المدينة العتيقة", "منطقة الأحواض الأغلبية"],
  },
  tabarka: {
    en: ["Port", "Forest road"],
    ar: ["الميناء", "طريق الغابة"],
  },
};

async function main() {
  console.log("Upserting Tunisia cities (additive)...");
  await connectDb();

  const cityDocs: any[] = [];
  for (const def of TUNISIA_CITIES) {
    const city = await City.findOneAndUpdate(
      { slug: def.slug },
      {
        $set: {
          nameEn: def.nameEn,
          nameAr: def.nameAr,
          slug: def.slug,
          country: "Tunisia",
          region: def.region,
          isTourist: def.isTourist,
          aliases: def.aliases,
          blurbEn: def.blurbEn,
          blurbAr: def.blurbAr,
          imageUrl: def.imageUrl,
          deletedAt: null,
        },
        $setOnInsert: { _id: createId() },
      },
      { upsert: true, new: true },
    );
    cityDocs.push(city);
    console.log(`  ✓ ${def.nameEn}`);
  }

  const owners = await User.find({ role: "OWNER", deletedAt: null }).limit(10).lean();
  if (owners.length === 0) {
    console.log("No owners found — skip sample listings. Run full seed first if needed.");
    await disconnectDb();
    return;
  }

  let created = 0;
  for (const city of cityDocs) {
    const existing = await Property.countDocuments({ cityId: city._id, deletedAt: null });
    if (existing >= 2) continue;

    const hoods = NEIGHBORHOODS[city.slug] || {
      en: ["Centre"],
      ar: ["الوسط"],
    };
    const need = 2 - existing;
    for (let i = 0; i < need; i++) {
      const owner = owners[(created + i) % owners.length];
      const hoodEn = hoods.en[i % hoods.en.length];
      const hoodAr = hoods.ar[i % hoods.ar.length];
      const bedrooms = 1 + ((created + i) % 3);
      const price = 140 + ((created + i) % 12) * 25;
      const slug = `${city.slug}-stay-${Date.now().toString(36)}-${i}`;
      const property = await Property.create({
        ownerId: owner._id,
        cityId: city._id,
        titleEn: `${bedrooms}-bedroom apartment in ${hoodEn}, ${city.nameEn}`,
        titleAr: `شقة ${
          bedrooms === 1 ? "غرفة واحدة" : bedrooms === 2 ? "غرفتان" : `${bedrooms} غرف`
        } في ${hoodAr}، ${city.nameAr}`,
        slug,
        descriptionEn: `Bright furnished apartment in ${hoodEn}, ${city.nameEn}. Wi‑Fi, kitchen, and AC — suited for Libyan families visiting Tunisia for leisure, treatment, or study. Walking distance to local shops and cafés.`,
        descriptionAr: `شقة مفروشة مضيئة في ${hoodAr}، ${city.nameAr}. واي فاي ومطبخ وتكييف — مناسبة للعائلات الليبية في تونس للسياحة أو العلاج أو الدراسة. قريبة من المحلات والمقاهي.`,
        address: `${12 + i} Rue ${hoodEn}, ${city.nameEn}, Tunisia`,
        latitude: TUNISIA_CITIES.find((c) => c.slug === city.slug)?.lat,
        longitude: TUNISIA_CITIES.find((c) => c.slug === city.slug)?.lng,
        status: "PUBLISHED",
        bedrooms,
        bathrooms: Math.max(1, bedrooms - 1),
        maxGuests: bedrooms * 2,
        wifi: true,
        parking: i % 2 === 0,
        airConditioning: true,
        kitchen: true,
        hospitalNearby: city.slug === "tunis" || city.slug === "sfax",
        universityNearby: city.slug === "tunis" || city.slug === "sousse",
        petFriendly: false,
        instantBooking: i === 0,
        basePriceTnd: price,
        cleaningFeeTnd: 35,
        cancellationPolicy: "Free cancellation up to 48 hours before check-in.",
        houseRules: "No smoking indoors. Quiet hours after 22:00.",
        featured: city.isTourist && i === 0,
        images: [
          {
            _id: createId(),
            url: `/images/stay-${1 + ((created + i) % 8)}.jpg`,
            sortOrder: 0,
            createdAt: new Date(),
          },
        ],
      });

      await PropertyUpdate.create({
        propertyId: property._id,
        ownerId: owner._id,
        titleEn: "Welcome — check-in tips",
        titleAr: "مرحباً — نصائح عند الوصول",
        bodyEn: `Self check-in from 15:00. Parking tips and Wi‑Fi details are in your booking confirmation. Message us anytime for airport pickup advice in ${city.nameEn}.`,
        bodyAr: `تسجيل الوصول الذاتي من الساعة 15:00. تفاصيل الموقف والواي فاي في تأكيد الحجز. راسلونا لأي استفسار عن الوصول من المطار في ${city.nameAr}.`,
      });
      created++;
    }
  }

  console.log(`Done. Cities: ${cityDocs.length}. New sample listings: ${created}.`);
  await disconnectDb();
}

main().catch(async (err) => {
  console.error(err);
  await disconnectDb().catch(() => undefined);
  process.exit(1);
});
