using System.Linq;
using System.Security.Claims;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using isn.Data;
using isn.ViewModels;

namespace isn
{
    [AllowAnonymous]
    public class PackageVersionController : Controller
    {
        private readonly ApplicationDbContext _context;

        public PackageVersionController(ApplicationDbContext context)
        {
            _context = context;
        }

        // GET: PackageVersion
        public async Task<IActionResult> Index(PackageVersionIndexViewModel model)
        {
            var applicationDbContext = _context.PackageVersions.Include(p => p.Package).Where(p => p.PackageId.StartsWith(model.PackageId));

            model.Versions = await applicationDbContext.ToListAsync();

            return View(model);
        }

        [Authorize]
        public async Task<IActionResult> Mines(PackageVersionIndexViewModel model)
        {
            var userId = User.FindFirstValue(ClaimTypes.NameIdentifier);
            var applicationDbContext = _context.PackageVersions
                .Include(p => p.Package).Where(
                p => (string.IsNullOrEmpty(model.PackageId) || p.PackageId.StartsWith(model.PackageId))
                && p.Package.OwnerId == userId);

            model.Versions = await applicationDbContext.ToListAsync();

            return View("Index", model);
        }

        // GET: PackageVersion/Details/5
        public async Task<IActionResult> Details(string pkgid, string version)
        {
            if (pkgid == null || version == null)
            {
                return NotFound();
            }

            var packageVersion = await _context.PackageVersions
                .Include(p => p.Package)
                .FirstOrDefaultAsync(m => m.PackageId == pkgid && m.FullString == version);
            if (packageVersion == null)
            {
                return NotFound();
            }

            return View(packageVersion);
        }

        [Authorize]
        public async Task<IActionResult> Delete(string pkgid, string version)
        {
            if (pkgid == null || version == null)
            {
                return NotFound();
            }

            var packageVersion = await _context.PackageVersions
                .Include(p => p.Package)
                .FirstOrDefaultAsync(m => m.PackageId == pkgid && m.FullString == version);
            if (packageVersion == null)
            {
                return NotFound();
            }

            if (!IsOwner(packageVersion)) return Unauthorized();

            return View(packageVersion);
        }

        bool IsOwner(PackageVersion v)
        {
            var userId =  User.FindFirstValue(ClaimTypes.NameIdentifier);
            return v.Package.OwnerId == userId;
        }

        // POST: PackageVersion/Delete/5
        [HttpPost, ActionName("Delete")]
        [ValidateAntiForgeryToken]
        public async Task<IActionResult> DeleteConfirmed(string PackageId, string FullString)
        {
            var packageVersion = await _context.PackageVersions.Include(p => p.Package)
             .FirstOrDefaultAsync(m => m.PackageId == PackageId && m.FullString == FullString);
            if (packageVersion == null) return NotFound();
            if (!IsOwner(packageVersion)) return Unauthorized();

            _context.PackageVersions.Remove(packageVersion);
            await _context.SaveChangesAsync();
            return RedirectToAction(nameof(Index));
        }
    }
}
