using Microsoft.AspNetCore.Mvc;

namespace OI.Metrology.Server.ApiControllers;

using OI.Metrology.Shared.DataModels;
using OI.Metrology.Shared.Models.Stateless;
using System.Text.Json;

[Route("api/[controller]")]
public class ExportController : Controller, IExportController<IActionResult>
{

    private readonly IExportRepository _ExportRepository;

    public ExportController(IExportRepository exportRepository) =>
        _ExportRepository = exportRepository;

    private static string? GetJson(Stream stream)
    {
        string? result;
        if (!stream.CanRead)
            result = null;
        else
        {
            Task<string> task = new StreamReader(stream).ReadToEndAsync();
            result = task.Result;
        }
        return result;
    }

    private static HeaderCommon GetHeaderCommon(Stream stream)
    {
        HeaderCommon? result;
        string? json = GetJson(stream);
        result = string.IsNullOrEmpty(json) ? null : JsonSerializer.Deserialize<HeaderCommon>(json);
        result ??= new();
        return result;
    }

    [HttpGet]
    [Route("export")]
    public IActionResult GetExport() =>
        Content(_ExportRepository.GetExport(GetHeaderCommon(Request.Body)));

    [HttpGet]
    [Route("headers")]
    public IActionResult GetHeaders() =>
        Json(_ExportRepository.GetHeaders(GetHeaderCommon(Request.Body)), new JsonSerializerOptions { PropertyNamingPolicy = null, WriteIndented = true });

    [HttpGet]
    [Route("logistics")]
    public IActionResult GetLogistics() =>
        Json(_ExportRepository.GetLogistics(GetHeaderCommon(Request.Body)), new JsonSerializerOptions { PropertyNamingPolicy = null, WriteIndented = true });

    [HttpGet]
    [Route("pdsf")]
    [Route("processDataStandardFormat")]
    public IActionResult GetProcessDataStandardFormat() =>
        Content(_ExportRepository.GetProcessDataStandardFormat(GetHeaderCommon(Request.Body)));

    [HttpPost]
    [Route("export")]
    public IActionResult PostExport() =>
        Content(_ExportRepository.GetExport(GetHeaderCommon(Request.Body)));

    [HttpPost]
    [Route("headers")]
    public IActionResult PostHeaders() =>
        Json(_ExportRepository.GetHeaders(GetHeaderCommon(Request.Body)), new JsonSerializerOptions { PropertyNamingPolicy = null, WriteIndented = true });

    [HttpPost]
    [Route("logistics")]
    public IActionResult PostLogistics() =>
        Json(_ExportRepository.GetLogistics(GetHeaderCommon(Request.Body)), new JsonSerializerOptions { PropertyNamingPolicy = null, WriteIndented = true });

    [HttpPost]
    [Route("pdsf")]
    [Route("processDataStandardFormat")]
    public IActionResult PostProcessDataStandardFormat() =>
        Content(_ExportRepository.GetProcessDataStandardFormat(GetHeaderCommon(Request.Body)));

}