using Inspectron.Settings;
using Inspectron.Settings.Attributes;
using Lindt.Colorballs.Duo.Utils;
using VisionBuilder.UI.Common;

namespace VisionBuilder.UI.Ringbuffer;

public class VisionBuilderRingbufferSettings : ISettings
{
    
    public VisionBuilderRingbufferSettings(string cameraName)
    {
        CameraName = cameraName;
    }

    public string CameraName { get; }

    public int MaxBad { get; set; } = 10000;
    public int MaxGood { get; set; } = 100;
    

    [SettingDescription(
        @"
Specifies directory, in which MaxBad and MaxGood are applied.
"+ PathSettingsUtils.INSTUCTIONS
        )]
    [SettingPreview(typeof(VisionBuilderRingbufferSettings), nameof(ImagesPathTemplatePreview))]
    public string Root { get; set; } = Path.Combine("..", "Data", "Ringbuffer", "$SS_MONTH_NAME $SS_YEAR");



    [SettingDescription("Specifies directory, relative to the Root")]
    [SettingPreview(typeof(VisionBuilderRingbufferSettings), nameof(ImagesPathTemplatePreview))]
    public string GoodImagesPathTemplate { get; set; } = @"$RECIPE_NAME";

    [SettingDescription("Specifies directory, relative to the Root")]
    [SettingPreview(typeof(VisionBuilderRingbufferSettings),nameof(ImagesPathTemplatePreview))]
    public string BadImagesPathTemplate { get; set; } =
        @"$RECIPE_NAME\$DEFECT_NAME";


    [SettingPreview(typeof(VisionBuilderRingbufferSettings), nameof(ImagesPathTemplatePreview))]
    public string FilenameTemplate { get; set; } = "$YEAR-$MONTH_NUM-$DAY $HOUR-$MINUTE-$SECOND $MS";


    public void RegisterSettings(InspectronSettings settings)
    {
        settings.RegisterSimple(this, () => this.MaxGood, CameraName+"/Ringbuffer", nameof(MaxGood));
        settings.RegisterSimple(this, () => this.MaxBad, CameraName + "/Ringbuffer", nameof(MaxBad));
        settings.RegisterSimple(this, () => this.Root, CameraName + "/Ringbuffer", nameof(Root));
        settings.RegisterSimple(this, () => this.GoodImagesPathTemplate, CameraName + "/Ringbuffer", nameof(GoodImagesPathTemplate));
        settings.RegisterSimple(this, () => this.BadImagesPathTemplate, CameraName + "/Ringbuffer", nameof(BadImagesPathTemplate));
        settings.RegisterSimple(this, () => this.FilenameTemplate, CameraName + "/Ringbuffer", nameof(FilenameTemplate));
    }

    public static string ImagesPathTemplatePreview(object template)
    {
        return PathSettingsUtils.ConvertVariables((string) template, DateTime.Now, DateTime.Now, "my recipe",
            "my defect", "my camera");
    }
}