How can I pimprove the structure of this code

using System;
using System.Collections.Generic;
using Game.Systems.Buildings;
using Game.Systems.UI;
using TMPro;
using UnityEngine;
using UnityEngine.Serialization;
using UnityEngine.UI;

namespace Game.Systems
{
    public enum BuildingPanelType
    {
        A,B,C,D
    }
    
    public enum ProductionType
    {
        Food, Wood
    }

    
    public class BuildingPanelManager : MonoBehaviour
    {
        [SerializeField] private PanelA panelA;
        [SerializeField] private PanelB panelB;
        [SerializeField] private PanelC panelC;
        [SerializeField] private PanelD panelD;

        private List<GameObject> panels = new List<GameObject>();

        private BuildingPanelType currentPanel;
        private RectTransform currentTransform;
        private BuildingBase currentBuilding;

       
        

        private void Start()
        {
            panels = new List<GameObject> { panelA.gameObject, panelB.gameObject, panelC.gameObject, panelD.gameObject};
            DisableAllPanels();
        }

        private void Update()
        {
            CheckClickOutsidePanel();
        }

        private  void CheckClickOutsidePanel()
        {
            if (Input.GetMouseButtonDown(0)) // Check for left click
            {
                if (currentTransform != null)
                {
                    Vector2 localMousePosition = currentTransform.InverseTransformPoint(Input.mousePosition);

                    if (!currentTransform.rect.Contains(localMousePosition))
                    {
                        DisableAllPanels();
                    }
                }
            }
        }

        public void Init(BuildingPanelType type, string name, string description, BuildingBase buildingBase)
        {
            switch (type)
            {
                case BuildingPanelType.A:
                    DisableAllPanels();
                    buildingBase.showingPanel = true;
                    panelA.Init(name, description);
                    currentPanel = type;
                    currentTransform = panelA.area;
                    break;
                case BuildingPanelType.B:
                    DisableAllPanels();
                    buildingBase.showingPanel = true;
                    panelB.Init(name, description);
                    currentPanel = type;
                    currentTransform = panelB.area;
                    break;
                case BuildingPanelType.C:
                    DisableAllPanels();
                    buildingBase.showingPanel = true;
                    panelC.Init(name, description);
                    currentPanel = type;
                    currentTransform = panelC.area;
                    break;
                
            }

            currentBuilding = buildingBase;
        }

        public void Init(BuildingPanelType type, string name, string description, BuildingBase buildingBase, Sprite sprite)
        {
            switch (type)
            {
                case BuildingPanelType.D:
                    DisableAllPanels();
                    buildingBase.showingPanel = true;
                    panelD.Init(name, description);
                    panelD.SetSprite(sprite);
                    currentPanel = type;
                    currentTransform = panelD.area;
                    break;
            }
            
            currentBuilding = buildingBase;
        }

        public void UpdateHealth(BuildingBase sender, float health, float maxHealth)
        {
            if(sender != currentBuilding) return;
            
            switch (currentPanel)
            {
                case BuildingPanelType.A:
                    panelA.UpdateHealth(health, maxHealth);
                    break;
                case BuildingPanelType.B:
                    panelB.UpdateHealth(health, maxHealth);
                    break;
                case BuildingPanelType.C:
                    panelC.UpdateHealth(health, maxHealth);
                    break;
                case BuildingPanelType.D:
                    panelD.UpdateHealth(health, maxHealth);
                    break;
            }
        }

        public void UpdateFixedText(string fixedText)
        {
            switch (currentPanel)
            {
                case BuildingPanelType.C:
                    panelC.UpdateFixedText(fixedText);
                    break;
            }
        }

        public void UpdateProduction(BuildingBase sender, ProductionType type, bool isDay, float amount, float totalAmount, float percentage,
            float remainingTime, int asignedVillagers, TMP_SpriteAsset tmpSpriteAsset = null)
        {
            if(sender != currentBuilding) return;
            panelB.UpdateProduction(type, isDay, amount, totalAmount, percentage, remainingTime,
                asignedVillagers, tmpSpriteAsset);
        }
        
        public void UpdateProduction(BuildingBase sender, int asignedVillagers, float boostPerVillager, TMP_SpriteAsset tmpSpriteAsset = null)
        {
            if(sender != currentBuilding) return;
            panelC.UpdateProduction(asignedVillagers, boostPerVillager);
        }
        
        public void UpdateProduction(BuildingBase sender, bool isDay, float percentage, string pendingSoldiers)
        {
            if(sender != currentBuilding) return;
            panelD.UpdateProduction(isDay, percentage, pendingSoldiers);
        }

        public void UpdateWorkers(BuildingBase sender, int villagersActive, int villagersAvailable)
        {
            if(sender != currentBuilding) return;
            switch (currentPanel)
            {
                case BuildingPanelType.B:
                    panelB.UpdateWorkers(villagersActive, villagersAvailable);
                    break;
                case BuildingPanelType.C:
                    panelC.UpdateWorkers(villagersActive, villagersAvailable);
                    break;
            }
        }

        public void DisableAllPanels()
        {
            for (int i = 0; i < panels.Count; i++)
            {
                panels[i].SetActive(false);
            }

            if (currentBuilding != null)
            {
                currentBuilding.showingPanel = true;
                currentBuilding.DisablePanel();
            }
            
        }
        
        public void RemoveWorker()
        {
            if (currentBuilding != null && currentBuilding.assignedVillagers > 0)
            {
                currentBuilding.RemoveVillager();
                GameManager.Instance.VillagersPlacer.AddVillagers(1);
            }
        }
        
        public void DemolishBuilding()
        {
            if (currentBuilding != null)
            {
                currentBuilding.DemolishedAction();
                DisableAllPanels();
            }
        }
    }
}