using FamilyTreeAPI.Entities;
using FamilyTreeAPI.Repository;

namespace FamilyTreeAPI.Controllers;


using Microsoft.AspNetCore.Mvc;
using System.IO;
using System.Threading.Tasks;

[ApiController]
[Route("api/[controller]")]
public class FileUploadController : ControllerBase
{
    private readonly IWebHostEnvironment _hostingEnvironment;
    private readonly ImportPersonRepository _importPersonRepository;
    private readonly IConfiguration _config;
    public FileUploadController(IWebHostEnvironment hostingEnvironment,  ImportPersonRepository importPersonRepository, IConfiguration config)
    {
        _hostingEnvironment = hostingEnvironment;
        _importPersonRepository = importPersonRepository;
        _config = config;
    }

    [HttpPost("[action]")]
    public async Task<IActionResult> UploadFile(IFormFile file)
    {
        List<CodeDto<string>> output = new ();
        if (file == null || file.Length == 0)
        {
            return BadRequest("No file uploaded.");
        }

        try
        {
            
            // Define the upload directory
            // var uploadsFolder = Path.Combine(_hostingEnvironment.WebRootPath, "uploads");
            string importFolder = _config.GetValue<string>("AppSettings:ImportFolder");
           var uploadsFolder = Path.Combine(_hostingEnvironment.ContentRootPath, importFolder);
            if (!Directory.Exists(uploadsFolder))
            {
                Directory.CreateDirectory(uploadsFolder);
            }

            // Create a unique file name to avoid overwriting
            var uniqueFileName = Path.GetFileNameWithoutExtension(file.FileName)
                                 + "_" + System.Guid.NewGuid().ToString()
                                 + Path.GetExtension(file.FileName);
            var filePath = Path.Combine(uploadsFolder, uniqueFileName);

            // Save the file to the server
            using (var stream = new FileStream(filePath, FileMode.Create))
            {
             //     await file.CopyToAsync(stream);
                await file.CopyToAsync(stream);
            //   output = await _importPersonRepository.ImportPerson(stream, "Sheet1");
               
            }
            
            using (var stream = new MemoryStream())
            {
                await file.CopyToAsync(stream);
                output = await _importPersonRepository.ImportPerson(stream, "Sheet1");
            }

            //return Ok(new { FileName = uniqueFileName, FilePath = filePath });
            return Ok(output);
        }
        catch (System.Exception ex)
        {
            return StatusCode(500, $"Internal server error: {ex.Message}");
        }
    }

    [HttpPost("[action]")]
    public async Task<IActionResult> DownloadFile(DownloadFileCriteria criteria)
    {
        var rev = await _importPersonRepository.DownloadFile(criteria);
        return Ok(rev);
    }
}
