using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using LittleShop.Services;
using LittleShop.DTOs;

namespace LittleShop.Areas.Admin.Controllers;

[Area("Admin")]
[Authorize(Policy = "AdminOnly")]
public class ShippingRatesController : Controller
{
    private readonly IShippingRateService _shippingRateService;
    private readonly ILogger<ShippingRatesController> _logger;

    public ShippingRatesController(IShippingRateService shippingRateService, ILogger<ShippingRatesController> logger)
    {
        _shippingRateService = shippingRateService;
        _logger = logger;
    }

    public async Task<IActionResult> Index()
    {
        var rates = await _shippingRateService.GetAllShippingRatesAsync();
        return View(rates);
    }

    public IActionResult Create()
    {
        return View(new CreateShippingRateDto());
    }

    [HttpPost]
    public async Task<IActionResult> Create(CreateShippingRateDto model)
    {
        if (!ModelState.IsValid)
        {
            return View(model);
        }

        var rate = await _shippingRateService.CreateShippingRateAsync(model);
        _logger.LogInformation("Created shipping rate {RateId}", rate.Id);
        
        return RedirectToAction(nameof(Index));
    }

    public async Task<IActionResult> Edit(Guid id)
    {
        var rate = await _shippingRateService.GetShippingRateByIdAsync(id);
        if (rate == null)
        {
            return NotFound();
        }

        var model = new UpdateShippingRateDto
        {
            Name = rate.Name,
            Description = rate.Description,
            Country = rate.Country,
            MinWeight = rate.MinWeight,
            MaxWeight = rate.MaxWeight,
            Price = rate.Price,
            MinDeliveryDays = rate.MinDeliveryDays,
            MaxDeliveryDays = rate.MaxDeliveryDays,
            IsActive = rate.IsActive
        };

        ViewData["RateId"] = id;
        return View(model);
    }

    [HttpPost]
    public async Task<IActionResult> Edit(Guid id, UpdateShippingRateDto model)
    {
        if (!ModelState.IsValid)
        {
            ViewData["RateId"] = id;
            return View(model);
        }

        var success = await _shippingRateService.UpdateShippingRateAsync(id, model);
        if (!success)
        {
            return NotFound();
        }

        _logger.LogInformation("Updated shipping rate {RateId}", id);
        return RedirectToAction(nameof(Index));
    }

    [HttpPost]
    public async Task<IActionResult> Delete(Guid id)
    {
        var success = await _shippingRateService.DeleteShippingRateAsync(id);
        if (!success)
        {
            return NotFound();
        }

        _logger.LogInformation("Deleted shipping rate {RateId}", id);
        return RedirectToAction(nameof(Index));
    }
}