private void SignIn()
        {
            string username, password;

            View.Write("Username: "******"Password: "******"Username or password incorrect.");
            }
            else if (user.Type == UserType.Employee)
            {
                View.Clear();
                new EmployeeAction().Initialize(user as Employee);
            }
            else
            {
                View.Clear();
                new EmployerAction().Initialize(user as Employer);
            }
            View.Clear();
        }
        private void SignUp()
        {
            string       input;
            bool         @break = true;
            AbstractUser user   = null;

            #region Status

            while (true)
            {
                View.WriteLine("Do you want to hire people or get a job? (hire/get)");
                @break = true;

                View.WriteLine();
                View.Write("> ");

                input = Console.ReadLine().Trim();

                if (input == "hire" || input == "h")
                {
                    user = new Employer();
                }
                else if (input == "get" || input == "g")
                {
                    user = new Employee();
                }
                else
                {
                    @break = false;
                    View.WriteErrorAndClear("Oh I don't have any other options, sorry. Choose hire or get.");
                }

                if (@break)
                {
                    break;
                }
            }
            #endregion
            View.Clear();
            #region Username

            while (true)
            {
                View.WriteLine("Enter a username that is at least 5 characters");
                View.WriteLine();
                View.Write("> ");

                input = Console.ReadLine().Trim();

                try
                {
                    user.Username = input;

                    if (DBUserUtils.UsernameCheck(input) != null)
                    {
                        throw new Exception("This username is already taken.");
                    }
                    break;
                }
                catch (Exception ex)
                {
                    View.WriteErrorAndClear(ex.Message);
                }
            }
            #endregion
            View.Clear();
            #region Email

            while (true)
            {
                View.WriteLine("Enter a valid email address (it's better to enter your own email address)");
                View.WriteLine();
                View.Write("> ");

                input = Console.ReadLine().Trim();

                try
                {
                    user.EmailAddress = input;

                    if (DBUserUtils.EmailAddressCheck(input) != null)
                    {
                        throw new Exception("This email address is already taken.");
                    }
                    break;
                }
                catch (Exception ex)
                {
                    View.WriteErrorAndClear(ex.Message);
                }
            }
            #endregion
            View.Clear();
            #region Password

            while (true)
            {
                View.WriteLine("Enter a password that is between 5 and 15 characters and contains at least one uppercase letter, one lowercase letter, one digit, one non-alphabetic symbol");
                View.WriteLine();
                View.Write("> ");

                input = Console.ReadLine().Trim();

                try
                {
                    user.Password = input;
                }
                catch (Exception ex)
                {
                    View.WriteErrorAndClear(ex.Message);
                    continue;
                }

                View.WriteLine();

                View.WriteLine("Repeat your password");
                View.Write("> ");

                input = Console.ReadLine().Trim();

                if (input == user.Password)
                {
                    break;
                }
                else
                {
                    View.WriteErrorAndClear("That does not match your password.");
                }
            }
            #endregion
            View.Clear();
            #region PIN verification
            while (true)
            {
                string pin = PinGenerator.NewPin();

                View.WriteLine("Rewrite the symbols.");
                View.WriteLine(pin);
                View.WriteLine();
                View.Write("> ");

                input = Console.ReadLine().Trim();

                if (input == pin)
                {
                    break;
                }
                else
                {
                    View.WriteErrorAndClear("Not correct. Try again.");
                }
            }
            #endregion
            View.Clear();
            #region Summary
            while (true)
            {
                View.WriteLine(user.ToString());
                View.WriteLine("Sign up? (y/n)");
                View.WriteLine();
                View.Write("> ");

                @break = true;
                input  = Console.ReadLine().Trim().ToLower();

                switch (input)
                {
                case "y":
                case "yes":
                    View.WriteSuccess("You have been successfully registered");
                    break;

                case "n":
                case "no":
                    View.WriteLineAndWait("You have not been registered.");
                    View.Clear();
                    return;

                default:
                    View.WriteErrorAndClear("You need to choose either yes(y) or no(n).");
                    @break = false;
                    break;
                }

                if (@break)
                {
                    break;
                }
            }
            #endregion
            View.Clear();

            Database db = Database.GetInstance();

            if (user.Type == UserType.Employee)
            {
                db.Employees.Add(user as Employee);
                db.Save();
            }
            else
            {
                db.Employers.Add(user as Employer);
                db.Save();
            }
        }
 private void RecommendedJobs()
 {
     ShowJobs(DBUserUtils.GetRecommendedJobs(user.CV));
 }
 private void AllJobs()
 {
     ShowJobs(DBUserUtils.GetJobPosts());
 }
        private void Search()
        {
            List <JobPost> jobs = new List <JobPost>();
            string         input;
            bool           @break;

            while (true)
            {
                jobs.Clear();
                View.WriteLine("1. Heading");
                View.WriteLine("2. Company name");
                View.WriteLine("3. Category");
                View.WriteLine("4. City");
                View.WriteLine("5. Salary");
                View.WriteLine("6. Age");
                View.WriteLine("7. Study degree");
                View.WriteLine("8. Work experience");
                View.WriteLine("Write e to exit");
                View.WriteLine();
                View.Write("> ");

                input = Console.ReadLine().Trim();

                switch (input)
                {
                case "1":
                    View.Clear();
                    View.WriteLine("Heading");
                    View.WriteLine();
                    View.Write("> ");

                    input = Console.ReadLine();

                    foreach (var job in DBUserUtils.GetJobPosts())
                    {
                        if (job.Heading == input)
                        {
                            jobs.Add(job);
                        }
                    }

                    View.Clear();
                    ShowJobs(jobs);
                    break;

                case "2":
                    View.Clear();
                    View.WriteLine("Company name");
                    View.WriteLine();
                    View.Write("> ");

                    input = Console.ReadLine();

                    foreach (var job in DBUserUtils.GetJobPosts())
                    {
                        if (job.CompanyName == input)
                        {
                            jobs.Add(job);
                        }
                    }

                    View.Clear();
                    ShowJobs(jobs);
                    break;

                case "3":
                    View.Clear();
                    JobCategory category;

                    while (true)
                    {
                        View.WriteLine("Choose one of the job categories");

                        // Getting names of Job Categories and displaying them
                        string[] names = Enum.GetNames(typeof(JobCategory));
                        for (int i = 1; i <= names.Length; i++)
                        {
                            View.WriteLine($"{i}. {names[i - 1]}");
                        }

                        View.WriteLine();
                        View.Write("> ");

                        input = Console.ReadLine();
                        int n = 0;

                        //checking if input is a number
                        try
                        {
                            int.TryParse(input, out n);
                            n--;
                            if (n < 0 || n >= names.Length)
                            {
                                throw new Exception();
                            }
                            category = (JobCategory)n;
                            break;
                        }
                        catch (Exception)
                        {
                            View.WriteErrorAndClear("Invalid option.");
                        }
                    }

                    foreach (var job in DBUserUtils.GetJobPosts())
                    {
                        if (job.Category == category)
                        {
                            jobs.Add(job);
                        }
                    }

                    View.Clear();
                    ShowJobs(jobs);
                    break;

                case "4":
                    View.Clear();
                    View.WriteLine("City");
                    View.WriteLine();
                    View.Write("> ");

                    input = Console.ReadLine();

                    foreach (var job in DBUserUtils.GetJobPosts())
                    {
                        if (job.City == input)
                        {
                            jobs.Add(job);
                        }
                    }

                    View.Clear();
                    ShowJobs(jobs);
                    break;

                case "5":
                    uint salary;

                    while (true)
                    {
                        View.WriteLine("Salary");
                        View.WriteLine();
                        View.Write("> ");

                        input = Console.ReadLine();

                        try
                        {
                            salary = uint.Parse(input);
                            break;
                        }
                        catch (FormatException)
                        {
                            View.WriteErrorAndClear("That is not a number.");
                        }
                        catch (OverflowException)
                        {
                            View.WriteErrorAndClear("That is either too big or less than zero.");
                        }
                        catch (Exception ex)
                        {
                            View.WriteErrorAndClear(ex.Message);
                        }
                    }

                    foreach (var job in DBUserUtils.GetJobPosts())
                    {
                        if (job.Salary == salary)
                        {
                            jobs.Add(job);
                        }
                    }

                    View.Clear();
                    ShowJobs(jobs);
                    break;

                case "6":
                    uint age;

                    while (true)
                    {
                        View.WriteLine("Age");
                        View.WriteLine();
                        View.Write("> ");

                        input = Console.ReadLine();

                        try
                        {
                            age = uint.Parse(input);
                            break;
                        }
                        catch (FormatException)
                        {
                            View.WriteErrorAndClear("That is not a number.");
                        }
                        catch (OverflowException)
                        {
                            View.WriteErrorAndClear("Your age is either too big or less than zero.");
                        }
                        catch (Exception ex)
                        {
                            View.WriteErrorAndClear(ex.Message);
                        }
                    }

                    foreach (var job in DBUserUtils.GetJobPosts())
                    {
                        if (job.Age == age)
                        {
                            jobs.Add(job);
                        }
                    }

                    View.Clear();
                    ShowJobs(jobs);
                    break;

                case "7":
                    StudyDegree?studyDegree = StudyDegree.Graduate;      //random declaration

                    while (true)
                    {
                        @break = true;
                        View.WriteLine("Choose your study degree.");
                        View.WriteLine("1. Undergraduate");
                        View.WriteLine("2. Graduate");
                        View.WriteLine("3. Postgraduate");
                        View.WriteLine();
                        View.Write("> ");

                        input = Console.ReadLine();

                        switch (input)
                        {
                        case "1":
                            studyDegree = StudyDegree.Undergraduate;
                            break;

                        case "2":
                            studyDegree = StudyDegree.Graduate;
                            break;

                        case "3":
                            studyDegree = StudyDegree.Postgraduate;
                            break;

                        default:
                            @break = false;
                            View.WriteErrorAndClear("Invalid option.");
                            break;
                        }

                        if (@break)
                        {
                            break;
                        }
                    }

                    foreach (var job in DBUserUtils.GetJobPosts())
                    {
                        if (job.StudyDegree == studyDegree)
                        {
                            jobs.Add(job);
                        }
                    }

                    View.Clear();
                    ShowJobs(jobs);
                    break;

                case "8":
                    WorkExperience workExperience = WorkExperience.FourToEightYears;     //random declaration

                    while (true)
                    {
                        @break = true;
                        View.WriteLine("Work experience");
                        View.WriteLine();
                        View.WriteLine("1. Less than 1 year");
                        View.WriteLine("2. 1 to 3 years");
                        View.WriteLine("3. 4 to 8 years");
                        View.WriteLine("4. More than 8 years");
                        View.WriteLine();
                        View.Write("> ");

                        input = Console.ReadLine().Trim();

                        switch (input)
                        {
                        case "1":
                            workExperience = WorkExperience.LessThanOneYear;
                            break;

                        case "2":
                            workExperience = WorkExperience.OneToFourYears;
                            break;

                        case "3":
                            workExperience = WorkExperience.FourToEightYears;
                            break;

                        case "4":
                            workExperience = WorkExperience.MoreThanEightYears;
                            break;

                        default:
                            @break = false;
                            View.WriteError("Invalid option.");
                            break;
                        }

                        if (@break)
                        {
                            break;
                        }
                    }

                    foreach (var job in DBUserUtils.GetJobPosts())
                    {
                        if (job.WorkExperience == workExperience)
                        {
                            jobs.Add(job);
                        }
                    }

                    View.Clear();
                    ShowJobs(jobs);
                    break;

                case "e":
                    View.Clear();
                    return;

                default:
                    View.WriteErrorAndClear("Invalid option");
                    break;
                }
            }
        }