private void ListInfoAStorageList(List <Storage> storegeList)
 {
     foreach (Storage store in storegeList)
     {
         if (store is Hdd)
         {
             Hdd hdd = (Hdd)store;
             ShConsole.ConsoleInfo(hdd.ToString());
         }
         else if (store is DvD_RW)
         {
             DvD_RW dvd_rw = (DvD_RW)store;
             ShConsole.ConsoleInfo(dvd_rw.ToString());
         }
         else if (store is DVD)
         {
             DVD dvd = (DVD)store;
             ShConsole.ConsoleInfo(dvd.ToString());
         }
         else if (store is Floppy)
         {
             Floppy floppy = (Floppy)store;
             ShConsole.ConsoleInfo(floppy.ToString());
         }
     }
 }
        public void StorageMenu()
        {
            if (System.IO.File.Exists(storesfilepath) && new FileInfo(storesfilepath).Length > 0)
            {
                FileHandling.DeserializerProcess(storages, storesfilepath);
            }
            if (System.IO.File.Exists(mountedfilepath) && new FileInfo(mountedfilepath).Length > 0)
            {
                FileHandling.DeserializerProcess(computer.GetStorages(), mountedfilepath);
            }

            while (true)
            {
                try
                {
                    StorageMenuList();
                    ShConsole.UserInput("Choose a menu: ");
                    string answer = Console.ReadLine().ToLower();
                    if (answer == "listmounts" || answer == "list mounts")
                    {
                        if (computer.GetStorages().Count == 0)
                        {
                            throw new NullReferenceException("Mount at least one storage first");
                        }
                        else
                        {
                            ListInfoAStorageList(computer.GetStorages());
                        }
                        Console.WriteLine();
                    }
                    else if (answer == "liststores" || answer == "list stores")
                    {
                        if (storages.Count == 0)
                        {
                            throw new NullReferenceException("Make at least one storage first");
                        }
                        else
                        {
                            ListInfoAStorageList(storages);
                        }
                        Console.WriteLine();
                    }
                    else if (answer == "addmount" || answer == "add mount")
                    {
                        if (storages.Count == 0)
                        {
                            throw new NullReferenceException("Make one storage at least!");
                        }
                        else
                        {
                            ListInfoAStorageList(storages);
                            ShConsole.UserInput("Give me the storage Id,which you want put on the computer: ");
                            string addAnswer = Console.ReadLine();
                            computer.Mount(addAnswer, storages);
                        }
                        Console.WriteLine();
                    }
                    else if (answer == "usemount" || answer == "use mount")
                    {
                        ListInfoAStorageList(computer.GetStorages());
                        MountedStorageHandler msh = new MountedStorageHandler(ShConsole, computer);
                        msh.MountedMenu();
                        Console.WriteLine();
                    }
                    else if (answer == "addstore" || answer == "add store")
                    {
                        Console.WriteLine("What storage you want to make(Hdd,Dvd,Dvd_rw,Floppy)");
                        string newstorage = Console.ReadLine().ToLower();

                        string id = IdGenerator();
                        if (newstorage == "hdd")
                        {
                            string[]      storageParams = new string[] { "Max capacity", "Name" };
                            List <string> sp            = new List <string>();
                            foreach (string param in storageParams)
                            {
                                ShConsole.UserInput($"Give me  {param}: ");
                                sp.Add(Console.ReadLine());
                            }
                            Storage storage = new Hdd(id, Convert.ToInt32(sp[0]), sp[1]);

                            storages.Add(storage);
                        }
                        else if (newstorage == "dvd" || newstorage == "floppy" || newstorage == "dvd_rw" || newstorage == "dvd-rw" || newstorage == "dvd rw")
                        {
                            ShConsole.UserInput($"Give me the storage Name : ");
                            string name = Console.ReadLine();
                            if (newstorage == "dvd")
                            {
                                Storage storage = new DVD(id, name);
                                storages.Add(storage);
                            }
                            else if (newstorage == "floppy")
                            {
                                Storage storage = new Floppy(id, name);
                                storages.Add(storage);
                            }
                            else if (newstorage == "dvd_rw" || newstorage == "dvd-rw" || newstorage == "dvd rw")
                            {
                                Storage storage = new DvD_RW(id, name);
                                storages.Add(storage);
                            }
                        }
                        else
                        {
                            throw new ArgumentException("Invalid argument");
                        }
                        ShConsole.ConsoleInfo($"The {newstorage} storage has been created");
                        Console.WriteLine();
                    }
                    else if (answer == "deletestore" || answer == "delete store")
                    {
                        if (storages.Count == 0)
                        {
                            throw new NullReferenceException("Create a storage first please");
                        }
                        else
                        {
                            ListInfoAStorageList(storages);
                            ShConsole.UserInput("Give me the storage Id you want to delete: ");
                            string deletingStoreId = Console.ReadLine();
                            for (int i = 0; i < storages.Count; i++)
                            {
                                if (storages[i].Id == deletingStoreId)
                                {
                                    ShConsole.UserInput($"Are you sure you want to delete this storage {storages[i].StoreName}?(yes/no): ");
                                    string deleteAnswer = Console.ReadLine().ToLower();
                                    if (deleteAnswer == "yes" || deleteAnswer == "y")
                                    {
                                        ShConsole.ConsoleInfo($"the {storages[i].StoreName} has been deleted");
                                        storages.Remove(storages[i]);
                                    }
                                    else if (deleteAnswer == "no" || deleteAnswer == "n")
                                    {
                                        ShConsole.ConsoleInfo("the deleting process has been declined");
                                    }
                                    else
                                    {
                                        throw new ArgumentException("invalid input");
                                    }
                                }
                                else if (storages[i].Id != deletingStoreId && i == storages.Count() - 1)
                                {
                                    throw new NullReferenceException("There is no such store");
                                }
                            }

                            Console.WriteLine();
                        }
                    }
                    else if (answer == "remove mount" || answer == "removemount")
                    {
                        if (computer.GetStorages().Count == 0)
                        {
                            throw new NullReferenceException("There is no mounted storage");
                        }
                        else
                        {
                            ListInfoAStorageList(computer.GetStorages());
                            ShConsole.UserInput("Give me the storage Id you want to remove: ");
                            string removingStoreId = Console.ReadLine();
                            for (int i = 0; i < computer.GetStorages().Count; i++)
                            {
                                if (computer.GetStorages()[i].Id == removingStoreId)
                                {
                                    ShConsole.UserInput($"Are you sure you want to remove this storage {computer.GetStorages()[i].StoreName}?(yes/no) : ");
                                    string removeAnswer = Console.ReadLine().ToLower();
                                    if (removeAnswer == "yes" || removeAnswer == "y")
                                    {
                                        ShConsole.ConsoleInfo($"the {computer.GetStorages()[i].StoreName} has been removed");
                                        storages.Add(computer.GetStorages()[i]);
                                        computer.GetStorages().Remove(computer.GetStorages()[i]);
                                    }
                                    else if (removeAnswer == "no" || removeAnswer == "n")
                                    {
                                        ShConsole.ConsoleInfo("the removing process has been declined");
                                    }
                                    else
                                    {
                                        throw new ArgumentException("invalid input");
                                    }
                                    break;
                                }
                                else if (computer.GetStorages()[i].Id != removingStoreId && i == computer.GetStorages().Count() - 1)
                                {
                                    throw new NullReferenceException("There is no such store");
                                }
                            }
                        }
                        Console.WriteLine();
                    }
                    else if (answer == "modify mount" || answer == "modifymount")
                    {
                        if (computer.GetStorages().Count == 0)
                        {
                            throw new NullReferenceException("There is no mounted storage");
                        }
                        else
                        {
                            ListInfoAStorageList(computer.GetStorages());
                            ShConsole.UserInput("Give me the mounted storage Id you want to modify");
                            string modifyingMountedStoreId = Console.ReadLine();
                            for (int i = 0; i < computer.GetStorages().Count; i++)
                            {
                                if (computer.GetStorages()[i].Id == modifyingMountedStoreId)
                                {
                                    ShConsole.UserInput($"Are you sure You want to modify the storage NAME?(yes/no): ");
                                    string removeAnswer = Console.ReadLine().ToLower();
                                    if (removeAnswer == "yes" || removeAnswer == "y")
                                    {
                                        ShConsole.UserInput("Give me the new store name: ");
                                        string newName = Console.ReadLine();
                                        computer.GetStorages()[i].StoreName = newName;
                                    }
                                    else if (removeAnswer == "no" || removeAnswer == "n")
                                    {
                                        ShConsole.ConsoleInfo("the modifying process has been declined");
                                    }
                                    else
                                    {
                                        throw new ArgumentException("invalid input");
                                    }
                                    break;
                                }
                                else if (computer.GetStorages()[i].Id != modifyingMountedStoreId && i == computer.GetStorages().Count() - 1)
                                {
                                    throw new Exception("There is no such mounted store");
                                }
                            }
                        }
                        Console.WriteLine();
                    }
                    else if (answer == "modify store" || answer == "modifystore")
                    {
                        if (storages.Count == 0)
                        {
                            throw new NullReferenceException("There is no unmounted storage");
                        }
                        else
                        {
                            ListInfoAStorageList(storages);
                            ShConsole.UserInput("Give me the storage Id you want to modify: ");
                            string modifyingStoreId = Console.ReadLine();
                            for (int i = 0; i < storages.Count; i++)
                            {
                                if (storages[i].Id == modifyingStoreId)
                                {
                                    if (storages[i].FileList.Count == 0)
                                    {
                                        ShConsole.UserInput($"Are you sure You want to modify the storage NAME?(yes/no): ");
                                        string removeAnswer = Console.ReadLine().ToLower();
                                        if (removeAnswer == "yes" || removeAnswer == "y")
                                        {
                                            ShConsole.UserInput("Give me the new store name: ");
                                            string newName = Console.ReadLine();
                                            storages[i].StoreName = newName;
                                        }
                                        else if (removeAnswer == "no" || removeAnswer == "n")
                                        {
                                            ShConsole.ConsoleInfo("the modifying process has been declined");
                                        }
                                        else
                                        {
                                            throw new ArgumentException("invalid input");
                                        }
                                    }
                                    else if (storages[i].FileList.Count > 0)
                                    {
                                        throw new Exception("The store is not empty,you can't modify the name");
                                    }
                                }
                                else if (storages[i].Id != modifyingStoreId && i == computer.GetStorages().Count() - 1)
                                {
                                    throw new NullReferenceException("There is no such store");
                                }
                            }
                            Console.WriteLine();
                        }
                    }
                    else if (answer == "save")
                    {
                        FileHandling.SerializeProcess(storages, storesfilepath);
                        ShConsole.ConsoleInfo("the storage data has been saved");
                        FileHandling.SerializeProcess(computer.GetStorages(), mountedfilepath);
                        ShConsole.ConsoleInfo("the mounted storage data has been saved");
                        Console.WriteLine();
                    }
                    else if (answer == "exit")
                    {
                        FileHandling.SerializeProcess(storages, storesfilepath);
                        ShConsole.ConsoleInfo("the storage data has been saved");
                        FileHandling.SerializeProcess(computer.GetStorages(), mountedfilepath);
                        ShConsole.ConsoleInfo("the mounted storage data has been saved");
                        Console.WriteLine();
                        ShConsole.ConsoleInfo("Good bye");
                        break;
                    }
                    else
                    {
                        throw new ArgumentException("invalid argument");
                    }
                }
                catch (Exception ex)
                {
                    ShConsole.Error(ex.Message);
                }
            }
        }
        public void MountedMenu()
        {
            if (computer.GetStorages().Count == 0)
            {
                MsConsoleLogger.Warning("Mount a storage first");
                return;
            }
            else
            {
                Storage ChoosedStorage = SelectMounted();
                while (true)
                {
                    try
                    {
                        MountedMenuList();
                        MsConsoleLogger.UserInput("Choose a menu: ");
                        string answer = Console.ReadLine().ToLower();

                        if (answer == "addfile" || answer == "add file")
                        {
                            string[] fileParams = new string[] { "file name",
                                                                 "file size",
                                                                 "only read(true/false)",
                                                                 "system",
                                                                 "hidden(true/false)" };
                            List <string> fp = new List <string>();
                            foreach (string param in fileParams)
                            {
                                if (param == "file size")
                                {
                                    while (true)
                                    {
                                        MsConsoleLogger.UserInput($"Give me  {param}: ");
                                        int  n;
                                        bool isNumeric = int.TryParse(Console.ReadLine(), out n);
                                        if (isNumeric && n > 0)
                                        {
                                            fp.Add(Convert.ToString(n));
                                            break;
                                        }
                                        else
                                        {
                                            MsConsoleLogger.Warning("Give me a proper file size");
                                        }
                                    }
                                }
                                else if (param == "only read(true/false)")
                                {
                                    while (true)
                                    {
                                        MsConsoleLogger.UserInput($"Give me  {param}: ");
                                        string paramanswer = Console.ReadLine().ToLower();
                                        if (paramanswer == "true" || paramanswer == "false")
                                        {
                                            fp.Add(paramanswer);
                                            break;
                                        }
                                        else
                                        {
                                            MsConsoleLogger.Warning("Give me a proper argument(false/true)");
                                        }
                                    }
                                }
                                else if (param == "hidden(true/false)")
                                {
                                    while (true)
                                    {
                                        MsConsoleLogger.UserInput($"Give me  {param}: ");
                                        string paramanswer = Console.ReadLine().ToLower();
                                        if (paramanswer == "true" || paramanswer == "false")
                                        {
                                            fp.Add(paramanswer);
                                            break;
                                        }
                                        else
                                        {
                                            MsConsoleLogger.Warning("Give me a proper argument(false/true)");
                                        }
                                    }
                                }
                                else
                                {
                                    MsConsoleLogger.UserInput($"Give me  {param}: ");
                                    fp.Add(Console.ReadLine());
                                }
                            }
                            ChoosedStorage.AddFile(fp[(int)Fileenum.Filename],
                                                   Convert.ToInt32(fp[(int)Fileenum.FileSize]),
                                                   Convert.ToBoolean(fp[(int)Fileenum.Onlyread]),
                                                   fp[(int)Fileenum.System],
                                                   Convert.ToBoolean(fp[(int)Fileenum.Hidden]));
                            MsConsoleLogger.ConsoleInfo("The file has been added to the storage");
                            Console.WriteLine();
                        }
                        else if (answer == "check cap" || answer == "checkcap")
                        {
                            if (ChoosedStorage is DVD || ChoosedStorage is DvD_RW || ChoosedStorage is Hdd)
                            {
                                MsConsoleLogger.ConsoleInfo($"max capacity = {ChoosedStorage.MaxCapacity:F1}GB" +
                                                            $" free capacity = {ChoosedStorage.FreeCapacity:F1}GB" +
                                                            $" reserved capacity = {ChoosedStorage.ReservedCapacity:F1}GB");
                            }
                            else if (ChoosedStorage is Floppy)
                            {
                                MsConsoleLogger.ConsoleInfo($"max capacity = {ChoosedStorage.MaxCapacity:F1}Kb" +
                                                            $" free capacity = {ChoosedStorage.FreeCapacity:F1}Kb" +
                                                            $" reserved capacity = {ChoosedStorage.ReservedCapacity:F1}Kb");
                            }
                        }
                        else if (answer == "list file" || answer == "listfile")
                        {
                            ListFile(ChoosedStorage);
                        }
                        else if (answer == "remove")
                        {
                            if (ChoosedStorage.FileList.Count == 0)
                            {
                                throw new NullReferenceException("The storage is empty");
                            }
                            else
                            {
                                ListFile(ChoosedStorage);
                                Console.WriteLine();
                                MsConsoleLogger.UserInput("Give me the file which you want to delete: ");
                                string fileYouWantToRemove = Console.ReadLine();
                                ChoosedStorage.Remove(fileYouWantToRemove);
                            }
                        }
                        else if (answer == "archive")
                        {
                            Storage     secondStorage = SelectMounted();
                            List <File> mutualFiles   = computer.Archive(ChoosedStorage, secondStorage);
                            foreach (File file in mutualFiles)
                            {
                                MsConsoleLogger.ConsoleInfo($"{file.ToString()} is already on the {secondStorage.StoreName} storage ");
                            }
                            MsConsoleLogger.ConsoleInfo($"The unmutual files has been archive to the {secondStorage} storage");
                            Console.WriteLine();
                        }
                        else if (answer == "format")
                        {
                            ChoosedStorage.Format();
                            MsConsoleLogger.ConsoleInfo($"The {ChoosedStorage.StoreName} has been formatted");
                            Console.WriteLine();
                        }
                        else if (answer == "setdefense" || answer == "set defense")
                        {
                            if (ChoosedStorage is DvD_RW || ChoosedStorage is DVD)
                            {
                                DVD dvd = (DVD)ChoosedStorage;
                                dvd.Block();
                                MsConsoleLogger.ConsoleInfo("The dvd's write defense has been set");
                            }
                            else if (ChoosedStorage is Floppy)
                            {
                                Floppy floppy = (Floppy)ChoosedStorage;
                                floppy.TurnOnWriteDefense();
                                MsConsoleLogger.ConsoleInfo("The floppy's write defense has been set");
                            }
                            else if (!(ChoosedStorage is Floppy) && !(ChoosedStorage is DVD) && !(ChoosedStorage is DvD_RW))
                            {
                                throw new InvalidCastException("To this storage has no write defense ");
                            }
                            Console.WriteLine();
                        }
                        else if (answer == "open")
                        {
                            if (ChoosedStorage is DvD_RW)
                            {
                                DvD_RW dvd_rw = (DvD_RW)ChoosedStorage;
                                dvd_rw.Open();
                                MsConsoleLogger.ConsoleInfo("You can write again on this storage,but all saved file what was on this storage has been removed");
                            }
                            else if (!(ChoosedStorage is DvD_RW))
                            {
                                throw new InvalidCastException("This is not a dvd_rw storage please select another mounted storage,wich type is dvd_rw");
                            }
                        }
                        else if (answer == "exit")
                        {
                            MsConsoleLogger.ConsoleInfo("Go back to the storage menu");
                            Console.WriteLine();
                            break;
                        }
                        else
                        {
                            throw new ArgumentException("Invalid argument");
                        }
                    }
                    catch (Exception ex)
                    {
                        MsConsoleLogger.Error(ex.Message);
                    }
                }
            }
        }