<?php

namespace Core\Database\Seeds;

class AddressSeeder
{
    protected \PDO $db;

    public function __construct()
    {
        $this->db = db();
    }

    /**
     * تشغيل Seed: إدراج ولايات + بلديات الجزائر
     */
    public function run()
    {
        $jsonPath = ROOT_PATH . "/core/database/seeds/algeria_cities.json";

        if (!file_exists($jsonPath)) {
            throw new \Exception("Missing seed file: algeria_cities.json");
        }

        $data = json_decode(file_get_contents($jsonPath), true);

        if (!$data || !is_array($data)) {
            throw new \Exception("Invalid JSON structure in algeria_cities.json");
        }

        $this->seedStatesAndCities($data);
    }

    /**
     * معالجة الولايات والبلديات
     */
    protected function seedStatesAndCities(array $data)
    {
        // تجهيز جملة إدراج الولايات
        $stateStmt = $this->db->prepare("
            INSERT INTO states (country, name, code)
            VALUES ('Algeria', ?, ?)
        ");

        // تجهيز جملة إدراج البلديات
        $cityStmt = $this->db->prepare("
            INSERT INTO cities (state_id, name)
            VALUES (?, ?)
        ");

        $statesMap = [];  // code => state_id

        foreach ($data as $item) {

            $stateCode = $item['wilaya_code'];
            $stateName = $item['wilaya_name'];
            $cityName  = $item['commune_name'];

            // -----------------------------------------
            //  إدراج الولاية فقط إذا لم تكن موجودة
            // -----------------------------------------
            if (!isset($statesMap[$stateCode])) {

                // تحقق من وجود الولاية مسبقاً
                $check = $this->db->prepare("SELECT id FROM states WHERE code = ?");
                $check->execute([$stateCode]);
                $existing = $check->fetchColumn();

                if ($existing) {
                    $statesMap[$stateCode] = $existing;
                } else {
                    $stateStmt->execute([$stateName, $stateCode]);
                    $statesMap[$stateCode] = $this->db->lastInsertId();
                }
            }

            // -----------------------------------------
            // إدراج البلدية
            // -----------------------------------------
            $cityStmt->execute([
                $statesMap[$stateCode],
                $cityName
            ]);
        }
    }
}
