package com.example.offlinestore1

import android.content.Context
import java.io.File
import java.security.MessageDigest

class PreferencesHelper(context: Context) {
    private val prefs = context.getSharedPreferences("offline_store_prefs", Context.MODE_PRIVATE)
    
    // נתיב לקובץ חיצוני שנשמר גם לאחר מחיקת נתונים (אם יש הרשאות מערכת)
    private val backupDir = File("/data/system/offlinestore")
    private val passwordBackupFile = File(backupDir, "pwd.hash")

    fun savePassword(password: String) {
        val hashedPassword = hashPassword(password)
        prefs.edit().putString("password", hashedPassword).apply()
        saveHashToSystem(hashedPassword)
    }

    fun clearPassword() {
        prefs.edit().remove("password").apply()
        if (passwordBackupFile.exists()) {
            try {
                passwordBackupFile.delete()
            } catch (_: Exception) {}
        }
        try {
            val publicBackup = File(android.os.Environment.getExternalStorageDirectory(), ".offlinestore_hash")
            if (publicBackup.exists()) publicBackup.delete()
        } catch (_: Exception) {}
    }

    fun checkPassword(password: String): Boolean {
        val savedHash = getStoredHash()
        return savedHash != null && savedHash == hashPassword(password)
    }

    fun hasPassword(): Boolean {
        return getStoredHash() != null
    }

    private fun getStoredHash(): String? {
        // עדיפות לסיסמה ב-SharedPreferences
        val local = prefs.getString("password", null)
        if (!local.isNullOrBlank()) return local

        // אם אין ב-Prefs (אולי אחרי מחיקת נתונים), ננסה לקרוא מהקובץ החיצוני
        val backup = readHashFromSystem()
        if (!backup.isNullOrBlank()) {
            // אם מצאנו בגיבוי, נשחזר ל-Prefs
            prefs.edit().putString("password", backup).apply()
            return backup
        }
        
        return null
    }

    private fun hashPassword(password: String): String {
        return try {
            val digest = MessageDigest.getInstance("SHA-256")
            val hash = digest.digest(password.toByteArray(Charsets.UTF_8))
            hash.joinToString("") { "%02x".format(it) }
        } catch (e: Exception) {
            // במקרה של שגיאה נדירה, נשתמש ב-hashCode כגיבוי (פחות מאובטח אבל מונע קריסה)
            password.hashCode().toString()
        }
    }

    private fun saveHashToSystem(hash: String) {
        try {
            if (!backupDir.exists()) backupDir.mkdirs()
            passwordBackupFile.writeText(hash)
        } catch (_: Exception) {
            try {
                val publicBackup = File(android.os.Environment.getExternalStorageDirectory(), ".offlinestore_hash")
                publicBackup.writeText(hash)
            } catch (_: Exception) {}
        }
    }

    private fun readHashFromSystem(): String? {
        try {
            if (passwordBackupFile.exists()) {
                return passwordBackupFile.readText().trim()
            }
        } catch (_: Exception) {}
        
        try {
            val publicBackup = File(android.os.Environment.getExternalStorageDirectory(), ".offlinestore_hash")
            if (publicBackup.exists()) {
                return publicBackup.readText().trim()
            }
        } catch (_: Exception) {}
        
        return null
    }

    fun saveViewMode(isGrid: Boolean) {
        prefs.edit().putBoolean("is_grid", isGrid).apply()
    }

    fun isGridMode(): Boolean {
        return prefs.getBoolean("is_grid", true)
    }
}
