package com.gestoreasy.utils

import android.content.Context
import android.graphics.Bitmap
import android.graphics.BitmapFactory
import android.util.LruCache
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext
import java.io.File
import java.io.FileOutputStream
import java.net.URL

/**
 * Cache de imagens para produtos
 * Usa LruCache em memória + cache em disco
 */
class ImageCache(private val context: Context) {
    private val memoryCache: LruCache<String, Bitmap>
    private val cacheDir: File
    
    init {
        // Cache em memória: 1/8 da memória disponível
        val maxMemory = (Runtime.getRuntime().maxMemory() / 1024).toInt()
        val cacheSize = maxMemory / 8
        
        memoryCache = object : LruCache<String, Bitmap>(cacheSize) {
            override fun sizeOf(key: String, bitmap: Bitmap): Int {
                return bitmap.byteCount / 1024
            }
        }
        
        // Cache em disco
        cacheDir = File(context.cacheDir, "product_images")
        if (!cacheDir.exists()) {
            cacheDir.mkdirs()
        }
    }
    
    suspend fun getImage(url: String): Bitmap? = withContext(Dispatchers.IO) {
        // Verificar cache em memória
        memoryCache.get(url)?.let { return@withContext it }
        
        // Verificar cache em disco
        val file = File(cacheDir, url.hashCode().toString())
        if (file.exists()) {
            val bitmap = BitmapFactory.decodeFile(file.absolutePath)
            bitmap?.let { memoryCache.put(url, it) }
            return@withContext bitmap
        }
        
        // Baixar da internet
        try {
            val bitmap = BitmapFactory.decodeStream(URL(url).openStream())
            bitmap?.let {
                // Salvar em memória
                memoryCache.put(url, it)
                
                // Salvar em disco
                FileOutputStream(file).use { out ->
                    it.compress(Bitmap.CompressFormat.PNG, 90, out)
                }
            }
            bitmap
        } catch (e: Exception) {
            null
        }
    }
    
    fun clearCache() {
        memoryCache.evictAll()
        cacheDir.listFiles()?.forEach { it.delete() }
    }
}

