using SharedKernel.Helpers;
using SharedKernel.Extensions;
using Application.Abstractions.Messaging;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;

namespace Admin.Pages.Member.Log.Login;

public class IndexModel(IMediator mediator) : PageModel
{
    [BindProperty(SupportsGet = true)]
    public QueryParams Query { get; set; } = new();

    public sealed class QueryParams
    {
        [Range(1, int.MaxValue)]
        [DisplayName("페이지 번호")]
        public int PageNum { get; set; } = 1;

        [Range(1, 100)]
        [DisplayName("페이지 목록 수")]
        public ushort PerPage { get; set; } = 10;

        [DisplayName("검색 조건")]
        [Range(1, 3, ErrorMessage = "{0}이(가) 올바르지 않습니다.")]
        public int? Search { get; set; }

        [DisplayName("검색어")]
        [MaxLength(255, ErrorMessage = "{0}은(는) {1}자 이하로 입력하세요.")]
        public string? Keyword { get; set; }

        [DisplayName("시작일")]
        public string? StartAt { get; set; }

        [DisplayName("종료일")]
        public string? EndAt { get; set; }
    }

    public int Total { get; set; } = 0;

    public List<(
        int Num,
        int ID,
        int? MemberID,
        string? MemberName,
        string Account,
        char Success,
        string? Reason,
        string? IpAddress,
        string? UserAgent,
        string? Browser,
        string? OS,
        string? Device,
        string CreatedAt,
        string? ViewURL
    )> List { get; set; } = [];

    public Pagination? Pagination { get; set; }

    public async Task OnGetAsync(CancellationToken ct)
    {
        if (!ModelState.IsValid)
        {
            return;
        }

        var result = await mediator.Send(new SearchLoginLogs.Query(
            Query.PageNum,
            Query.PerPage,
            Query.Search,
            Query.Keyword,
            Query.StartAt,
            Query.EndAt
        ), ct);

        Total = result.Total;
        List = [..result.List.Select(c => (
            c.Num,
            c.ID,
            c.MemberID,
            c.MemberName ?? "-",
            c.Account,
            c.Success ? 'Y' : 'N',
            c.Reason is null ? "-" : c.Reason,
            c.IpAddress ?? "-",
            c.UserAgent ?? "-",
            c.Browser ?? "-",
            c.OS ?? "-",
            c.Device ?? "-",
            c.CreatedAt.GetDateAt(),
            $"/Member/Log/Login/Info/{c.ID}{Request.QueryString}"
        ))];

        Pagination = new Pagination(result.Total, Query.PageNum, Query.PerPage);
    }

    public async Task<IActionResult> OnPostDeleteAsync(int[] ids, CancellationToken ct)
    {
        try
        {
            if (ids.Length == 0)
            {
                throw new Exception("삭제할 항목을 선택해주세요.");
            }

            await mediator.Send(new DeleteLoginLog.Command(ids), ct);

            TempData["SuccessMessage"] = $"{ids.Length}건이 삭제되었습니다.";
        }
        catch (Exception e)
        {
            TempData["ErrorMessages"] = e.Message;
        }

        return RedirectToPage(Query);
    }
}