@page "/admin/common-codes"
@rendermode @(new InteractiveWebAssemblyRenderMode(prerender: false))
@using TaxBaik.Web.Services.AdminClients
@using TaxBaik.Domain.Entities
@attribute [Authorize]
@inject ICommonCodeBrowserClient CommonCodeClient
@inject ISnackbar Snackbar

<PageTitle>공통관리</PageTitle>

<AdminPageHeader Title="공통관리" Eyebrow="System" Subtitle="공통코드 그룹과 항목을 일관된 기준으로 관리합니다." />

<MudGrid Spacing="2">
    <MudItem XS="12" MD="4">
        <CommonCodeGroupPanel Groups="groups"
                             SelectedGroup="selectedGroup"
                             SelectedGroupChanged="OnGroupChanged"
                             OnCreateRequested="PrepareCreate" />
    </MudItem>

    <MudItem XS="12" MD="8">
        <CommonCodeListPanel Loading="@isLoading"
                             Codes="codes"
                             EditModel="editModel"
                             IsCreateMode="isCreateMode"
                             Form="form"
                             EditRequested="EditCode"
                             DeleteRequested="DeleteCode"
                             SaveRequested="SaveCode"
                             ResetRequested="PrepareCreate" />
    </MudItem>
</MudGrid>

@code {
    private List<string> groups = [];
    private List<CommonCode> codes = [];
    private string selectedGroup = "";
    private bool isLoading = true;
    private CommonCode editModel = new();
    private bool isCreateMode = true;

    protected override async Task OnInitializedAsync()
    {
        groups = await CommonCodeClient.GetGroupsAsync();
        selectedGroup = groups.FirstOrDefault() ?? "";
        await LoadCodes();
        PrepareCreate();
    }

    private async Task OnGroupChanged(string value)
    {
        selectedGroup = value;
        await LoadCodes();
        PrepareCreate();
    }

    private async Task LoadCodes()
    {
        isLoading = true;
        codes = string.IsNullOrWhiteSpace(selectedGroup)
            ? []
            : await CommonCodeClient.GetByGroupAsync(selectedGroup);
        isLoading = false;
    }

    private void PrepareCreate()
    {
        isCreateMode = true;
        editModel = new CommonCode
        {
            CodeGroup = selectedGroup,
            IsActive = true
        };
    }

    private void EditCode(CommonCode code)
    {
        isCreateMode = false;
        editModel = new CommonCode
        {
            CodeGroup = code.CodeGroup,
            CodeValue = code.CodeValue,
            CodeName = code.CodeName,
            SortOrder = code.SortOrder,
            IsActive = code.IsActive
        };
    }

    private async Task SaveCode()
    {
        editModel.CodeGroup = editModel.CodeGroup?.Trim() ?? string.Empty;
        editModel.CodeValue = editModel.CodeValue?.Trim() ?? string.Empty;
        editModel.CodeName = editModel.CodeName?.Trim() ?? string.Empty;

        if (string.IsNullOrWhiteSpace(editModel.CodeGroup) ||
            string.IsNullOrWhiteSpace(editModel.CodeValue) ||
            string.IsNullOrWhiteSpace(editModel.CodeName))
        {
            Snackbar.Add("그룹, 값, 이름은 모두 입력해야 합니다.", Severity.Error);
            return;
        }

        if (editModel.CodeGroup.Any(char.IsWhiteSpace))
        {
            Snackbar.Add("code_group에는 공백을 넣을 수 없습니다.", Severity.Error);
            return;
        }

        if (editModel.CodeValue.Any(char.IsWhiteSpace))
        {
            Snackbar.Add("code_value에는 공백을 넣을 수 없습니다.", Severity.Error);
            return;
        }

        if (!await CommonCodeClient.UpsertAsync(editModel))
        {
            Snackbar.Add("저장 실패", Severity.Error);
            return;
        }

        Snackbar.Add("저장되었습니다.", Severity.Success);
        await LoadCodes();
        PrepareCreate();
    }

    private async Task DeleteCode(CommonCode code)
    {
        if (!await CommonCodeClient.DeleteAsync(code.CodeGroup, code.CodeValue))
        {
            Snackbar.Add("삭제 실패", Severity.Error);
            return;
        }

        Snackbar.Add("삭제되었습니다.", Severity.Success);
        await LoadCodes();
        PrepareCreate();
    }
}
