@inherits LayoutComponentBase
@implements IDisposable
@inject IProjectService ProjectService
@inject ISettingsService SettingsService
@inject IThemeService ThemeService
@inject OllamaSettings OllamaSettings
@inject IAuthService AuthService
@inject CustomAuthStateProvider AuthStateProvider

<div class="page">
    <div class="main-content">
        @if (_isAuthenticated)
        {
        <aside class="sidebar">
            <div class="nav-section">
                <button class="nav-section-header" @onclick='() => ToggleSection("file")'>
                    <span class="nav-icon">@(activeSection == "file" ? "▼" : "▶")</span>
                    @T("Datei", "File")
                </button>
                @if (activeSection == "file")
                {
                    <div class="nav-section-body">
                        <button class="nav-item" @onclick="CreateNewProject">@T("Neues Projekt", "New project")</button>
                        <button class="nav-item" @onclick="OpenEditor">@T("Editor \u00f6ffnen", "Open editor")</button>
                        <div class="nav-separator"></div>
                        <button class="nav-item" @onclick="ExitApp">@T("Beenden", "Exit")</button>
                    </div>
                }
            </div>
            <div class="nav-section">
                <button class="nav-section-header" @onclick='() => ToggleSection("extras")'>
                    <span class="nav-icon">@(activeSection == "extras" ? "▼" : "▶")</span>
                    @T("Extras", "Extras")
                </button>
                @if (activeSection == "extras")
                {
                    <div class="nav-section-body">
                        <button class="nav-item" @onclick='() => NavigateTo("/settings")'>@T("Einstellungen", "Settings")</button>
                        <button class="nav-item" @onclick='() => NavigateTo("/models")'>@T("Modelle verwalten", "Manage models")</button>
                        <button class="nav-item" @onclick='() => NavigateTo("/assistant")'>@T("Assistent", "Assistant")</button>
                    </div>
                }
            </div>
            <div class="nav-section">
                <button class="nav-section-header" @onclick='() => ToggleSection("projects")'>
                    <span class="nav-icon">@(activeSection == "projects" ? "▼" : "▶")</span>
                    @T("Projekte", "Projects")
                </button>
                @if (activeSection == "projects")
                {
                    <div class="nav-section-body">
                        <button class="nav-item nav-item-toggle" @onclick='() => showProjectList = !showProjectList'>
                            <span class="nav-icon">@(showProjectList ? "▼" : "▶")</span>
                            @T("Liste vorhandener Projekte", "List existing projects")
                        </button>
                        @if (showProjectList)
                        {
                            <div class="nav-sublist">
                                @if (projects == null)
                                {
                                    <span class="nav-hint">@T("Lade Projekte...", "Loading projects...")</span>
                                }
                                else if (projects.Count == 0)
                                {
                                    <span class="nav-hint">@T("Keine Projekte vorhanden.", "No projects available.")</span>
                                }
                                else
                                {
                                    @foreach (var p in projects)
                                    {
                                        <button class="nav-item nav-item-sub @(p.Id == currentProjectId ? "active" : "")" @onclick='() => SelectProject(p)'>@p.Name</button>
                                    }
                                }
                            </div>
                        }
                        <div class="nav-separator"></div>
                        <button class="nav-item" @onclick="CreateNewProject">@T("Projekt erstellen", "Create project")</button>
                    </div>
                }
            </div>
            @if (currentProjectId > 0 && fileTree != null)
            {
                <div class="nav-section nav-section-open">
                    <div class="nav-section-header">
                        <span>@T("Projektdateien", "Project files")</span>
                        <span class="nav-header-actions">
                            <button class="nav-item-icon" @onclick="RefreshFileTree" title="@T("Dateibaum aktualisieren", "Refresh file tree")">↻</button>
                        </span>
                    </div>
                    <div class="nav-section-body">
                        @foreach (var item in fileTree)
                        {
                            <div class="tree-item @(item.IsDirectory ? "dir" : "file") @(item.FullPath == currentFilePath ? "active" : "")"
                                 @onclick="() => OpenFile(item)">
                                <span class="tree-icon">@(item.IsDirectory ? "📁" : "📄")</span>
                                <span class="tree-name">@item.Name</span>
                                @if (item.IsDirectory)
                                {
                                    <button class="tree-rename" @onclick="() => BeginNewFile(item)" @onclick:stopPropagation title="@T("Neue Datei", "New file")">+</button>
                                }
                                else
                                {
                                    <button class="tree-rename" @onclick="() => BeginRename(item)" @onclick:stopPropagation title="@T("Umbenennen", "Rename")">✎</button>
                                }
                            </div>
                            @foreach (var child in item.Children)
                            {
                                <div class="tree-item file tree-child @(child.FullPath == currentFilePath ? "active" : "")"
                                     @onclick="() => OpenFile(child)">
                                    <span class="tree-icon">📄</span>
                                    <span class="tree-name">@child.Name</span>
                                    <button class="tree-rename" @onclick="() => BeginRename(child)" @onclick:stopPropagation title="@T("Umbenennen", "Rename")">✎</button>
                                </div>
                            }
                        }
                    </div>
                </div>
            }

@if (showRenameDialog)
{
    <div class="modal-overlay">
        <div class="modal-dialog">
            <div class="modal-title">@T("Datei umbenennen", "Rename file")</div>
            <div class="modal-body">
                <div class="form-group">
                    <label>@T("Neuer Name", "New name")</label>
                    <input @bind="renameNewName" placeholder="@T("neuer_name.md", "new_name.md")" />
                </div>
            </div>
            <div class="modal-actions">
                <button @onclick="CancelRename">@T("Abbrechen", "Cancel")</button>
                <button @onclick="ConfirmRename" disabled="@(string.IsNullOrWhiteSpace(renameNewName))" class="primary">@T("Umbenennen", "Rename")</button>
            </div>
        </div>
    </div>
}

@if (showNewFileDialog)
{
    <div class="modal-overlay">
        <div class="modal-dialog">
            <div class="modal-title">@T("Neue Datei", "New file")</div>
            <div class="modal-body">
                <div class="form-group">
                    <label>@T("Dateiname", "Filename")</label>
                    <input @bind="newFileName" placeholder="@T("meine_datei.md", "my_file.md")" />
                </div>
            </div>
            <div class="modal-actions">
                <button @onclick="CancelNewFile">@T("Abbrechen", "Cancel")</button>
                <button @onclick="ConfirmNewFile" disabled="@(string.IsNullOrWhiteSpace(newFileName))" class="primary">@T("Erstellen", "Create")</button>
            </div>
        </div>
    </div>
}

            @if (!string.IsNullOrEmpty(_username))
            {
                <div class="nav-section" style="border-top:1px solid var(--border-color);margin-top:8px;padding-top:4px;">
                    <div class="nav-section-header" style="cursor:default;">
                        <span style="font-size:11px;font-weight:normal;">@T("Angemeldet als:", "Logged in as:") @_username</span>
                    </div>
                    <div class="nav-section-body">
                        <button class="nav-item" @onclick="NavigateToSetup2FA">@T("2FA verwalten", "Manage 2FA")</button>
                        <button class="nav-item" @onclick="Logout">@T("Abmelden", "Logout")</button>
                    </div>
                </div>
            }

        </aside>
        }

        <main class="detail-panel">
            @Body
        </main>
    </div>

    <footer class="status-bar">
        <span class="status-dot connected"></span>
        <span class="status-text">@statusText</span>
        @if (isBusy)
        {
            <progress value="@operationProgress" max="100"></progress>
        }
    </footer>
</div>

@code {
    private string _language = "de";
    private string _username = string.Empty;
    private bool _isAuthenticated;
    private string? activeSection;
    private bool showProjectList;
    private List<Project>? projects;
    private List<FileTreeItem>? fileTree;
    private int currentProjectId;
    private string? currentFilePath;
    private string statusText = "Bereit";
    private bool isBusy;
    private double operationProgress;
    private bool showRenameDialog;
    private string renameNewName = string.Empty;
    private FileTreeItem? renameTarget;
    private bool showNewFileDialog;
    private string newFileName = string.Empty;
    private FileTreeItem? newFileParentDir;

    private string T(string de, string en) => _language == "en" ? en : de;

    [Inject]
    private NavigationManager Navigation { get; set; } = default!;

    protected override async Task OnInitializedAsync()
    {
        await SettingsService.InitializeAsync();
        _language = await SettingsService.GetLanguageAsync() ?? "de";
        statusText = T("Bereit", "Ready");
        Navigation.LocationChanged += OnLocationChanged;
    }

    private async Task LoadCurrentUser()
    {
        var user = await AuthService.GetCurrentUserAsync();
        _username = user?.Name ?? string.Empty;
        _isAuthenticated = user != null;
    }

    private async Task AutoLoadLastProject()
    {
        if (currentProjectId > 0) return;
        var lastId = await SettingsService.GetLastProjectIdAsync();
        if (lastId == null) return;
        var project = projects?.FirstOrDefault(p => p.Id == lastId.Value);
        if (project != null)
        {
            await SettingsService.InitializeAsync(lastId.Value);
            await SelectProject(project);
        }
    }

    protected override async Task OnAfterRenderAsync(bool firstRender)
    {
        if (firstRender)
        {
            var theme = OllamaSettings.Theme;
            if (!string.IsNullOrEmpty(theme))
                await ThemeService.ApplyTheme(theme);

            // Auto-login runs AFTER circuit establishment (correct scoped services)
            await LoadCurrentUser();
#if DEBUG
            if (!_isAuthenticated && Program.DebugAutoLogin)
            {
                var users = await SettingsService.GetUsersAsync();
                var first = users.FirstOrDefault();
                if (first != null)
                {
                    await AuthService.AdminBypassLoginAsync(first.Id);
                    AuthStateProvider.NotifyStateChanged();
                    await LoadCurrentUser();
                }
            }
#endif
            if (_isAuthenticated)
            {
                await LoadProjects();
                await LoadProjectContext();
                await AutoLoadLastProject();
            }
            StateHasChanged();
        }
    }

    public void Dispose()
    {
        Navigation.LocationChanged -= OnLocationChanged;
    }

    private async void OnLocationChanged(object? sender, Microsoft.AspNetCore.Components.Routing.LocationChangedEventArgs e)
    {
        await LoadCurrentUser();
        if (_isAuthenticated)
        {
            await LoadProjects();
            await LoadProjectContext();
        }
        StateHasChanged();
    }

    private async Task LoadProjectContext()
    {
        currentProjectId = SettingsService.CurrentProjectId ?? 0;
        currentFilePath = SettingsService.CurrentFilePath;

        if (currentProjectId > 0)
        {
            await LoadFileTree();
        }
        else
        {
            fileTree = null;
        }
    }

    private async Task LoadFileTree()
    {
        try
        {
            fileTree = await ProjectService.GetProjectFileTreeAsync(currentProjectId);
        }
        catch
        {
            fileTree = new();
        }
    }

    private async Task LoadProjects()
    {
        try
        {
            projects = await ProjectService.GetAllProjectsAsync();
        }
        catch
        {
            projects = new();
        }
    }

    private void ToggleSection(string section)
    {
        activeSection = activeSection == section ? null : section;
    }

    private void ExitApp()
    {
        activeSection = null;
        Navigation.NavigateTo("/");
    }

    private void CreateNewProject()
    {
        activeSection = null;
        Navigation.NavigateTo("/editor/newproject");
    }

    private void OpenEditor()
    {
        activeSection = null;
        Navigation.NavigateTo("/editor");
    }

    private void NavigateTo(string path)
    {
        activeSection = null;
        Navigation.NavigateTo(path);
    }

    private void NavigateToSetup2FA()
    {
        activeSection = null;
        Navigation.NavigateTo("/setup-2fa");
    }

    private async Task Logout()
    {
        activeSection = null;
        await AuthService.LogoutAsync();
        _username = string.Empty;
        AuthStateProvider.NotifyStateChanged();
        Navigation.NavigateTo("/login", true);
    }

    private async Task SelectProject(Project project)
    {
        activeSection = "files";
        SettingsService.CurrentProjectId = project.Id;
        currentProjectId = project.Id;
        SettingsService.CurrentFilePath = null;
        await SettingsService.SaveLastProjectIdAsync(project.Id);
        await SettingsService.LoadProjectSettingsAsync();
        await LoadFileTree();
        Navigation.NavigateTo($"/editor/index/{project.Id}");
    }

    private async Task RefreshFileTree()
    {
        await LoadFileTree();
        StateHasChanged();
    }

    private void BeginRename(FileTreeItem item)
    {
        renameTarget = item;
        renameNewName = item.Name;
        showRenameDialog = true;
    }

    private void CancelRename()
    {
        showRenameDialog = false;
        renameTarget = null;
        renameNewName = string.Empty;
    }

    private async Task ConfirmRename()
    {
        if (renameTarget == null || string.IsNullOrWhiteSpace(renameNewName)) return;

        try
        {
            var dir = Path.GetDirectoryName(renameTarget.FullPath)!;
            var newPath = Path.Combine(dir, renameNewName);
            if (File.Exists(newPath))
            {
                statusText = T("Datei existiert bereits.", "File already exists.");
                return;
            }
            File.Move(renameTarget.FullPath, newPath);

            if (currentFilePath == renameTarget.FullPath)
                SettingsService.CurrentFilePath = newPath;

            statusText = $"{T("Umbenannt zu:", "Renamed to:")} {renameNewName}";
        }
        catch (Exception ex)
        {
            statusText = $"{T("Fehler:", "Error:")} {ex.Message}";
        }
        finally
        {
            showRenameDialog = false;
            renameTarget = null;
            renameNewName = string.Empty;
            await LoadFileTree();
            StateHasChanged();
        }
    }

    private void BeginNewFile(FileTreeItem dir)
    {
        newFileParentDir = dir;
        newFileName = string.Empty;
        showNewFileDialog = true;
    }

    private void CancelNewFile()
    {
        showNewFileDialog = false;
        newFileParentDir = null;
        newFileName = string.Empty;
    }

    private async Task ConfirmNewFile()
    {
        if (newFileParentDir == null || string.IsNullOrWhiteSpace(newFileName)) return;

        try
        {
            var path = Path.Combine(newFileParentDir.FullPath, newFileName);
            if (!path.EndsWith(".md", StringComparison.OrdinalIgnoreCase))
                path += ".md";
            if (File.Exists(path))
            {
                statusText = T("Datei existiert bereits.", "File already exists.");
                return;
            }
            File.WriteAllText(path, $"# {Path.GetFileNameWithoutExtension(path)}\n\n");
            statusText = $"{T("Erstellt:", "Created:")} {Path.GetFileName(path)}";
        }
        catch (Exception ex)
        {
            statusText = $"{T("Fehler:", "Error:")} {ex.Message}";
        }
        finally
        {
            showNewFileDialog = false;
            newFileParentDir = null;
            newFileName = string.Empty;
            await LoadFileTree();
            StateHasChanged();
        }
    }

    private void OpenFile(FileTreeItem item)
    {
        if (item.IsDirectory) return;
        activeSection = null;
        SettingsService.CurrentFilePath = item.FullPath;
        Navigation.NavigateTo($"/editor/file/{currentProjectId}?t={DateTime.Now.Ticks}");
    }

    public void SetStatus(string text, bool busy = false, double progress = 0)
    {
        statusText = text;
        isBusy = busy;
        operationProgress = progress;
        StateHasChanged();
    }
}
