using DinkToPdf;
using DinkToPdf.Contracts;
using Microsoft.AspNetCore.Mvc;
using System.IO;
using PdfService.Utility;
using PdfService.Models;
namespace PdfService.Controllers
{

    
    [ApiController]
    public class PdfController : ControllerBase
    {
        private IConverter _converter;

        public PdfController(IConverter converter)
        {
            _converter = converter;
        }

        [Route("")]
        [HttpGet]
        public ActionResult GeneratePdfDemo()
        {
            var globalSettings = new GlobalSettings
            {
                ColorMode = ColorMode.Color,
                Orientation = Orientation.Portrait,
                PaperSize = PaperKind.A4,
                Margins = new MarginSettings { Top = 0, Left = 0, Right = 0 },
                DocumentTitle = "PDF Demo Report",
            };
 
            var objectSettings = new ObjectSettings
            {
                PagesCount = true,
                HtmlContent = TemplateGenerator.GetHTMLString(new Term[]{
                    new Term("Good Term", 0.9),
                    new Term("Term 1", 0.5),
                    new Term("Another Term", 0.3),
                    new Term("Another bad Tweet", 0.1)
                    }),
                WebSettings = { DefaultEncoding = "utf-8", UserStyleSheet =  Path.Combine(Directory.GetCurrentDirectory(), "assets", "bulma.min.css") }
            };
 
            var pdf = new HtmlToPdfDocument()
            {
                GlobalSettings = globalSettings,
                Objects = { objectSettings }
            };
 
            var file = _converter.Convert(pdf);
            return File(file, "application/pdf");
        }        

        // GET /generatePDF
        [Route("generatePDF")]
        [HttpPost]
        public ActionResult GeneratePdf([FromBody] Term[] terms)
        {
            // check parameters
            if (!ModelState.IsValid)
            {
                return BadRequest(ModelState);
            }

            // check parameter if they have correct form
            foreach(Term term in terms) {
                if(term.Name.Length<1 || term.Sentiment<0.0 || term.Sentiment>1.0){
                    return BadRequest(ModelState);
                }
            }

            var globalSettings = new GlobalSettings
            {
                ColorMode = ColorMode.Color,
                Orientation = Orientation.Portrait,
                PaperSize = PaperKind.A4,
                Margins = new MarginSettings { Top = 0, Left = 0, Right = 0 },
                DocumentTitle = "PDF Report",
            };
 
            var objectSettings = new ObjectSettings
            {
                PagesCount = true,
                HtmlContent = TemplateGenerator.GetHTMLString(terms),
                WebSettings = { DefaultEncoding = "utf-8", UserStyleSheet =  Path.Combine(Directory.GetCurrentDirectory(), "assets", "bulma.min.css") }
            };
 
            var pdf = new HtmlToPdfDocument()
            {
                GlobalSettings = globalSettings,
                Objects = { objectSettings }
            };
 
            var file = _converter.Convert(pdf);
            return File(file, "application/pdf");
        }

    }
}