"""
Checkpoint Manager Module
إدارة نقاط الحفظ (Checkpoints) لكل سكريبت
يقرأ من log.csv لمعرفة آخر سجل تم معالجته
"""

import os
import csv
from datetime import datetime


class CheckpointManager:
    """
    كلاس لإدارة نقاط الحفظ (Checkpoints)
    يقرأ من log.csv بدلاً من ملفات منفصلة
    """

    def __init__(self, script_name, log_file="log.csv"):
        """
        تهيئة الكلاس

        Args:
            script_name (str): اسم السكريبت (مثل: "SAM", "OFAC", "Exclusions")
            log_file (str): مسار ملف السجلات
        """
        self.script_name = script_name.upper()  # SAM, OFAC, Exclusions
        self.log_file = log_file
        self.processed_names = set()  # أسماء تم معالجتها
        self.last_processed_count = 0

        # قراءة السجلات الموجودة
        self._load_processed_records()
    
    def _load_processed_records(self):
        """
        قراءة السجلات المعالجة من log.csv
        """
        if not os.path.exists(self.log_file):
            return

        try:
            with open(self.log_file, 'r', encoding='utf-8') as f:
                reader = csv.DictReader(f)
                for row in reader:
                    # التحقق من أن السجل خاص بهذا السكريبت
                    if row.get('Website', '').upper() == self.script_name:
                        name = row.get('Name', '')
                        database = row.get('Database', '')

                        if name and database:
                            # حفظ الاسم + قاعدة البيانات كمفتاح فريد
                            key = f"{name}|{database}"
                            self.processed_names.add(key)
                            self.last_processed_count += 1

        except Exception as e:
            print(f"[!] Error reading log file: {e}")

    def is_processed(self, name, database):
        """
        التحقق من أن السجل تم معالجته مسبقاً

        Args:
            name (str): اسم الشخص
            database (str): اسم قاعدة البيانات

        Returns:
            bool: True إذا تم معالجته مسبقاً
        """
        key = f"{name}|{database}"
        return key in self.processed_names

    def save_checkpoint(self, index, total, item_data=None):
        """
        حفظ نقطة الحفظ (لا يفعل شيء - للتوافق مع الكود القديم)
        البيانات يتم حفظها في log.csv مباشرة
        """
        pass
    
    def get_processed_count(self):
        """
        الحصول على عدد السجلات المعالجة

        Returns:
            int: عدد السجلات المعالجة
        """
        return self.last_processed_count

    def clear_checkpoint(self):
        """
        حذف نقطة الحفظ (لا يفعل شيء - للتوافق مع الكود القديم)
        """
        pass

    def has_checkpoint(self):
        """
        التحقق من وجود سجلات معالجة مسبقاً

        Returns:
            bool: True إذا كان هناك سجلات معالجة
        """
        return self.last_processed_count > 0
    
    def get_checkpoint_info(self):
        """
        الحصول على معلومات السجلات المعالجة

        Returns:
            str: نص يحتوي على معلومات السجلات المعالجة
        """
        if self.last_processed_count == 0:
            return "No previous records found - Starting from beginning"

        info = f"""
Previous Records Found in log.csv:
  Already processed: {self.last_processed_count} records for {self.script_name}
  Will skip these records and continue with new ones
"""
        return info.strip()

    def update_progress(self, index, total, item_data=None, save_every=1):
        """
        تحديث التقدم (لا يفعل شيء - للتوافق مع الكود القديم)
        البيانات يتم حفظها في log.csv مباشرة
        """
        pass

    def get_last_processed_index(self, script_type, data_list):
        """
        الحصول على آخر index تم معالجته من log.csv

        Args:
            script_type (str): نوع السكريبت (SAM, OFAC, Exclusions)
            data_list (list): قائمة البيانات الكاملة

        Returns:
            int: آخر index تم معالجته (-1 إذا لم يتم معالجة أي شيء)
        """
        if not os.path.exists(self.log_file):
            return -1

        last_index = -1

        try:
            with open(self.log_file, 'r', encoding='utf-8') as f:
                reader = csv.DictReader(f)
                for row in reader:
                    # التحقق من أن السجل خاص بهذا السكريبت
                    if row.get('Website', '').upper() == script_type.upper():
                        name = row.get('Name', '')
                        database = row.get('Database', '')

                        # البحث عن هذا السجل في data_list
                        for i, item in enumerate(data_list):
                            if item.get('name') == name and item.get('database') == database:
                                last_index = max(last_index, i)
                                break

        except Exception as e:
            print(f"[!] Error reading log file: {e}")

        return last_index

