using Microsoft.AspNetCore.Mvc;
using OI.Metrology.Shared.Models;
using OI.Metrology.Shared.Models.Stateless;
using System.Collections.Specialized;
using System.Text.Json;
using System.Web;

namespace OI.Metrology.Wafer.Counter.ApiControllers;

[Route("api/v1/file-share")]
public class FileShareController : Controller, IFileShareController<IResult>
{

    private readonly IFileShareRepository _FileShareRepository;

    public FileShareController(IFileShareRepository fileShareRepository) =>
        _FileShareRepository = fileShareRepository;

    [HttpGet("copy-file")]
    public IResult CopyFile(string from, string to)
    {
        _FileShareRepository.CopyFile(from, to);
        return Results.Ok();
    }

    [HttpGet("move-file")]
    public IResult MoveFile(string from, string to)
    {
        _FileShareRepository.MoveFile(from, to);
        return Results.Ok();
    }

    [HttpGet("file-write")]
    public IResult FileWrite(string path, string contents)
    {
        _FileShareRepository.FileWrite(path, contents);
        return Results.Ok();
    }

    private static Dictionary<string, string?> GetKeyValuePairs(QueryString queryString)
    {
        Dictionary<string, string?> results = [];
        if (queryString.HasValue)
        {
            NameValueCollection nameValueCollection = HttpUtility.ParseQueryString(queryString.Value);
            foreach (string? key in nameValueCollection.AllKeys)
            {
                if (key is null)
                    continue;
                results.Add(key, nameValueCollection[key]);
            }
        }
        return results;
    }

    private static CharacterizationParameters? GetCharacterizationParameters(QueryString queryString)
    {
        CharacterizationParameters? result;
        Dictionary<string, string?> keyValuePairs = GetKeyValuePairs(queryString);
        string json = JsonSerializer.Serialize(keyValuePairs);
        result = string.IsNullOrEmpty(json) ? null : JsonSerializer.Deserialize(json, CharacterizationParametersSourceGenerationContext.Default.CharacterizationParameters);
        return result;
    }

    [HttpGet("archive-data")]
    public IActionResult ArchiveData()
    {
        List<CharacterizationInfo> results;
        CharacterizationParameters? characterizationParameters = GetCharacterizationParameters(Request.QueryString);
        ArgumentNullException.ThrowIfNull(characterizationParameters);
        results = _FileShareRepository.GetArchiveData(characterizationParameters);
        return Json(results);
    }

}