﻿using System;
using System.Collections.Generic;
using System.Linq;
using Roster.Logic.RatioCalculation.OneRatioRules;
using Roster.Model;

namespace Roster.Logic.RatioCalculation
{
    /// <summary>
    /// The Rules as stated on the website for mixed groups (gemengede leeftijds genoten) on 1ratio.nl see documentation "Rekenregels beroepskracht-kindratio in de kinderopvang".
    /// Implemented rules as retrieved from website at 2015-02-16 (ymd)
    /// </summary>
    /// <remarks>
    /// DUTCH LANGUAGE!
    ///+-------------------------------------------------------------------------------------------------------------------------------------------------------+
    ///|		  Tabel 1. Berekening van de beroepskracht-kindratio en maximale groepsgroottes bij groepen in de dagopvang  				                   |
    ///+-------------------------------------------------------------------------------------------------------------------------------------------------------+		
    ///|		    | Leeftijd | Minimaal aantal  | Max aantal | Minimaal aantal  | Max aantal | Minimaal aantal  | Max aantal | Minimaal aantal  | Max aantal |
    ///|		    | kinderen | beroeps­krachten  | kinderen   | beroeps­krachten  | kinderen   | beroeps­krachten  | kinderen   | beroeps­krachten  | kinderen   |
    ///+-------------------------------------------------------------------------------------------------------------------------------------------------------+		
    ///|Groepen	    | 0 tot 1  |	    1	      |     4	   |	    2	      |     8	   |	     3	      |     12	   |	    ----      |    ----    |
    ///|alle		| 1 tot 2  |	    1	      |	    5	   |	    2	      |     10	   |	     3	      |     15	   |	     4	      |     16	   |
    ///|kinderen	| 2 tot 3  |	    1	      |     8	   |	    2	      |     16	   |	    ---	      |    ----	   |	    ----      |    ----    |
    ///|één 		| 3 tot 4  |	    1	      |     8	   |	    2	      |     16	   |	    ---	      |    ----	   |	    ----      |	   ----	   |	
    ///|leeftijd	|	       |		          |            |   		          |		       |		          |		       |		          |		       |
    ///+-------------------------------------------------------------------------------------------------------------------------------------------------------+
    ///|Gemengde 	| 0 tot 2  |	    1	      |     5	   |        2	      |     9 *1   |         3	      |    14 *1   |	     4	      |     16 *1  |
    ///|leeftijds­	| 0 tot 3  |	    1	      |     5	   |        2	      |9 *2 / 10 *3|         3	      |    15 *1   |         4	      |     16 *1  |
    ///|groepen	    |          |                  |            |                  |            |                  |            |                  |            |
    ///|		    | 0 tot 4  |	    1	      |5 *4 / 6 *5 |	    2	      |9 *6 / 10 *7|		          | 		   |                  |            |
    ///|		    |	       |                  |            |                  |11*8 / 12 *9|	     3	      |    16 *1   |	    ----      |	    ----   |		
    ///|		    | 1 tot 3  |	    1	      |     6	   |        2	      |     11	   |         3	      |     16	   |        ----      |     ----   |
    ///|		    | 1 tot 4  |	    1	      |     7	   |        2	      |     13	   |         3        |	    16	   |        ----      |     ----   |
    ///|		    | 2 tot 4  |	    1	      |     8	   |        2	      |     16	   |        ---	      |    ----    |        ----      |     ----   |
    ///+-------------------------------------------------------------------------------------------------------------------------------------------------------+
    ///
    ///
    ///*1 Waarvan maximaal acht kinderen van 0 jaar.
    ///*2 Bij een groep met acht kinderen van 0 jaar.
    ///*3 Bij een groep met zeven of minder kinderen van 0 jaar.
    ///*4 Bij een groep met vier kinderen van 0 jaar.
    ///*5 Bij een groep met drie of minder kinderen van 0 jaar.
    ///*6 Bij een groep met acht kinderen van 0 jaar.
    ///*7 Bij een groep met zeven kinderen van 0 jaar.
    ///*8 Bij een groep met zes kinderen van 0 jaar.
    ///*9 Bij een groep met vijf of minder kinderen van 0 jaar.	
    ///
    ///bron 1ratio.nl februari 2105		
    ///</remarks>
    internal class OneRatioDotNl2015 : IChildEmployeeRatio
    {
        public int EmployeesRequired(IEnumerable<Child> children, DateTime calculationDateTime)
        {
            var childrenList = children.ToList();
            var childrenCount = childrenList.Count();

            var ages =
                (from child in childrenList select child.Birthday.CalculateAge(calculationDateTime)).
                    Where(age => age >= 0).ToList();

            var ageDistribution = ages.GroupBy(age => age).ToDictionary(g => g.Key, g => g.Count());

            var minAge = ages.Min();
            var maxAge = ages.Max();

            I1RatioRule selectedRule = SelectRule(minAge, maxAge);

            return selectedRule.GetEmployeesRequired(childrenCount, ageDistribution);
        }

        public string Description
        {
            get { return "2015 1Ratio.nl Gemengde leeftijdsgroepen"; }
        }


        private I1RatioRule SelectRule(int minAge, int maxAge)
        {
            //Determine rule to folow

            //Mixed Groups:
            if (minAge == 0 && maxAge < 2) return new AgedZeroToTwo();

            if (minAge == 0 && maxAge < 3) return new AgedZeroToThree();

            if (minAge == 0 && maxAge <= 4) return new AgedZeroToFour();

            //TODO:Add 1 to 3
            //TODO:Add 1 to 4
            //TODO:Add 2 to 4

            throw new NotImplementedException();
        }
    }
}
