using Database;
using FeMM.Common.Helpers;
using FeMM.Common.Models;
using FeMM.Grasshopper.Helpers;
using Grasshopper;
using Grasshopper.Kernel;
using Grasshopper.Kernel.Types;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Runtime.Versioning;
using System.Windows.Forms;

namespace FeMM.Grasshopper.Components.Parameters
{
#if NETCOREAPP
    [SupportedOSPlatform("windows")]
#endif
    public class MaterialParam : GH_PersistentParam<DataTypes.FeMM.GH_Material>
    {
        public MaterialParam()
            : base("Material", "M", "Material", CategoryNameConstants.CATEGORY_FEMM, CategoryNameConstants.SUBCATEGORY_PARAMETERS)
        {
        }

        protected override GH_GetterResult Prompt_Singular(ref DataTypes.FeMM.GH_Material value)
        {
            Database.Database db = GhFeMMInfo.FeMMDatabase;
            MainWindow.ShowSelectionDatabase(MainWindow.ItemCodes.Aluminium | MainWindow.ItemCodes.Concrete | MainWindow.ItemCodes.Precast |
                MainWindow.ItemCodes.Steel | MainWindow.ItemCodes.Rebar, ref db, out Item item, Instances.DocumentEditor.Handle);
            if (item != null)
            {
                value = new DataTypes.FeMM.GH_Material(NamingConventionHelper.GetMaterial((Material)item, ModelModel.ModelUnits.Nmm));
                GhFeMMInfo.FeMMDatabase = db;
                return GH_GetterResult.success;
            }
            return GH_GetterResult.cancel;
        }

        private static DataTypes.FeMM.GH_Material GetMaterial(Material item)
        {
            var mat = new MaterialModel
            {
                Name = item.Name,
                Modulus = item.ElasticModulusE_MPa,
                PoissonRatio = item.Nu,
                ThermalExpansion = item.AlfaThermalExpansion,
                ShearModulus = item.ShearModulusG_MPa,
                UsePoisson = true,
                Density = item.Density_TSuMm3
            };
            if (item.GetType() == typeof(Aluminium))
            {
                Aluminium alu = (Aluminium)item;
                mat.Kind = MaterialModel.MaterialKind.Aluminium;
                mat.AlumiumType = MaterialModel.AlumiumTypes.Wrought;
                mat.Alloy = alu.Name;
                mat.CompressiveYieldStrength = alu.Fo_MPa;
                mat.TensileYieldStrength = alu.Fo_MPa;
                mat.TensileUltimateStrength = alu.Fu_MPa;
                mat.ShearUltimateStrength = alu.ShearFy_MPa;
            }
            else if (item.GetType() == typeof(Steel))
            {
                Steel st = (Steel)item;
                mat.Kind = MaterialModel.MaterialKind.Steel;
                mat.MinimumYieldStress = st.Fy_MPa;
                mat.MinimumTensileStress = st.Fu_MPa;
                mat.ExpectedYieldStress = st.ExpectedFy_MPa;
                mat.ExpectedTensileStress = st.ExpectedFu_MPa;
            }
            else if (item.GetType() == typeof(Concrete))
            {
                Concrete conc = (Concrete)item;
                if(conc.IsPrecast)
                    mat.Kind = MaterialModel.MaterialKind.Precast;
                else
                    mat.Kind = MaterialModel.MaterialKind.Concrete;
                mat.SpecificCompressiveStrength = conc.Fck_MPa;
                mat.ExpectedCompressiveStrength = conc.ExpFck_MPa;
            }
            else if (item.GetType() == typeof(Rebar))
            {
                Rebar rebar = (Rebar)item;
                mat.Kind = MaterialModel.MaterialKind.Rebar;
                mat.MinimumYieldStress = rebar.Fyk_MPa;
                mat.MinimumTensileStress = rebar.Ftk_MPa;
                mat.ExpectedYieldStress = rebar.ExpectedFyk_MPa;
                mat.ExpectedTensileStress = rebar.ExpectedFtk_MPa;
            }
            else
            {
                throw new NotSupportedException();
            }
            return new DataTypes.FeMM.GH_Material(mat);
        }

        protected override GH_GetterResult Prompt_Plural(ref List<DataTypes.FeMM.GH_Material> values)
        {
            return GH_GetterResult.cancel;
        }

        public override bool AppendMenuItems(ToolStripDropDown menu)
        {
            Menu_AppendObjectNameEx(menu);
            Menu_AppendWireDisplay(menu);
            Menu_AppendDisconnectWires(menu);
            Menu_AppendSeparator(menu);

            //section menu
            Menu_AppendPromptOne(menu);
            Menu_AppendSeparator(menu);

            Menu_AppendDestroyPersistent(menu);
            Menu_AppendInternaliseData(menu);
            return true;
        }

        protected override DataTypes.FeMM.GH_Material PreferredCast(object data)
        {
            if (GhFeMMInfo.FeMMDatabase != null && data is GH_String str)
            {
                Database.Database db = GhFeMMInfo.FeMMDatabase;
                string name = str.Value;
                return new DataTypes.FeMM.GH_Material(NamingConventionHelper.GetMaterial(db, name, ModelModel.ModelUnits.Nmm));
            }
            return base.PreferredCast(data);
        }

        protected override void OnVolatileDataCollected()
        {
            base.OnVolatileDataCollected();
        }

        public override GH_Exposure Exposure => GH_Exposure.secondary;

        protected override Bitmap Icon => Properties.Resources.MaterialParamIcon;

        public override Guid ComponentGuid => new("5B81CF74-EDF8-483E-A4DC-CF5FA5DFD3E8");
    }
}
303 files24 directories