public Transaction(IList <string> lines, int year, AccountType accountType)
        {
            const int MIN_LENGTH = 6;// 24;

            this.Type = accountType;

            var line = lines[0];

            this.Source = lines;

            var debug = false;

            Trace.WriteLineIf(debug, "LINE0: " + lines[0]);
            if (lines.Count > 1)
            {
                Trace.WriteLineIf(debug, "LINE1: " + lines[1]);
                if (lines.Count > 2)
                {
                    Trace.WriteLineIf(debug, "LINE2: " + lines[2]);
                }
            }

            if (line.Length > MIN_LENGTH && IsCrap(line) == false)
            {
                if (IsCrap(line))
                {
                    Trace.WriteLine(line);
                }

                Regex r = new Regex(@"^\d{1,2} [A-z]{3}", RegexOptions.IgnoreCase);
                Match m = r.Match(line.Substring(0, 6));

                if (m.Success)
                {
                    var month = m.Value.Split(' ')[1];     // had a gutful of regex now
                    var day   = m.Value.Substring(0, 2);

                    var lineDate = GetDateFromLine(line, year);

                    if (lineDate.HasValue)
                    {
                        Trace.WriteLine(string.Format("NEW TRANS: {0}", lines[0]));

                        this.Date = lineDate.Value;

                        if (StreamLine.IsBracketLine(line))
                        {
                            var line2 = line.Substring(0, line.IndexOf(')'));
                            this.Amount = LineParser.GetAmountFromLine(line2).GetValueOrDefault();
                            this.Biller = line;
                        }
                        else
                        {
                            //this.Biller = line.Substring(7, line.LastIndexOf(' ') - 7);
                            this.Biller = line.Substring(7);

                            var multiLine1 = lines.Count >= 2 && lines[1].StartsWith("##");
                            var multiLine2 = lines.Count >= 2 && lines[1].Count(f => f == ')') == 1;

                            if (multiLine2)
                            {
                                var line2 = lines[1].Substring(0, lines[1].IndexOf(')'));
                                this.Amount = LineParser.GetAmountFromLine(line2).GetValueOrDefault();
                            }
                            else
                            {
                                var amount = LineParser.GetAmountFromLine(line);
                                if (!multiLine1 && amount.HasValue)
                                {
                                    this.Amount = amount.Value;
                                }
                                else
                                {
                                    Trace.WriteLine("       " + lines[0]);
                                    Trace.WriteLine("       " + lines[1]);
                                    Trace.WriteLine("       " + lines[2]);
                                    if (lines[1].StartsWith("##"))
                                    {
                                        var line2 = LineParser.TrimEndAlpha(lines[2]);

                                        if (decimal.TryParse(line2, out decimal x))
                                        {
                                            this.Amount = decimal.Parse(line2);
                                        }
                                        else
                                        {
                                            this.Amount = amount.Value;
                                        }
                                    }
                                }
                            }
                        }

                        this.ParseSuccess = !string.IsNullOrWhiteSpace(this.Biller);

                        Trace.WriteLine(this.ToString());
                        Trace.WriteLine("----------------------------------------------------------------");
                        Trace.WriteLine("");
                    }
                }
            }
        }