﻿using Microsoft.AspNetCore.Mvc;
using KernelRecordsMVC.Data;
using KernelRecordsMVC.Models;
using KernelRecordsMVC.Application.ViewModels;
using Microsoft.AspNetCore.Http;

namespace KernelRecordsMVC.Controllers;

public class AccountController : Controller
{
    private readonly KernelRecordsContext _context;

    public AccountController(KernelRecordsContext context)
    {
        _context = context;
    }

    // ==============================
    // REGISTER - GET
    // ==============================

    [HttpGet]
    public IActionResult Register()
    {
        return View();
    }


    // ==============================
    // REGISTER - POST
    // ==============================

    [HttpPost]
    [ValidateAntiForgeryToken]
    public IActionResult Register(RegisterViewModel model)
    {
        if (!ModelState.IsValid)
            return View(model);

        if (_context.Users.Any(x => x.Username == model.Username))
        {
            ModelState.AddModelError(
                "Username",
                "Username is already taken.");

            return View(model);
        }

        if (_context.Users.Any(x => x.Email == model.Email))
        {
            ModelState.AddModelError(
                "Email",
                "Email is already registered.");

            return View(model);
        }

        var user = new User
        {
            Email = model.Email,
            Username = model.Username,

            // We'll replace this with proper password hashing
            // in the security cleanup section.
            Password = model.Password,

            DateCreated = DateTime.Today,
            ShippingAddress = model.ShippingAddress,
            TelephoneNumber = model.TelephoneNumber
        };

        _context.Users.Add(user);

        _context.SaveChanges();

        // Every normal registered user is a Consumer.
        var consumer = new Consumer
        {
            UserId = user.UserId,
            PointsCollected = 0
        };

        _context.Consumers.Add(consumer);

        _context.SaveChanges();

        return RedirectToAction(nameof(Login));
    }


    // ==============================
    // LOGIN - GET
    // ==============================

    [HttpGet]
    public IActionResult Login()
    {
        return View();
    }


    // ==============================
    // LOGIN - POST
    // ==============================

    [HttpPost]
    [ValidateAntiForgeryToken]
    public IActionResult Login(LoginViewModel model)
    {
        if (!ModelState.IsValid)
            return View(model);

        var user = _context.Users
            .FirstOrDefault(x =>
                x.Username == model.Username &&
                x.Password == model.Password);

        if (user == null)
        {
            ModelState.AddModelError(
                "",
                "Invalid username or password.");

            return View(model);
        }

        HttpContext.Session.SetInt32(
            "UserId",
            checked((int)user.UserId));

        HttpContext.Session.SetString(
            "Username",
            user.Username);

        // Determine account type from the actual
        // ADMINS / CONSUMERS tables.
        var admin = _context.Admins
            .FirstOrDefault(x => x.UserId == user.UserId);

        if (admin != null)
        {
            HttpContext.Session.SetString(
                "Role",
                "Admin");

            HttpContext.Session.SetString(
                "AdminType",
                admin.Type.ToString());
        }
        else
        {
            HttpContext.Session.SetString(
                "Role",
                "Consumer");
        }

        return RedirectToAction(
            "Index",
            "Home");
    }


    // ==============================
    // LOGOUT
    // ==============================

    public IActionResult Logout()
    {
        HttpContext.Session.Clear();

        return RedirectToAction(
            "Index",
            "Home");
    }
}