using Microsoft.AspNetCore.Mvc;

namespace OI.Metrology.Server.ApiControllers;

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

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

    private readonly IExportRepository _ExportRepository;
    private readonly IMetrologyRepository _MetrologyRepository;

    public ExportController(IExportRepository exportRepository, IMetrologyRepository metrologyRepository)
    {
        _ExportRepository = exportRepository;
        _MetrologyRepository = metrologyRepository;
    }

    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)));

    [HttpGet]
    [Route("{toolTypeId}/export")]
    public IActionResult GetExportData(int toolTypeId, [FromQuery] string? datebegin, [FromQuery] string? dateend)
    {
        Result<DataTable> r = _ExportRepository.GetExportData(_MetrologyRepository, toolTypeId, datebegin, dateend);
        string json = Newtonsoft.Json.JsonConvert.SerializeObject(r);
        return Content(json);
    }

    [HttpGet]
    [Route("{toolTypeId}/csv")]
    public IActionResult GetCSVExport(int toolTypeId, [FromQuery] string? datebegin, [FromQuery] string? dateend, [FromQuery] string? filename)
    {
        string r = _ExportRepository.GetCSVExport(_MetrologyRepository, toolTypeId, datebegin, dateend);
        return Content(r);
    }

}