public void TestParsePqRrBoth()
        {
            var pqline = "{(-200.00,0.0),(-200.00,1.0),(-199.00,68.0),(50.31,125.0),(50.34,216.0)},{(95,8.1,3.3),(120.0,0.3,3.3),(125,0.2,1),(226.0,5.0,5.0)}";
            BidFileDetail bfd = new BidFileDetail();
            List<PriceQuantityPair> pqList = new List<PriceQuantityPair>();
            List<RRDetail> rrList = new List<RRDetail>();

            BiddingFileParser.DetectAndParsePairs(pqline, bfd, pqList, rrList);

            Assert.IsTrue(pqList.Count == 5);
            Assert.IsTrue(rrList.Count == 4);
        }
        public void TestParseRrOnly()
        {
            var pqline = "{(95,8.1,3.3),(120.0,0.3,3.3),(125,0.2,1),(226.0,5.0,5.0)}";
            BidFileDetail bfd = new BidFileDetail();
            List<PriceQuantityPair> pqList = new List<PriceQuantityPair>();
            List<RRDetail> rrList = new List<RRDetail>();

            BiddingFileParser.DetectAndParsePairs(pqline, bfd, pqList, rrList);

            Assert.IsTrue(pqList.Count == 0);
            Assert.IsTrue(rrList.Count == 4);
        }
        public void TestParsePqOnly()
        {
            var pqline = "{(-200.00,0.0),(-200.00,1.0),(-199.00,68.0),(50.31,125.0),(50.34,216.0)}";
            BidFileDetail bfd = new BidFileDetail();
            List<PriceQuantityPair> pqList = new List<PriceQuantityPair>();
            List<RRDetail> rrList = new List<RRDetail>();

            BiddingFileParser.DetectAndParsePairs(pqline, bfd, pqList, rrList);

            Assert.IsTrue(pqList.Count == 5);
            Assert.IsTrue(rrList.Count == 0);
        }
        public static void DetectAndParsePairs(string pqps, BidFileDetail t, List<PriceQuantityPair> pwpslist, List<RRDetail> rrlist)
        {
            int i = 0;

            pqps = pqps.Replace("}", string.Empty);
            var pairs = pqps.Split('}');

            foreach (var pra in pairs)
            {
                foreach (var prb in pra.Split(')'))
                {
                    var pr = prb;
                    // price/quantity pair
                    if (pr.StartsWith(","))
                    {
                        pr = pr.Substring(1);
                    }

                    // 3 commas means that we know RR values are present
                    if (pr.Split(',').Count() == 3)
                    {
                        RRDetail rd = new RRDetail();
                        rd.RRDetailId = Guid.NewGuid();

                        var s1 = pr.Replace(")", "");
                        s1 = s1.Replace("(", "");
                        s1 = s1.Replace("{", "");

                        if (s1.StartsWith(","))
                        {
                            s1 = s1.Substring(1);
                        }

                        if (!s1.Equals(""))
                        {
                            rd.RRDetailId = Guid.NewGuid();
                            rd.BidFileDetailId = t.BidFileDetailId;
                            rd.RRQuantity = (s1.Split(',')[0]);
                            rd.RRDown = (s1.Split(',')[1]);
                            rd.RRUp = (s1.Split(',')[2]);
                            rd.Position = i++;

                            rd.CreatedBy = "TCPL\\jon_gaudette";
                            rd.CreatedDateTime = DateTime.Now;

                            rrlist.Add(rd);
                        }
                    }
                    else
                    {
                        PriceQuantityPair pq = new PriceQuantityPair();
                        pq.PriceQuantityPairId = Guid.NewGuid();

                        var s1 = pr.Replace(")", "");
                        s1 = pr.Replace("(", "");
                        s1 = s1.Replace("{", "");

                        if (s1.StartsWith(","))
                        {
                            s1 = s1.Substring(1);
                        }

                        if (!s1.Equals(""))
                        {
                            pq.BidFileDetailId = t.BidFileDetailId;
                            pq.PriceQuantityPairId = Guid.NewGuid();
                            pq.Price = Decimal.Parse(s1.Split(',')[0]);
                            pq.Quantity = Decimal.Parse(s1.Split(',')[1]);
                            pq.Position = i++;

                            pq.CreatedBy = "TCPL\\jon_gaudette";
                            pq.CreatedDateTime = DateTime.Now;

                            pwpslist.Add(pq);
                        }
                    }
                }
            }
        }
        /***
         * Parse a fil with BidFile properties passed
         */
        public static BidFile ParseFile(BidFile bf, String filename)
        {
            String content = File.ReadAllText(filename);

            String header2 = "";

            String header1Match = "PM, (.*), (.*), TCE, APITCE01, , (.*);";
            String header2Match = @"((.*),\s*,* (.*), (.*), , (.*), (.*), (.*);)|((.*), (.*),\s+, (.*), (.*), (.*);)";
            String bodyMatch = @"(\d+(-)*\d*).*({.*})+,+(.*);";
            String mPqrr = @"({.*})";

            var applicationType = "";
            var marketType = "";
            var deliveryDate = "";
            var participantId = "";
            var userId = "";
            var mode = "";

            var bidType = "";
            var resourceId = "";
            var reserveClass = "";
            var opresRampRate = "";
            var cancelFlag = "";

            var bids = new List<BidFileDetail>();
            var pwpslist = new List<PriceQuantityPair>();
            var rrlist = new List<RRDetail>();

            foreach (var line in content.Split('\n'))
            {
                Match mHeader1 = Regex.Match(line, header1Match);
                Match mHeader2 = Regex.Match(line, header2Match);
                Match mBody = Regex.Match(line, bodyMatch);
                Match pqrrMatch = Regex.Match(line, mPqrr);
                var hourRange = "";

                if (mHeader1.Success)
                {

                    applicationType = "PM";
                    marketType = mHeader1.Groups[1].ToString();
                    deliveryDate = mHeader1.Groups[2].ToString();
                    participantId = "TCE";
                    userId = "APITCE01";
                    mode = mHeader1.Groups[3].ToString();

                    bidType = "";
                    resourceId = "";
                    reserveClass = "";
                    opresRampRate = "";
                    cancelFlag = "";
                }
                else if (mHeader2.Success)
                {
                    bidType = mHeader2.Groups[2].Value;
                    if (!bidType.Equals(""))
                    {
                        resourceId = mHeader2.Groups[3].ToString();
                        opresRampRate = mHeader2.Groups[5].ToString();
                        cancelFlag = mHeader2.Groups[6].ToString();
                    }
                    else
                    {
                        bidType = mHeader2.Groups[9].ToString();
                        resourceId = mHeader2.Groups[10].ToString();
                        reserveClass = mHeader2.Groups[11].ToString();
                        cancelFlag = mHeader2.Groups[12].ToString();
                    }

                }
                else if (mBody.Success)
                {
                    // ReSharper disable once SuggestUseVarKeywordEvident
                    BidFileDetail t = new BidFileDetail();

                    // Header 1 Info
                    t.BidFileId = bf.BidFileId;
                    t.ApplicationType = applicationType;
                    t.MarketType = marketType;
                    t.DeliveryDate = deliveryDate;
                    t.ParticipantId = participantId;
                    t.UserId = userId;
                    t.Mode = mode;

                    // Header 2 info
                    t.BidFileDetailId = Guid.NewGuid();
                    t.BidType = bidType;
                    t.ResourceId = resourceId;
                    t.OpresRampRate = opresRampRate;
                    t.CancelFlag = cancelFlag;
                    t.ReserveClass = reserveClass;

                    // Bid Body Info
                    hourRange = mBody.Groups[1].Value;

                    var pqps = pqrrMatch.Groups[1].Value;
                    t.ReserveLoadingPoint = mBody.Groups[4].Value;

                    // If the value in ReserveLoadingPoint at this point is just
                    // a comma, we know that there was no reserve loading point.
                    if (t.ReserveLoadingPoint.Contains(","))
                    {
                        t.ReserveLoadingPoint = null;
                    }

                    // Misc System properties
                    t.CreatedBy = "TCPL\\jon_gaudette";
                    t.CreatedDateTime = DateTime.Now;

                    /*
                     * If the hourRange contains a hyphen we need to seperate out each hour into their own
                     * records, to ensure we have 24 hours of data for each category.  Everythign will be
                     * identical with the exception of the GUID and Hour.
                     */
                    if (hourRange.Contains("-"))
                    {
                        var from = Int32.Parse(hourRange.Split('-')[0]);
                        var to = Int32.Parse(hourRange.Split('-')[1]);

                        for (var i = from; i <= to; i++)
                        {
                            var bfd = new BidFileDetail
                            {
                                BidFileDetailId = Guid.NewGuid(),
                                BidFileId = bf.BidFileId,
                                Hour = i,
                                ApplicationType = t.ApplicationType,
                                MarketType = t.MarketType,
                                DeliveryDate = t.DeliveryDate,
                                ParticipantId = t.ParticipantId,
                                UserId = t.UserId,
                                Mode = t.Mode,
                                BidType = t.BidType,
                                ResourceId = t.ResourceId,
                                OpresRampRate = t.OpresRampRate,
                                CancelFlag = t.CancelFlag,
                                ReserveClass = t.ReserveClass,
                                ReserveLoadingPoint = t.ReserveLoadingPoint,
                                CreatedBy = "TCPL\\jon_gaudette",
                                CreatedDateTime = DateTime.Now,
                            };

                            DetectAndParsePairs(pqps, bfd, pwpslist, rrlist);
                            bids.Add(bfd);
                        }

                    }
                    else
                    {
                        t.Hour = Int32.Parse(hourRange);

                        DetectAndParsePairs(pqps, t, pwpslist, rrlist);
                        bids.Add(t);
                    }
                }
            }

            // Write our entity objects to the database.
            var db = new TBSPEntities1();
            db.BidFiles.Add(bf);
            db.BidFileDetails.AddRange(bids);
            db.PriceQuantityPairs.AddRange(pwpslist);
            db.RRDetails.AddRange(rrlist);
            db.SaveChanges();

            return bf;
        }