using System;
using System.Drawing;
using System.Globalization;
using System.IO;

namespace LensAdjustmentTool.Configuration
{
    public static class AppSettings
    {
        public const int ExpectedFrameWidth = 3072;
        public const int ExpectedFrameHeight = 2048;
        public const double ApertureTarget = 225.0;

        public static readonly Rectangle FocusRoi =
            new Rectangle(2135, 800, 400, 600);

        public static readonly Rectangle ApertureDisplayRoi =
            new Rectangle(860, 625, 1280, 960);

        public static readonly Rectangle ApertureCalculationRoi =
            new Rectangle(950, 1150, 128, 128);

        public const int ApertureRoiMoveStep = 5;

        public static Rectangle ApertureCalculationRoiRelativeToDisplay =>
            new Rectangle(
                ApertureCalculationRoi.X - ApertureDisplayRoi.X,
                ApertureCalculationRoi.Y - ApertureDisplayRoi.Y,
                ApertureCalculationRoi.Width,
                ApertureCalculationRoi.Height);

        public const int SinkBufferCount = 5;
        public const int UiRefreshIntervalMs = 33;
        public const string DeviceProfileRelativePath = @"Config\DFK33UX178.xml";
        public const string ExpectedDeviceNameFragment = "DFK 33UX178";
    }

    public sealed class ApertureRoiSettingsStore
    {
        private const string FileName = "ApertureRoi.txt";

        private string FilePath => Path.Combine(AppDomain.CurrentDomain.BaseDirectory, FileName);

        public Rectangle? Load()
        {
            if (!File.Exists(FilePath))
                return null;

            string text = File.ReadAllText(FilePath).Trim();
            string[] parts = text.Split(',');
            if (parts.Length != 4)
                return null;

            int x;
            int y;
            int width;
            int height;
            if (!int.TryParse(parts[0], NumberStyles.Integer, CultureInfo.InvariantCulture, out x) ||
                !int.TryParse(parts[1], NumberStyles.Integer, CultureInfo.InvariantCulture, out y) ||
                !int.TryParse(parts[2], NumberStyles.Integer, CultureInfo.InvariantCulture, out width) ||
                !int.TryParse(parts[3], NumberStyles.Integer, CultureInfo.InvariantCulture, out height))
            {
                return null;
            }

            return new Rectangle(x, y, width, height);
        }

        public void Save(Rectangle roi)
        {
            string text = string.Join(",",
                roi.X.ToString(CultureInfo.InvariantCulture),
                roi.Y.ToString(CultureInfo.InvariantCulture),
                roi.Width.ToString(CultureInfo.InvariantCulture),
                roi.Height.ToString(CultureInfo.InvariantCulture));
            File.WriteAllText(FilePath, text);
        }
    }
}
