// Created with MonoDevelop
//
//    QuickStep: Acquire, view and identify spectra 
//    Copyright (C) 2024 Hiperscan GmbH Dresden, Germany
//
//    This program is free software: you can redistribute it and/or modify
//    it under the terms of the GNU General Public License as published by
//    the Free Software Foundation, either version 3 of the License, or
//    (at your option) any later version.
//
//    This program is distributed in the hope that it will be useful,
//    but WITHOUT ANY WARRANTY; without even the implied warranty of
//    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
//    GNU General Public License for more details.
//
//    You should have received a copy of the GNU General Public License
//    along with this program.  If not, see <http://www.gnu.org/licenses/>.


using System;
using Hiperscan.AnalysisModule;
using Hiperscan.AnalysisModule.Identification;
using Hiperscan.ApoIdentCore.Reporting.ReportData;
using Hiperscan.PdfLib;
using Hiperscan.Unix;

namespace Hiperscan.ApoIdentCore.Reporting.Protocol.AdditionalText
{
    public class CommonAdditionalTest : IDraw
    {
        public bool Draw(PdfArgs args)
        {
            args.Layout.Feed(args.ReferenceParagraphFeed * 1.5);
            args.Layout.SetFont(PdfFontTypes.HELVETICA, args.ReferenceFontSize, PdfColors.Black);

            double y_pos = args.Layout.YPosition;
            double next_feed = 0;
            args.Layout.XPosition = 0;
            if (args.Layout.AddParagraph(this.SubstanceTestType(args.Info)) == false)
                return false;

            if (args.State.CurrentPage == 1 && args.State.IsSet(PdfCreationStates.CreateTwoPages) == true)
            {
                args.Layout.XPosition = args.ReferenceTabIndent;
                if (args.Layout.AddParagraph(Catalog.GetString("See page 2")) == false)
                    return false;

                args.Layout.Feed(args.Layout.ParagraphBoundingBox.Height + args.ReferenceLineDistance);
                return true;
            }

            if (args.Info.AnalysisType != AnalysisType.Quantification)
            {
                args.Layout.Feed(args.Layout.ParagraphBoundingBox.Height + args.ReferenceLineDistance);
                if (args.Layout.AddParagraph(Catalog.GetString("(method and results)")) == false)
                    return false;

                args.Layout.Feed(args.Layout.ParagraphBoundingBox.Height + args.ReferenceLineDistance);
            }

            next_feed = args.Layout.YPosition;

            args.Layout.YPosition = y_pos;

            args.Layout.XPosition = args.ReferenceTabIndent;

            if (String.IsNullOrEmpty(args.Info.AdditionalTest) == false)
            {
                if (args.Layout.AddParagraph(args.Info.AdditionalTest) == false)
                    return false;

                args.Layout.Feed(args.Layout.ParagraphBoundingBox.Height + args.ReferenceLineDistance);
            }
            else
            {
                double width = args.Layout.InnerPageWidth - args.Layout.XPosition;

                int number_of_lines = args.Info.IsMeasurable ? 3 : 15;
                for (int i = 0; i < number_of_lines; i++)
                {
                    args.Layout.Feed(1.5 * PdfArgs.DEFAULT_FEED);
                    if (args.Layout.AddHorizontalLine(args.Layout.XPosition, args.Layout.YPosition, width, 0.5) == false)
                        return false;
                }
            }

            if (args.Layout.YPosition < next_feed)
                args.Layout.YPosition = next_feed;

            return true;
        }

        protected string SubstanceTestType(ReportInfo info)
        {
            string test_type = String.Empty;

            if (info.AnalysisType == AnalysisModule.AnalysisType.Quantification)
            {
                test_type = Catalog.GetString("Method and results:");
            }
            else
            {
                if (info.IsMeasurable == true)
                {
                    if (info.IsMatch == true)
                    {
                        if (info.ClassificationType == ClassificationType.Multiple)
                            test_type = Catalog.GetString("Complementary test:");
                        else
                            test_type = Catalog.GetString("Additional test:");
                    }
                    else
                    {
                        test_type = Catalog.GetString("Identity tests:");
                    }
                }
                else
                {
                    test_type = Catalog.GetString("Identity tests:");
                }
            }

            return test_type;
        }
    }
}
