namespace Adaptation.FileHandlers.csv;

public class CSV
{

#nullable disable

#nullable enable
#pragma warning disable CA1834

    public string? FileVersion { get; set; }
    public Info? Info { get; set; }
    public Setup? Setup { get; set; }
    public LayerHeader? LayerHeader { get; set; }
    public ProfileHeader? ProfileHeader { get; set; }
    public Calibration? Calibration { get; set; }
    public RawData? RawData { get; set; }

    internal static CSV GetCSV(string path)
    {
        CSV result;
        int? endInfo = null;
        int? endSetup = null;
        int? endLayers = null;
        int? startInfo = null;
        int? startSetup = null;
        int? endProfiles = null;
        int? startLayers = null;
        int? startRawData = null;
        int? startProfiles = null;
        int? endCalibration = null;
        int? startCalibration = null;
#if NET
        string[] lines = File.ReadAllLines(path, System.Text.Encoding.Latin1); // µ³®
# else
        string[] lines = File.ReadAllLines(path, System.Text.Encoding.GetEncoding("ISO-8859-1")); // µ³®
# endif
        string? fileVersion = lines.Length == 0 ? null : GetFileVersion(lines.First());
        for (int i = 1; i < lines.Length; i++)
        {
            if (lines[i].StartsWith("--INFO--"))
                startInfo = i + 1;
            else if (lines[i].StartsWith("--SETUP--"))
                (endInfo, startSetup) = (i, i + 1);
            else if (lines[i].StartsWith("--LAYERS--"))
                (endSetup, startLayers) = (i, i + 1);
            else if (lines[i].StartsWith("--PROFILES--"))
                (endLayers, startProfiles) = (i, i + 1);
            else if (lines[i].StartsWith("--CALIBRATION--"))
                (endProfiles, startCalibration) = (i, i + 1);
            else if (lines[i].StartsWith("--RAWDATA--"))
                (endCalibration, startRawData) = (i, i + 1);
        }
        RawData? rawData = startRawData is null ? null : RawData.GetRawData(lines, startRawData.Value, lines.Length);
        Info? info = startInfo is null || endInfo is null ? null : Info.GetInfo(lines, startInfo.Value, endInfo.Value);
        Setup? setup = startSetup is null || endSetup is null ? null : Setup.GetSetup(lines, startSetup.Value, endSetup.Value);
        LayerHeader? layerHeader = startLayers is null || endLayers is null ? null : LayerHeader.GetLayerHeader(lines, startLayers.Value, endLayers.Value);
        ProfileHeader? profileHeader = startProfiles is null || endProfiles is null ? null : ProfileHeader.GetProfileHeader(lines, startProfiles.Value, endProfiles.Value);
        Calibration? calibration = startCalibration is null || endCalibration is null ? null : Calibration.GetCalibration(lines, startCalibration.Value, endCalibration.Value);
        result = new()
        {
            FileVersion = fileVersion,
            Info = info,
            Setup = setup,
            LayerHeader = layerHeader,
            ProfileHeader = profileHeader,
            Calibration = calibration,
            RawData = rawData,

        };
        return result;
    }

    private static string GetFileVersion(string line)
    {
        string result;
        string[] segments = line.Split(',');
        if (segments.Length < 2)
            result = string.Empty;
        else
            result = segments.Last();
        return result;
    }

}