namespace BasketAsia
{
    public class BasketAsia
    {
        /// <summary>
        /// A little intro about "Who We Are"
        /// </summary>
        /// <returns></returns>
        public string WhoWeAre()
        {
            return @"
                Founded in 2004, we have developed and deployed a variety of solutions,
                including Communication and Telemetry solutions in recent years.
                and currently focusing on Personal Messaging and communication
                applications that also integrate cryptocurrency and
                blockchain technology.
 
                We also extensive exposure to accounting and business
                management tools.
            ";
        }
        
        /// <summary>
        /// 
        /// </summary>
        /// <returns></returns>
        public List<Person> TeamMembers  { get; }
 
        /// <summary>
        ///     We know this has to be on top, but here we made an exception.
        /// </summary>
        public BasketAsia()
        {
            TeamMembers = new List<Person>()
            {
                new Person("Amir", "PHP Developer"),
                new Person("Behnam", "Full Stack Developer (PHP, C#, React)"),
                new Person("Hadi", "Accountant"),
                new Person("Hoda", "PHP, C# Developer"),
                new Person("Jafar", "Technical Consultant"),
                new Person("Janine", "Business Advisor"),
                new Person("Jeffrey", "EU Marketing Director"),
                new Person("Mohammad.A", "Customer Service and Technical Support"),
                new Person("Mohammad.N", "Team Leader"),
                new Person("Yazdan", "General Manager (Kuala Lumpur)"),
                new Person("Yuri", "Dev-Ops"),
                new Person("Zahra", "C# Developer"),
            };
        }

        /// <summary>
        ///     You can call this method if you are interested to join us.
        /// </summary>
        /// <param name="person"></param>
        /// <returns></returns>
        public void AddMember(Person person)
        {
            TeamMembers.Add(person);;
        }
        
        /// <summary>
        ///     We have three core principles in our development stages in mind
        /// </summary>
        /// <returns></returns>
        public List<KeyValuePair<string, string>> OurCodingApproaches()
        {
            return new List<KeyValuePair<string, string>>()
            {
                new KeyValuePair<string, string>("DDD", "Domain Driven Design"),
                new KeyValuePair<string, string>("BDD", "Behavior Driven Design"),
                new KeyValuePair<string, string>("TDD", "Test Driven Design"),
            };
        }
 
        /// <summary>
        ///     We try to describe the type(Person) that we are looking for.
        /// </summary>
        /// <returns></returns>
        public Person WhatWeAreLookingFor()
        {
            return new Person(@"
                We are looking for an open-minded with an international mindset who does not
                    mind to learn the latest technology and is more productive when it comes
                    to teamwork. of course, having extensive experience in production
                    the environment would be a benefit to our team, but don't be shy to
                    hit the submit a resume if you do not possess  all of the
                    requirements or skills.
     
                Experienced talents in the area of web platforms, web architectures,
                    coding standard, databases, and mobile apps.
                Multiple vacancies are available including a Senior PHP Developer
                    who will take a key role on our team and must have knowledge in
                    all stages of software development.
            ", "Senior Asp.Net Core Developer");
        }
        
        /// <summary>
        ///     Our Requirements
        /// </summary>
        /// <returns></returns>
        public List<Requirement> Requirements()
        {
            return new List<Requirement>()
            {
                new Requirement("C# Fluency"),
                new Requirement("ASP.NET Core framework"),
                new Requirement("MySQL"),
                new Requirement("MsSQL"),
                new Requirement("HTML & CSS"),
                new Requirement("Git command lines"),
                new Requirement("NuGeT packaging"),
            };
        }
 
        /// <summary>
        ///     Would be a plus.
        /// </summary>
        /// <returns></returns>
        public List<BonusPoint> BonusPoints()
        {
            return new List<BonusPoint>()
            {
                new BonusPoint("Linux"),
                new BonusPoint("Docker"),
                new BonusPoint("Kubernetes"),
                new BonusPoint("NoSQL databases like Mongo & Redis"),
                new BonusPoint("Apache"),
                new BonusPoint("NGINX"),
                new BonusPoint("Experience with JavaScript and one of its popular frameworks"),
            };
        }
        
        /// <summary>
        ///     Needed personalities
        /// </summary>
        /// <returns></returns>
        public List<Personality> GetRequiredPersonalities()
        {
            return new List<Personality>()
            {
                new Personality("Ability to work well in a team structure"),
                new Personality("Passion for best design and coding practices"),
                new Personality("Desire to develop new bold ideas"),
            };
        }
 
        /// <summary>
        ///     Expectations
        /// </summary>
        /// <returns></returns>
        public List<Expectation> Expectations()
        {
            return new List<Expectation>()
            {
                new Expectation("Great interest in exploring new technology"),
                new Expectation("Resourcefulness and troubleshooting attitude"),
                new Expectation("Demonstrated attention to detail, 'GO-GETTER' attitude"),
                new Expectation("Ability to effectively plan and manage simultaneous projects and tasks"),
                new Expectation("Strong work ethic"),
            };
        }
 
        /// <summary>
        ///     Available Benefits
        /// </summary>
        /// <returns></returns>
        public List<Benefit> Benefits()
        {
            return new List<Benefit>()
            {
                new Benefit("Possible relocation and migration"),
                new Benefit("Working with multi-national partners"),
                new Benefit("Flexible work hours"),
                new Benefit("Remote Working (beyond pandemic restrictions)"),
                new Benefit("Paid Maternity/Paternity leave."),
                new Benefit("Possible equity based on work performance, commitment upon project tokenization."),
            };
        }
 
        /// <summary>
        ///     We can't give definitive salary amount since it is based on your performance,
        ///     code quality and mindset.
        /// </summary>
        /// <param name="performance"></param>
        /// <param name="codeQuality"></param>
        /// <param name="mindSet"></param>
        /// <returns></returns>
        public Salary Salary(int performance, int codeQuality, MindSet mindSet) 
        {
            return SalaryFactory.Make(performance, codeQuality, mindSet);
        }
 
        /// <summary>
        ///     More information
        /// </summary>
        /// <returns></returns>
        public string MoreInfo()
        {
            return @"
                This is a full-time position open to anyone located in any city
                    inside Iran and does not require relocation.
                    We’re a fully remote organization and our culture
                    is highly tuned towards remote working.
     
                We look forward to talking with you!
            ";
        }
       
    }

    /// <summary>
    ///     Salary is commensurate with experience.
    ///     This is a full-time, salaried position
    ///     with a competitive benefits package.
    /// </summary>
    public static class SalaryFactory
    {
        public static Salary Make(int performance, int codeQuality, MindSet mindSet)
        {
            // Todo: IMPLEMENT CALCULATION
            throw new NotImplementedException();
        }
    }
 
    public class Person
    {
        public string Name { get; }
        public string Title { get; }

        public Person(string name, string title)
        {
            Name = name;
            Title = title;
        }
    }
 
    public class Salary
    {
        public int Amount { get; }

        public static string Currency = "IRR";
        public Salary(int amount)
        {
            Amount = amount;
        }
    }
 
    public class MindSet
    {
        // Todo: implement enum
    }
 
    public class Requirement
    {
        public Requirement(string title)
        {
        }
    }
 
    public class BonusPoint
    {
        public string Title { get; }
        public BonusPoint(string title)
        {
            Title = title;
        }
    }
 
    public class Personality
    {
        public string Title { get; }
        public Personality(string title)
        {
            Title = title;
        }
    }
 
    public class Expectation
    {
        public string Title { get; }
        public Expectation(string title)
        {
            Title = title;
        }
    }
    
    public class Benefit
    {
        public string Title { get; }
        public Benefit(string title)
        {
            Title = title;
        }
    }
}