using System;
using System.Linq;
using System.Web.Mvc;
using NzbDrone.Common;
using NzbDrone.Core.Jobs;
using NzbDrone.Core.Providers;
using NzbDrone.Web.Models;

namespace NzbDrone.Web.Controllers
{
    public class UpdateController : Controller
    {
        private readonly UpdateProvider _updateProvider;
        private readonly JobProvider _jobProvider;
        private readonly EnvironmentProvider _environmentProvider;
        private readonly DiskProvider _diskProvider;

        public UpdateController(UpdateProvider updateProvider, JobProvider jobProvider,
            EnvironmentProvider environmentProvider, DiskProvider diskProvider)
        {
            _updateProvider = updateProvider;
            _jobProvider = jobProvider;
            _environmentProvider = environmentProvider;
            _diskProvider = diskProvider;
        }

        public ActionResult Index()
        {
            var updateModel = new UpdateModel();
            updateModel.UpdatePackage = _updateProvider.GetAvilableUpdate(_environmentProvider.Version);
            updateModel.LogFiles = _updateProvider.UpdateLogFile();
            updateModel.LogFolder = _environmentProvider.GetUpdateLogFolder();

            return View(updateModel);
        }

        public ActionResult StartUpdate()
        {
            _jobProvider.QueueJob(typeof(AppUpdateJob));

            return JsonNotificationResult.Info("Update will begin shortly", "NzbDrone will restart automatically.");
        }

        public ActionResult ViewLog( string filepath)
        {
            ViewBag.Log = _diskProvider.ReadAllText(filepath).Replace(Environment.NewLine, "<br/>");
            return View();
        }

        [HttpGet]
        public ActionResult Post(string expectedVersion)
        {
            var model = new PostUpgradeModel();
            model.CurrentVersion = _environmentProvider.Version;
            model.ExpectedVersion = Version.Parse(expectedVersion);
            model.Success = model.CurrentVersion >= model.ExpectedVersion;
            
            if (!model.Success)
                model.LogFile = _updateProvider.UpdateLogFile().FirstOrDefault();

            return View(model);
        }
    }
}