// Simple authorization module
(function($) {
    'use strict';

    var SimpleAuth = {
        token: null,
        username: null,
        selectedOrganization: null,
        isAuthenticated: false,
        inactivityTimeout: 10 * 60 * 1000, // 10 minutes in milliseconds
        inactivityTimer: null,
        modalShown: false, // Flag to prevent repeated modal shows

        init: function() {
            this.token = sessionStorage.getItem('pgad_token');
            this.username = sessionStorage.getItem('pgad_username');
            this.selectedOrganization = sessionStorage.getItem('pgad_selectedOrg');
            
            // Clear selectedOrganization if user is viewing as themselves or not admin
            if (this.selectedOrganization === this.username || (this.username !== 'sempro.nl' && this.selectedOrganization)) {
                this.selectedOrganization = null;
                sessionStorage.removeItem('pgad_selectedOrg');
            }
            
            if (this.token) {
                this.isAuthenticated = true;
                this.showAuthUI();
                this.startInactivityTimer();
                this.updateContractEditorVisibility();
                // Load organizations for admin selector
                this.loadOrganizationsList();
            }

            // Create login modal HTML
            this.createLoginModal();

            // Show login modal on first visit if not authenticated
            if (!this.isAuthenticated && !this.modalShown) {
                this.showLoginModal();
                this.modalShown = true;
            }

            // Listen for Ctrl+Shift+L
            $(document).on('keydown', function(e) {
                if (e.ctrlKey && e.shiftKey && e.keyCode === 76) {
                    e.preventDefault();
                    if (!SimpleAuth.isAuthenticated) {
                        SimpleAuth.showLoginModal();
                    }
                }
            });

            // Track user activity to reset inactivity timer
            $(document).on('mousedown keydown click', function() {
                if (SimpleAuth.isAuthenticated) {
                    SimpleAuth.resetInactivityTimer();
                }
            });

            // Global AJAX error handler for 401 Unauthorized
            $(document).ajaxError(function(event, jqxhr, settings, thrownError) {
                if (jqxhr.status === 401) {
                    console.log('Received 401 Unauthorized - auto logout');
                    SimpleAuth.handleUnauthorized();
                }
            });

            // Organization picker toggle (like other pickers)
            $(document).on('click', '#organization-toggle', function() {
                var content = $('#organization-content');
                var arrow = $('#organization-toggle .picker-arrow');
                content.toggleClass('collapsed');
                arrow.toggleClass('collapsed');
            });
        },

        handleUnauthorized: function() {
            // Clear authentication state
            this.token = null;
            this.isAuthenticated = false;
            sessionStorage.removeItem('pgad_token');
            this.hideAuthUI();
            
            // Stop inactivity timer
            if (this.inactivityTimer) {
                clearTimeout(this.inactivityTimer);
                this.inactivityTimer = null;
            }
            
            // Show login modal
            this.showLoginModal();
        },

        startInactivityTimer: function() {
            this.inactivityTimer = setTimeout(function() {
                if (SimpleAuth.isAuthenticated) {
                    console.log('User inactive for 10 minutes. Logging out...');
                    SimpleAuth.logout();
                }
            }, this.inactivityTimeout);
        },

        resetInactivityTimer: function() {
            // Clear existing timer
            if (this.inactivityTimer) {
                clearTimeout(this.inactivityTimer);
            }
            // Start a new timer
            if (this.isAuthenticated) {
                this.startInactivityTimer();
            }
        },

        createLoginModal: function() {
            var modalHtml = `
                <div id="pgad-login-modal" class="pgad-login-modal">
                    <div class="pgad-login-container">
                        <div class="pgad-login-header">
                            <h2>Admin Login</h2>
                            <p>Sempro Technologies</p>
                        </div>
                        <form id="pgad-login-form">
                            <div class="pgad-form-group">
                                <label for="pgad-username">Username</label>
                                <input type="text" id="pgad-username" name="username" placeholder="Enter username" required autocomplete="username" />
                            </div>
                            <div class="pgad-form-group">
                                <label for="pgad-password">Password</label>
                                <input type="password" id="pgad-password" name="password" placeholder="Enter password" required autocomplete="current-password" />
                            </div>
                            <div id="pgad-login-error" class="pgad-login-error"></div>
                            <div class="pgad-form-actions">
                                <button type="submit" class="pgad-btn-login">Login</button>
                                <button type="button" class="pgad-btn-cancel" onclick="SimpleAuth.closeLoginModal()">Cancel</button>
                            </div>
                        </form>
                    </div>
                </div>
            `;
            $('body').append(modalHtml);
            
            $('#pgad-login-form').on('submit', function(e) {
                e.preventDefault();
                SimpleAuth.login($('#pgad-username').val(), $('#pgad-password').val());
            });
        },

        showLoginModal: function() {
            $('#pgad-login-modal').addClass('pgad-active');
            $('#pgad-username').focus();
        },

        closeLoginModal: function() {
            $('#pgad-login-modal').removeClass('pgad-active');
            $('#pgad-login-form')[0].reset();
            $('#pgad-login-error').text('').hide();
        },

        login: function(username, password) {
            $.ajax({
                url: '/api/auth/login',
                method: 'POST',
                contentType: 'application/json',
                data: JSON.stringify({ username: username, password: password })
            })
            .done(function(data) {
                if (data.success && data.token) {
                    SimpleAuth.token = data.token;
                    SimpleAuth.username = data.username;
                    SimpleAuth.isAuthenticated = true;
                    sessionStorage.setItem('pgad_token', SimpleAuth.token);
                    sessionStorage.setItem('pgad_username', SimpleAuth.username);
                    // Clear selected organization on login - always view as self
                    SimpleAuth.selectedOrganization = null;
                    sessionStorage.removeItem('pgad_selectedOrg');
                    SimpleAuth.closeLoginModal();
                    SimpleAuth.showAuthUI();
                    SimpleAuth.startInactivityTimer();
                    SimpleAuth.updateContractEditorVisibility();
                    SimpleAuth.loadOrganizationsList();
                    console.log('Authorized token: ' + SimpleAuth.token);
                    
                    // Trigger custom event for login success
                    $(document).trigger('loginSuccess');
                    
                    // Refresh the page after successful login
                    setTimeout(function() {
                        location.reload();
                    }, 300);
                } else {
                    $('#pgad-login-error').text('Login failed').show();
                }
            })
            .fail(function() {
                $('#pgad-login-error').text('Invalid username or password').show();
            });
        },

        logout: function() {
            // Clear inactivity timer
            if (this.inactivityTimer) {
                clearTimeout(this.inactivityTimer);
                this.inactivityTimer = null;
            }

            $.ajax({
                url: '/api/auth/logout',
                method: 'POST',
                headers: {
                    'X-Auth-Token': this.token
                }
            })
            .always(function() {
                SimpleAuth.token = null;
                SimpleAuth.username = null;
                SimpleAuth.isAuthenticated = false;
                sessionStorage.removeItem('pgad_token');
                sessionStorage.removeItem('pgad_username');
                SimpleAuth.hideAuthUI();
                // Refresh the page after logout
                setTimeout(function() {
                    location.reload();
                }, 300);
            });
        },

        showAuthUI: function() {
            $('body').append(
                '<div id="pgad-auth-badge" class="pgad-auth-badge">' +
                '<span class="pgad-badge-dot"></span> Authorized' +
                '<button id="pgad-logout-btn" class="pgad-logout-btn">Logout</button>' +
                '</div>'
            );
            $('#pgad-logout-btn').on('click', function() {
                SimpleAuth.logout();
            });
        },

        hideAuthUI: function() {
            $('#pgad-auth-badge').fadeOut(300, function() { $(this).remove(); });
        },

        // Get header for authorized requests
        getAuthHeader: function() {
            return this.token ? { 'X-Auth-Token': this.token } : {};
        },

        // Update contract editor visibility based on user role
        updateContractEditorVisibility: function() {
            var contractEditorLink = $('nav#nav a[onclick*="openContractEditor"]').parent();
            var rebuildTablesLink = $('nav#nav a[onclick*="rebuildTables"]').parent();
            var orgSelectorNav = $('#admin-org-selector');
            var orgSelectorSidebar = $('.organization-picker');
            
            if (this.username === 'sempro.nl') {
                contractEditorLink.show();
                rebuildTablesLink.show();
                orgSelectorNav.show();
                orgSelectorSidebar.show();
            } else {
                contractEditorLink.hide();
                rebuildTablesLink.hide();
                orgSelectorNav.hide();
                orgSelectorSidebar.hide();
            }
        },

        // Check if current user is admin
        isAdmin: function() {
            return this.username === 'sempro.nl';
        },

        // Effective username for data (selected org for admin)
        getEffectiveUsername: function() {
            if (this.isAdmin() && this.selectedOrganization) {
                return this.selectedOrganization;
            }
            return this.username;
        },

        // Load organizations into selectors (nav + sidebar)
        loadOrganizationsList: function() {
            if (!this.isAdmin()) return;

            $.ajax({
                url: '/api/users/list',
                method: 'GET',
                headers: this.getAuthHeader()
            }).done(function(users) {
                try {
                    console.log('loadOrganizationsList: raw response', users);
                    // Expect { users: ["org1","org2", ...] }
                    var list = [];
                    if (users && Array.isArray(users.users)) {
                        list = users.users;
                    } else if (Array.isArray(users)) {
                        list = users;
                    } else {
                        // Try parse JSON string fallback
                        var parsed = (typeof users === 'string') ? JSON.parse(users) : users;
                        if (parsed && Array.isArray(parsed.users)) {
                            list = parsed.users;
                        }
                    }

                    // Clean list: remove falsy/empty, de-dupe, sort
                    var seen = {};
                    list = list.filter(function(u){ return !!u; }).filter(function(u){
                        if (seen[u]) return false;
                        seen[u] = true;
                        return true;
                    }).sort();
                    console.log('loadOrganizationsList: cleaned list', list);

                    if (list.length === 0) {
                        console.log('loadOrganizationsList: empty list after cleaning');
                    }

                    console.log('loadOrganizationsList: cleaned list', list);

                    // Render organizations in picker
                    if (window.OrganizationPicker) {
                        console.log('Calling OrganizationPicker.render with', list.length, 'orgs');
                        OrganizationPicker.render(list);
                    } else {
                        console.log('OrganizationPicker not available');
                    }
                } catch(e) {
                    console.log('Failed to parse users list');
                }
            }).fail(function() {
                console.log('Failed to load organizations list');
            });
        },

        // Change organization view for admin
        changeOrganization: function(org) {
            if (!this.isAdmin()) return;

            if (org === '') {
                this.selectedOrganization = null;
                sessionStorage.removeItem('pgad_selectedOrg');
            } else {
                this.selectedOrganization = org;
                sessionStorage.setItem('pgad_selectedOrg', org);
            }

            // Refresh data views
            if (window.GraphLoader) {
                window.GraphLoader.update();
            }
            
            // Refresh Jira issue picker with current selections
            if (window.JiraIssuePicker && window.YearMonthPicker && window.HourTypePicker && window.ClassificationPicker) {
                var selection = window.YearMonthPicker.getSelection();
                var periods = selection.periods || [];
                var hourTypes = window.HourTypePicker.getSelection().join(', ');
                var classifications = window.ClassificationPicker.getSelection().join(', ');
                window.JiraIssuePicker.refresh(periods, hourTypes, classifications);
            }
            
            // Also refresh any table if open
            // Simple approach: reload to keep all components consistent
            setTimeout(function(){ location.reload(); }, 100);
        }
    };

    $(document).ready(function() {
        SimpleAuth.init();
    });

    window.SimpleAuth = SimpleAuth;

})(jQuery);
