-- Phase 18: canonical item supplier relation for inventory supplier reports
-- الهدف: اعتماد علاقة مباشرة وسريعة:
-- items.default_supplier_id -> parties.id حيث parties.is_supplier = 1
--
-- هذا الملف لا ينشئ جدول جديد. يقوم فقط بتوحيد بيانات الربط وإضافة Index/FK إن لم يكونا موجودين.
-- شغّله مرة واحدة بعد أخذ نسخة احتياطية من قاعدة البيانات.

START TRANSACTION;

-- 1) في حال كانت بعض القيم القديمة تشير إلى suppliers.id بدل parties.id،
-- نحولها إلى party supplier مطابق بالاسم/الهاتف/الإيميل، لكن مرة واحدة فقط داخل Migration.
UPDATE items i
JOIN suppliers s ON s.id = i.default_supplier_id
JOIN parties p ON COALESCE(p.is_supplier,0) = 1
  AND (
    p.name = s.name
    OR (p.phone IS NOT NULL AND p.phone <> '' AND s.phone IS NOT NULL AND s.phone <> '' AND p.phone = s.phone)
    OR (p.email IS NOT NULL AND p.email <> '' AND s.email IS NOT NULL AND s.email <> '' AND p.email = s.email)
  )
SET i.default_supplier_id = p.id
WHERE i.default_supplier_id IS NOT NULL
  AND NOT EXISTS (
    SELECT 1
    FROM parties pp
    WHERE pp.id = i.default_supplier_id
      AND COALESCE(pp.is_supplier,0) = 1
  );

-- 2) أي قيمة لا تشير إلى مورد فعلي في parties يتم تصفيرها بدل ترك علاقة خاطئة.
UPDATE items i
LEFT JOIN parties p ON p.id = i.default_supplier_id AND COALESCE(p.is_supplier,0) = 1
SET i.default_supplier_id = NULL
WHERE i.default_supplier_id IS NOT NULL
  AND p.id IS NULL;

COMMIT;

-- 3) إضافة Index لو غير موجود، لتحسين تقارير أرصدة الأصناف حسب المورد مع كثرة الأصناف.
SET @idx_exists := (
  SELECT COUNT(1)
  FROM information_schema.statistics
  WHERE table_schema = DATABASE()
    AND table_name = 'items'
    AND index_name = 'idx_items_default_supplier'
);
SET @sql := IF(@idx_exists = 0,
  'ALTER TABLE items ADD INDEX idx_items_default_supplier (default_supplier_id)',
  'SELECT ''idx_items_default_supplier already exists'' AS info'
);
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

-- 4) إضافة Foreign Key لو غير موجود، لضمان سلامة العلاقة مستقبلًا.
SET @fk_exists := (
  SELECT COUNT(1)
  FROM information_schema.table_constraints
  WHERE table_schema = DATABASE()
    AND table_name = 'items'
    AND constraint_name = 'fk_items_default_supplier_party'
    AND constraint_type = 'FOREIGN KEY'
);
SET @sql := IF(@fk_exists = 0,
  'ALTER TABLE items ADD CONSTRAINT fk_items_default_supplier_party FOREIGN KEY (default_supplier_id) REFERENCES parties(id) ON UPDATE CASCADE ON DELETE SET NULL',
  'SELECT ''fk_items_default_supplier_party already exists'' AS info'
);
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
