using System.Text;

namespace Adaptation.FileHandlers.csv;

public class Calibration
{

#nullable disable

    public string NumberOfCalibrationSets { get; set; }
    public List<DataSet> DataSets { get; set; }

#nullable enable
#pragma warning disable CA1834

    internal static Calibration? GetCalibration(string[] lines, int start, int stop)
    {
        Calibration? result;
        string first;
        DataSet dataSet;
        Position position;
        string[] segments;
        int? thirdStart = null;
        int? secondStart = null;
        List<Position> positions;
        List<string> values = new();
        List<DataSet> dataSets = new();
        StringBuilder stringBuilder = new();
        for (int i = start; i < stop; i++)
        {
            segments = lines[i].Split(new string[] { "," }, StringSplitOptions.None);
            first = segments.First();
            if (first == "DataSet:")
            {
                secondStart = i + 1;
                break;
            }
            _ = stringBuilder.Append(first).Append(",");
            if (segments.Length > 1)
                values.Add(segments[1]);
            else
                values.Add(string.Empty);
        }
        string header = "Number of Calibration Sets,";
        if (secondStart is null || stringBuilder.Length != header.Length || stringBuilder.ToString() != header)
            result = null;
        else
        {
            result = new()
            {
                NumberOfCalibrationSets = values[0],
                DataSets = dataSets,
            };
            for (int x = 0; x < int.MaxValue; x++)
            {
                values.Clear();
                _ = stringBuilder.Clear();
                if (secondStart is null)
                    break;
                for (int i = secondStart.Value; i < stop; i++)
                {
                    segments = lines[i].Split(new string[] { "," }, StringSplitOptions.None);
                    first = segments.First();
                    if (first == "Resistivity(ohm-cm)")
                    {
                        thirdStart = i + 1;
                        break;
                    }
                    if (first == " Sample Set:")
                        continue;
                    _ = stringBuilder.Append(first).Append(",");
                    if (segments.Length > 1)
                        values.Add(segments[1]);
                    else
                        values.Add(string.Empty);
                }
                secondStart = null;
                header = "Operator,Date & Time,Finish,Orientation,North Probe ID,South Probe ID,Polarity,Contact Radius (µm),Probe Spacing (µm),Load (gm),X Step (µm),Name,Plate ID,Type,Points per Sample,Number of Pairs,";
                if (thirdStart is null || stringBuilder.Length != header.Length || stringBuilder.ToString() != header)
                    result = null;
                else
                {
                    positions = new();
                    dataSet = new()
                    {
                        Operator = values[0],
                        DateTime = values[1],
                        Finish = values[2],
                        Orientation = values[3],
                        NorthProbeID = values[4],
                        SouthProbeID = values[5],
                        Polarity = values[6],
                        ContactRadius = values[7],
                        ProbeSpacing = values[8],
                        Load = values[9],
                        XStep = values[10],
                        Name = values[11],
                        PlateId = values[12],
                        Type = values[13],
                        PointsPerSample = values[14],
                        NumberOfPairs = values[15],
                        Positions = positions,
                    };
                    dataSets.Add(dataSet);
                    for (int i = thirdStart.Value; i < stop; i++)
                    {
                        segments = lines[i].Split(new string[] { "," }, StringSplitOptions.None);
                        first = segments.First();
                        if (first == "DataSet:")
                        {
                            secondStart = i + 1;
                            break;
                        }
                        if (segments.Length < 5)
                            continue;
                        position = new()
                        {
                            Resistivity = segments[0],
                            Resistance = segments[1],
                            PercentStandardDeviation = segments[2],
                            Number = segments[3],
                            Name = segments[4],
                        };
                        positions.Add(position);
                    }
                }
            }
        }
        return result;
    }

}