using Lada.Framework.Data.Enums;
using Lada.Framework.Data.Repositories;
using Lada.Framework.DTO.Models.Media;
using Lada.Framework.Infrastructures.AppSettings;
using Lada.Framework.Infrastructures.Services;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Options;

namespace Lada.Framework.Examples
{
    /// <summary>
    /// Ví dụ sử dụng ImageService
    /// </summary>
    public class ImageServiceUsage
    {
        private readonly IImageService _imageService;

        public ImageServiceUsage(IImageService imageService)
        {
            _imageService = imageService;
        }

        /// <summary>
        /// Ví dụ 1: Xử lý ảnh đơn giản (chỉ trả về URL)
        /// </summary>
        public async Task<string> SimpleImageProcessing(IFormFile imageFile)
        {
            // Xử lý ảnh avatar
            var result = await _imageService.ProcessImageAsync(imageFile, ImageType.Avatar);

            if (result.Result == Lada.Framework.DTO.Result.Success)
            {
                return result.Url; // Trả về URL để hiển thị
            }

            throw new Exception(result.Message);
        }

        /// <summary>
        /// Ví dụ 2: Xử lý ảnh với lưu metadata vào database
        /// Repository sẽ được inject tự động vào ImageService
        /// </summary>
        public async Task<int> ProcessImageWithDatabase(IFormFile imageFile, int userId)
        {
            var options = new ImageSaveOptions
            {
                ImageType = ImageType.Product,
                SaveToDatabase = true,
                AltText = "Ảnh sản phẩm",
                Caption = "Ảnh sản phẩm mới",
                CreatedBy = userId,
                CreatedByUserName = "Admin",
                UpdatedBy = userId,
                UpdatedByUserName = "Admin",
                DisplayOrder = 1
            };

            var result = await _imageService.ProcessAndSaveAsync(imageFile, options);

            if (result.Result == Lada.Framework.DTO.Result.Success)
            {
                return result.MediaId?.GetHashCode() ?? 0; // Trả về hash code của Guid ID
            }

            throw new Exception(result.Message);
        }

        /// <summary>
        /// Ví dụ 3: Xử lý nhiều ảnh cùng lúc
        /// </summary>
        public async Task<List<string>> ProcessMultipleImages(List<IFormFile> imageFiles)
        {
            var results = await _imageService.ProcessMultipleAsync(imageFiles, ImageType.Order);

            var urls = new List<string>();
            foreach (var result in results)
            {
                if (result.Result == Lada.Framework.DTO.Result.Success)
                {
                    urls.Add(result.Url);
                }
            }

            return urls;
        }

        /// <summary>
        /// Ví dụ 4: Validate ảnh trước khi xử lý
        /// </summary>
        public async Task<bool> ValidateImageBeforeProcessing(IFormFile imageFile)
        {
            // Kiểm tra ảnh có hợp lệ không
            var isValid = await _imageService.ValidateImageAsync(imageFile);

            if (!isValid)
            {
                throw new Exception("File không phải là ảnh hợp lệ");
            }

            return true;
        }

        /// <summary>
        /// Ví dụ 5: Chuyển đổi SystemPath thành URL
        /// </summary>
        public async Task<string> ConvertSystemPathToUrl(string systemPath)
        {
            return await _imageService.GetUrlBySystemPath(systemPath);
        }
    }

    /// <summary>
    /// Ví dụ cấu hình ImageService trong DI Container
    /// </summary>
    public static class ImageServiceConfiguration
    {
        /// <summary>
        /// Cấu hình ImageService trong Startup.cs hoặc Program.cs
        /// </summary>
        public static void ConfigureImageService(IServiceCollection services, IConfiguration configuration)
        {
            // 1. Cấu hình settings
            services.Configure<MediaProcessingSettings>(options =>
            {
                options.RootPath = configuration["Media:RootPath"] ?? "C:\\uploads\\";
                options.Domain = configuration["Media:Domain"] ?? "https://localhost:5001/";
                options.MaxImageWidth = int.Parse(configuration["Media:MaxImageWidth"] ?? "1200");
                options.ImageQuality = int.Parse(configuration["Media:ImageQuality"] ?? "80");
                options.DefaultImageFormat = Enum.Parse<ImageFormat>(configuration["Media:DefaultImageFormat"] ?? "WebP");
                options.OutputFolder = configuration["Media:OutputFolder"] ?? "optimized";
            });

            // 2. Đăng ký services
            services.AddScoped<IImageService, ImageService>();

            // 3. Đăng ký AppConfigService nếu cần (optional)
            // services.AddScoped<IAppConfigService, YourAppConfigService>();
        }
    }

    /// <summary>
    /// Ví dụ cấu hình trong appsettings.json
    /// </summary>
    public class AppSettingsExample
    {
        /*
        {
          "Media": {
            "RootPath": "C:\\uploads\\",
            "Domain": "https://yourdomain.com/",
            "MaxImageWidth": 1200,
            "ImageQuality": 80,
            "DefaultImageFormat": "WebP",
            "OutputFolder": "optimized"
          }
        }
        */
    }
}
