using System.Reflection.Metadata.Ecma335;
using System.Security.AccessControl;
using Hawkeye.VisionBuilder.Workflow.Operations;


namespace Hawkeye.VisionBuilder.Workflow.Configuration;

public class WorkflowConfiguration
{
    public WorkflowConfiguration()
    {
        var userFolder = Environment.GetFolderPath(Environment.SpecialFolder.UserProfile);
        PythonPath = Path.Combine(userFolder, @"miniconda3\envs\ai3_cpu\python.exe");
    }

    public ECameraType RuntimeCameraType { get; set; } = ECameraType.Emulation;
    public ECameraType DevelopmentCameraType { get; set; } = ECameraType.Emulation;
    
    public string EmulationPath { get; set; } = "..\\Data\\Emulation";
    public string PythonPath { get; set; }

    public EOutputs Outputs { get; set; }
    public int ResultPin { get; set; }
    public string SerialPort { get; set; } = "";
    public int Delay { get; set; } = 0;


    public BadTweakLearning BadTweakLearning { get; set; } = new BadTweakLearning();
    public RecipeSelectionConfig RecipeSelectionConfig { get; set; }=new RecipeSelectionConfig();

    public void Save(BinaryWriter bw)
    {
        bw.Write((int)RuntimeCameraType);
        bw.Write((int)DevelopmentCameraType);
        bw.Write((int)Outputs);
        bw.Write(EmulationPath);
        bw.Write(PythonPath);
        bw.Write(ResultPin);
        bw.Write(SerialPort);
        bw.Write(Delay);
        BadTweakLearning.Save(bw);
        RecipeSelectionConfig.Save(bw);
    }

    public void Load(BinaryReader br)
    {
        RuntimeCameraType = (ECameraType) br.ReadInt32();
        DevelopmentCameraType = (ECameraType) br.ReadInt32();
        Outputs = (EOutputs) br.ReadInt32();
        EmulationPath = br.ReadString();
        PythonPath = br.ReadString();
        ResultPin = br.ReadInt32();
        SerialPort = br.ReadString();
        Delay = br.ReadInt32();
        BadTweakLearning.Load(br);
        RecipeSelectionConfig.Load(br);
    }
}