public void PrintInstruction(CardStatistics stats, StreamWriter writer)
        {
            if (stats == null)
            {
                throw new ArgumentNullException(nameof(stats));
            }
            if (writer == null)
            {
                throw new ArgumentNullException(nameof(writer));
            }

            var replacements = this.BuildReplacementsDictionary(stats);

            Helpers.WriteFileFromTemplate(writer, this._instructionTemplate, replacements);
        }
        private IDictionary <string, string> BuildReplacementsDictionary(CardStatistics stats)
        {
            var r = new Dictionary <string, string>();

            r.Add("LAND_CARDS_COUNT", stats.LandCardsCount.ToString("D"));
            r.Add("ANIMAL_CARDS_COUNT", stats.AnimalCardsCount.ToString("D"));
            r.Add("PLANT_CARDS_COUNT", stats.PlantCardsCount.ToString("D"));
            r.Add("LAND_CARDS_MULTIPLIER", this.GetMinmax(stats.LandCardsMultiplierMin, stats.LandCardsMultiplierMax));
            r.Add("ANIMAL_CARDS_MULTIPLIER", this.GetMinmax(stats.AnimalCardsMultiplierMin, stats.AnimalCardsMultiplierMax));
            r.Add("PLANT_CARDS_MULTIPLIER", this.GetMinmax(stats.PlantCardsMultiplierMin, stats.PlantCardsMultiplierMax));
            r.Add("CARDS_TOTAL", stats.CardsTotal.ToString("D"));
            r.Add("PLAYERS_NUMBER", this.GetMinmax(2, 4)); // TODO: read from ini
            r.Add("LAND_CARDS_TYPES_COUNT", stats.LandDefinitionsCount.ToString("D"));
            r.Add("ANIMAL_CARDS_TYPES_COUNT", stats.AnimalDefinitionsCount.ToString("D"));
            r.Add("PLANT_CARDS_TYPES_COUNT", stats.PlantDefinitionsCount.ToString("D"));

            return(r);
        }
        static void Main(string[] args)
        {
            var parameters = new LayoutParameters();
            var layout     = new Layout(parameters);

            layout.Calculations();

            var cardInfo = new CardInfo[]
            {
                new CardInfo
                {
                    Title       = "Tundra",
                    CardType    = CardType.Land,
                    ZoneSetName = ZoneName.Tundra,
                    CardCount   = 6,
                    ImageName   = "Tundra.jpg",
                    Description =
                        @"Bezleśne zbiorowisko roślinności w zimnym klimacie strefy arktycznej i subarktycznej. Latem temperatura nie przekracza 15 °C, trwa dzień polarny."
                },
                new CardInfo
                {
                    Title       = "Chrobotek reniferowy",
                    CardType    = CardType.Plant,
                    ZoneSetName = ZoneName.Tundra,
                    CardCount   = 3,
                    ImageName   = "Chrobotek reniferowy.jpg",
                    Description =
                        @"Gatunek grzybów należący do rodziny chrobotkowatych <i>(Cladoniaceae)</i>. Ze względu na współżycie z glonami zaliczany jest do porostów."
                },

                new CardInfo
                {
                    Title       = "Tajga",
                    CardType    = CardType.Land,
                    ZoneSetName = ZoneName.Tajga,
                    CardCount   = 6,
                    ImageName   = "Tajga.jpg",
                    Description =
                        @"Tajga, borealne lasy iglaste – lasy iglaste, które występują w północnej części Azji i Ameryki Północnej, w obrębie klimatu umiarkowanego chłodnego na półkuli północnej. Tajgę w większości porastają lasy iglaste oraz, w niewielkim stopniu, lasy liściaste."
                },
                new CardInfo
                {
                    Title       = "Renifer tundrowy",
                    CardType    = CardType.Animal,
                    ZoneSetName = ZoneName.Tajga,
                    CardCount   = 3,
                    ImageName   = "ReniferTundrowy.jpg",
                    Description =
                        @"Renifer tundrowy, ren, karibu (Rangifer tarandus) – gatunek ssaka z rodziny jeleniowatych <i>(Cervidae)</i>, zamieszkujący arktyczną tundrę i lasotundrę w Eurazji i Ameryce Północnej."
                },


                new CardInfo
                {
                    Title       = "Klimat śródziemnomorski",
                    CardType    = CardType.Land,
                    ZoneSetName = ZoneName.Środziemnomorski,
                    CardCount   = 6,
                    ImageName   = "Środziemnomorski.jpg",
                    Description =
                        @"Rodzaj klimatu podzwrotnikowego (subtropikalnego), występujący nad Morzem Śródziemnym, a także w Kalifornii, RPA, na południu Australii oraz u wybrzeży Chile w Ameryce Południowej. Jego charakterystyczną cechą są ciepłe i suche lata powyżej 20 °C oraz łagodne zimy powyżej 0 °C."
                },
            };

            cardInfo = LoadCardsDefinitions().ToArray();

            var cards = Helpers.BuildCardSet(cardInfo).ToArray();

            // fix for cards damaged during cut

            /* cards = cards.Where(c => c.Title.Equals("Tajga")).Take(4)
             *  .Concat(cards.Where(c => c.Title.Equals("Jodła")).Take(3))
             *      .Concat(cards.Where(c => c.Title.Equals("Modrzew")).Take(1))
             *      .ToArray(); */

            var renderer = new CardsFileRenderer(parameters);

            using (var output = new StreamWriter(@".\Content\output.html"))
            {
                renderer.RenderFile(cards, output);

                output.Flush();
                output.Close();
            }

            var cardStats           = new CardStatistics(cardInfo, cards);
            var instructioNRenderer = new InstructionRenderer();

            using (var output = new StreamWriter(@".\Content\instruction_output.html"))
            {
                instructioNRenderer.PrintInstruction(cardStats, output);

                output.Flush();
                output.Close();
            }
        }