public void Write(string reportFilePath, TradesAggregationsReport reportData)
        {
            var lines = new List <string>();

            lines.Add("----------------------------------- Securities ------------------------------------------------------");
            lines.Add(string.Empty);
            foreach (var security in reportData.SecuritiesAggregations)
            {
                lines.Add($"{security.Security} - Quantity Sum: {security.QuantitySum}; Price Average: {security.PriceAverage}");
            }

            lines.Add(string.Empty);
            lines.Add("----------------------------------- Transaction Codes -----------------------------------------------");
            foreach (var transactionCodes in reportData.TransactionCodeAggregations)
            {
                lines.Add($"{transactionCodes.TransactionCode} - Quantity Sum: {transactionCodes.QuantitySum}; Price Average: {transactionCodes.PriceAverage}");
            }

            lines.Add(string.Empty);
            lines.Add("----------------------------------- Trade Dates ------------------------------------------------------");
            foreach (var tradeDate in reportData.TradeDateAggregations)
            {
                lines.Add($"{tradeDate.TradeDate.ToString("yyyy/MM/dd")} - Quantity Sum: {tradeDate.QuantitySum}; Price Average: {tradeDate.PriceAverage}");
            }

            lines.Add(string.Empty);
            lines.Add("------------------------------------ Files with without valid security ------------------------------");
            foreach (var file in reportData.FileAggregations)
            {
                lines.Add($"{file.FilePath} - Count: {file.InvalidTradesCount}");
            }

            File.WriteAllLines(reportFilePath, lines);
        }
        /// <summary>
        /// Generate report after processing is done, based on internal state
        /// </summary>
        /// <returns></returns>
        public TradesAggregationsReport GenerateReport()
        {
            var report = new TradesAggregationsReport();

            // map securities aggregations
            var securitiesAggregations = new List <SecurityAggregation>();

            foreach (var security in this.quantitiesByBloombergId.Keys)
            {
                securitiesAggregations.Add(new SecurityAggregation
                {
                    Security     = security,
                    QuantitySum  = this.quantitiesByBloombergId[security],
                    PriceAverage = this.priceSumByBloombergId[security] / this.priceCountByBloombergId[security]
                });
            }

            report.SecuritiesAggregations = securitiesAggregations;


            // map transaction code aggregations
            var transactionCodeAggregations = new List <TransactionCodeAggregation>();

            foreach (var transactionCode in this.quantitiesByTransactionCode.Keys)
            {
                transactionCodeAggregations.Add(new TransactionCodeAggregation
                {
                    TransactionCode = transactionCode,
                    QuantitySum     = this.quantitiesByTransactionCode[transactionCode],
                    PriceAverage    = this.priceSumByTransactionCode[transactionCode] / this.priceCountByTransactionCode[transactionCode]
                });
            }

            report.TransactionCodeAggregations = transactionCodeAggregations;


            // map trade date aggregations
            var tradeDateAggregations = new List <TradeDateAggregation>();

            foreach (var tradeDate in this.quantitiesByTradeDate.Keys)
            {
                tradeDateAggregations.Add(new TradeDateAggregation
                {
                    TradeDate    = tradeDate,
                    QuantitySum  = this.quantitiesByTradeDate[tradeDate],
                    PriceAverage = this.priceSumByTradeDate[tradeDate] / this.priceCountByTradeDate[tradeDate]
                });
            }

            report.TradeDateAggregations = tradeDateAggregations;


            // map file aggregations
            var fileAggregations = new List <FileAggregation>();

            foreach (var fileName in this.fileCountsDictionary.Keys)
            {
                fileAggregations.Add(new FileAggregation
                {
                    FilePath           = fileName,
                    InvalidTradesCount = this.fileCountsDictionary[fileName]
                });
            }

            report.FileAggregations = fileAggregations;

            return(report);
        }