#!/usr/bin/env python3

import json
import os
import socket
import sys
import time
import urllib.parse
from datetime import datetime
from http.server import HTTPServer, BaseHTTPRequestHandler
from socketserver import ThreadingMixIn


class ThreadedHTTPServer(ThreadingMixIn, HTTPServer):
    """Handle requests in a separate thread."""
    daemon_threads = True


class ControlPanelHandler(BaseHTTPRequestHandler):
    def __init__(self, *args, **kwargs):
        self.data_dir = "/home/wdjones/.openclaw/workspace/projects/control-panel/data"
        super().__init__(*args, **kwargs)

    def do_GET(self):
        try:
            self.handle_get()
        except Exception as e:
            self.send_error(500, f"Internal error: {e}")

    def do_POST(self):
        try:
            self.handle_post()
        except Exception as e:
            self.send_error(500, f"Internal error: {e}")

    def handle_get(self):
        if self.path == '/':
            self.serve_dashboard()
        elif self.path == '/accounts':
            self.serve_accounts()
        elif self.path == '/api-keys':
            self.serve_api_keys()
        elif self.path == '/services':
            self.serve_services()
        elif self.path == '/budget':
            self.serve_budget()
        elif self.path == '/activity':
            self.serve_activity()
        elif self.path == '/todos':
            self.serve_todos()
        else:
            self.send_error(404, "Not found")

    def handle_post(self):
        content_length = int(self.headers['Content-Length'])
        post_data = self.rfile.read(content_length).decode('utf-8')
        form_data = urllib.parse.parse_qs(post_data)

        if self.path == '/accounts':
            self.handle_accounts_post(form_data)
        elif self.path == '/api-keys':
            self.handle_api_keys_post(form_data)
        elif self.path == '/budget':
            self.handle_budget_post(form_data)
        elif self.path == '/todos':
            self.handle_todos_post(form_data)
        else:
            self.send_error(404, "Not found")

    def load_data(self, filename):
        filepath = os.path.join(self.data_dir, filename)
        if os.path.exists(filepath):
            with open(filepath, 'r') as f:
                return json.load(f)
        return []

    def save_data(self, filename, data):
        os.makedirs(self.data_dir, exist_ok=True)
        filepath = os.path.join(self.data_dir, filename)
        with open(filepath, 'w') as f:
            json.dump(data, f, indent=2)

    def log_activity(self, action, details=""):
        activity = self.load_data('activity.json')
        entry = {
            "timestamp": datetime.now().isoformat(),
            "action": action,
            "details": details
        }
        activity.insert(0, entry)  # Latest first
        activity = activity[:100]  # Keep last 100 entries
        self.save_data('activity.json', activity)

    def check_service_health(self, port):
        try:
            sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            sock.settimeout(2)
            result = sock.connect_ex(('localhost', port))
            sock.close()
            return result == 0
        except:
            return False

    def get_base_template(self, title, content):
        return f"""<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>{title} - Case Control Panel</title>
    <style>
        * {{
            margin: 0;
            padding: 0;
            box-sizing: border-box;
        }}
        
        body {{
            font-family: 'Monaco', 'Menlo', 'Ubuntu Mono', monospace;
            background: #0d1117;
            color: #c9d1d9;
            line-height: 1.6;
            min-height: 100vh;
        }}

        .container {{
            max-width: 1200px;
            margin: 0 auto;
            padding: 20px;
        }}

        header {{
            background: #21262d;
            border-bottom: 2px solid #30363d;
            padding: 1rem 0;
            margin-bottom: 2rem;
        }}

        .header-content {{
            max-width: 1200px;
            margin: 0 auto;
            padding: 0 20px;
            display: flex;
            justify-content: space-between;
            align-items: center;
        }}

        .logo {{
            font-size: 1.8em;
            font-weight: bold;
            color: #58a6ff;
        }}

        nav a {{
            color: #c9d1d9;
            text-decoration: none;
            margin: 0 15px;
            padding: 8px 16px;
            border-radius: 6px;
            transition: background 0.2s;
        }}

        nav a:hover {{
            background: #30363d;
        }}

        nav a.active {{
            background: #1f6feb;
        }}

        .card {{
            background: #21262d;
            border: 1px solid #30363d;
            border-radius: 8px;
            padding: 1.5rem;
            margin-bottom: 1.5rem;
            box-shadow: 0 4px 6px rgba(0, 0, 0, 0.3);
        }}

        .card-header {{
            font-size: 1.2em;
            font-weight: bold;
            margin-bottom: 1rem;
            padding-bottom: 0.5rem;
            border-bottom: 1px solid #30363d;
            color: #58a6ff;
        }}

        .stats-grid {{
            display: grid;
            grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
            gap: 1.5rem;
            margin-bottom: 2rem;
        }}

        .stat-card {{
            background: #161b22;
            border: 1px solid #21262d;
            border-radius: 8px;
            padding: 1.5rem;
            text-align: center;
        }}

        .stat-number {{
            font-size: 2.5em;
            font-weight: bold;
            color: #40c463;
            display: block;
        }}

        .stat-label {{
            color: #8b949e;
            margin-top: 0.5rem;
        }}

        table {{
            width: 100%;
            border-collapse: collapse;
            margin-top: 1rem;
        }}

        th, td {{
            padding: 12px;
            text-align: left;
            border-bottom: 1px solid #30363d;
        }}

        th {{
            background: #161b22;
            color: #58a6ff;
            font-weight: bold;
        }}

        tr:hover {{
            background: #161b22;
        }}

        .status-active {{
            color: #40c463;
            font-weight: bold;
        }}

        .status-inactive {{
            color: #f85149;
            font-weight: bold;
        }}

        .btn {{
            background: #238636;
            color: white;
            border: none;
            padding: 8px 16px;
            border-radius: 6px;
            cursor: pointer;
            text-decoration: none;
            display: inline-block;
            margin: 2px;
            font-size: 14px;
        }}

        .btn:hover {{
            background: #2ea043;
        }}

        .btn-danger {{
            background: #da3633;
        }}

        .btn-danger:hover {{
            background: #f85149;
        }}

        .btn-secondary {{
            background: #21262d;
            border: 1px solid #30363d;
        }}

        .btn-secondary:hover {{
            background: #30363d;
        }}

        .form-group {{
            margin-bottom: 1rem;
        }}

        .form-group label {{
            display: block;
            margin-bottom: 0.5rem;
            color: #f0f6fc;
            font-weight: bold;
        }}

        .form-group input, .form-group select, .form-group textarea {{
            width: 100%;
            padding: 8px 12px;
            border: 1px solid #30363d;
            border-radius: 6px;
            background: #0d1117;
            color: #c9d1d9;
            font-family: inherit;
        }}

        .form-group input:focus, .form-group select:focus, .form-group textarea:focus {{
            outline: none;
            border-color: #58a6ff;
            box-shadow: 0 0 0 3px rgba(88, 166, 255, 0.1);
        }}

        .masked-key {{
            font-family: monospace;
            background: #161b22;
            padding: 4px 8px;
            border-radius: 4px;
            cursor: pointer;
            border: 1px solid #30363d;
        }}

        .reveal-btn {{
            background: none;
            border: none;
            color: #58a6ff;
            cursor: pointer;
            text-decoration: underline;
            font-size: 12px;
        }}

        .activity-entry {{
            padding: 10px;
            border-bottom: 1px solid #30363d;
        }}

        .activity-timestamp {{
            color: #8b949e;
            font-size: 0.9em;
        }}

        .activity-action {{
            font-weight: bold;
            color: #40c463;
        }}
    </style>
</head>
<body>
    <header>
        <div class="header-content">
            <div class="logo">🖤 Case Control Panel</div>
            <nav>
                <a href="/">Dashboard</a>
                <a href="/accounts">Accounts</a>
                <a href="/api-keys">API Keys</a>
                <a href="/services">Services</a>
                <a href="/budget">Budget</a>
                <a href="/activity">Activity</a>
                <a href="/todos">⚡ Action Required</a>
            </nav>
        </div>
    </header>
    <div class="container">
        {content}
    </div>
    <script>
        function toggleKey(element) {{
            const key = element.getAttribute('data-key');
            if (element.textContent.includes('*')) {{
                element.textContent = key;
            }} else {{
                element.textContent = '*'.repeat(key.length);
            }}
        }}
    </script>
</body>
</html>"""

    def serve_dashboard(self):
        accounts = self.load_data('accounts.json')
        api_keys = self.load_data('api-keys.json')
        budget = self.load_data('budget.json')
        todos = self.load_data('todos.json')
        
        # Calculate stats
        total_accounts = len(accounts)
        active_accounts = len([a for a in accounts if a.get('status') == 'active'])
        total_api_keys = len(api_keys)
        pending_todos = len([t for t in todos if t.get('status') == 'pending'])
        monthly_spend = sum([b.get('amount', 0) for b in budget if 
                           b.get('type') == 'spending' and 
                           b.get('timestamp', '').startswith(datetime.now().strftime('%Y-%m'))])

        content = f"""
        <div class="stats-grid">
            <div class="stat-card">
                <span class="stat-number">{total_accounts}</span>
                <div class="stat-label">Total Accounts</div>
            </div>
            <div class="stat-card">
                <span class="stat-number">{active_accounts}</span>
                <div class="stat-label">Active Services</div>
            </div>
            <div class="stat-card">
                <span class="stat-number">{total_api_keys}</span>
                <div class="stat-label">API Keys</div>
            </div>
            <div class="stat-card">
                <span class="stat-number" style="color:{'#f85149' if pending_todos > 0 else '#40c463'};">{pending_todos}</span>
                <div class="stat-label">⚡ Actions Required</div>
            </div>
        </div>

        <div class="card">
            <div class="card-header">Quick Actions</div>
            <a href="/accounts" class="btn">Manage Accounts</a>
            <a href="/api-keys" class="btn">Manage API Keys</a>
            <a href="/budget" class="btn">Add Budget Entry</a>
            <a href="/services" class="btn">Check Services</a>
        </div>
        """

        html = self.get_base_template("Dashboard", content)
        self.send_response(200)
        self.send_header('Content-type', 'text/html')
        self.end_headers()
        self.wfile.write(html.encode())

    def serve_accounts(self):
        accounts = self.load_data('accounts.json')
        
        accounts_table = ""
        for i, account in enumerate(accounts):
            status_class = "status-active" if account.get('status') == 'active' else "status-inactive"
            login_btn = f'<a href="{account.get("url", "#")}" target="_blank" class="btn btn-secondary">Login</a>' if account.get('url') else ""
            
            accounts_table += f"""
            <tr>
                <td>{account.get('service', 'N/A')}</td>
                <td><a href="{account.get('url', '#')}" target="_blank">{account.get('url', 'N/A')}</a></td>
                <td>{account.get('username', 'N/A')}</td>
                <td><span class="{status_class}">{account.get('status', 'unknown')}</span></td>
                <td>{account.get('last_accessed', 'Never')}</td>
                <td>{account.get('notes', '')}</td>
                <td>{login_btn}</td>
            </tr>
            """

        content = f"""
        <div class="card">
            <div class="card-header">Account Management</div>
            
            <form method="POST" style="margin-bottom: 2rem;">
                <div class="form-group">
                    <label>Service Name:</label>
                    <input type="text" name="service" required>
                </div>
                <div class="form-group">
                    <label>URL:</label>
                    <input type="url" name="url">
                </div>
                <div class="form-group">
                    <label>Username/Email:</label>
                    <input type="text" name="username">
                </div>
                <div class="form-group">
                    <label>Status:</label>
                    <select name="status">
                        <option value="active">Active</option>
                        <option value="inactive">Inactive</option>
                    </select>
                </div>
                <div class="form-group">
                    <label>Notes:</label>
                    <textarea name="notes" rows="3"></textarea>
                </div>
                <input type="hidden" name="action" value="add">
                <button type="submit" class="btn">Add Account</button>
            </form>

            <table>
                <thead>
                    <tr>
                        <th>Service</th>
                        <th>URL</th>
                        <th>Username/Email</th>
                        <th>Status</th>
                        <th>Last Accessed</th>
                        <th>Notes</th>
                        <th>Actions</th>
                    </tr>
                </thead>
                <tbody>
                    {accounts_table}
                </tbody>
            </table>
        </div>
        """

        html = self.get_base_template("Accounts", content)
        self.send_response(200)
        self.send_header('Content-type', 'text/html')
        self.end_headers()
        self.wfile.write(html.encode())

    def serve_api_keys(self):
        api_keys = self.load_data('api-keys.json')
        
        keys_table = ""
        for key in api_keys:
            masked_key = f'<span class="masked-key" onclick="toggleKey(this)" data-key="{key.get("key", "")}">' + \
                        ('*' * len(key.get('key', ''))) + '</span>'
            
            keys_table += f"""
            <tr>
                <td>{key.get('service', 'N/A')}</td>
                <td>{key.get('name', 'N/A')}</td>
                <td>{masked_key}</td>
                <td>{key.get('created', 'N/A')}</td>
                <td>{key.get('expires', 'Never')}</td>
                <td>{key.get('usage', 0)}</td>
            </tr>
            """

        content = f"""
        <div class="card">
            <div class="card-header">API Key Management</div>
            
            <form method="POST" style="margin-bottom: 2rem;">
                <div class="form-group">
                    <label>Service:</label>
                    <input type="text" name="service" required>
                </div>
                <div class="form-group">
                    <label>Key Name:</label>
                    <input type="text" name="name" required>
                </div>
                <div class="form-group">
                    <label>API Key:</label>
                    <input type="text" name="key" required>
                </div>
                <div class="form-group">
                    <label>Expires (optional):</label>
                    <input type="date" name="expires">
                </div>
                <input type="hidden" name="action" value="add">
                <button type="submit" class="btn">Add API Key</button>
            </form>

            <table>
                <thead>
                    <tr>
                        <th>Service</th>
                        <th>Name</th>
                        <th>Key (click to reveal)</th>
                        <th>Created</th>
                        <th>Expires</th>
                        <th>Usage Count</th>
                    </tr>
                </thead>
                <tbody>
                    {keys_table}
                </tbody>
            </table>
        </div>
        """

        html = self.get_base_template("API Keys", content)
        self.send_response(200)
        self.send_header('Content-type', 'text/html')
        self.end_headers()
        self.wfile.write(html.encode())

    def serve_services(self):
        services = [
            {"name": "Feed Hunter Portal", "port": 8888, "path": ""},
            {"name": "Chrome Debug", "port": 9222, "path": ""},
            {"name": "OpenClaw Gateway", "port": 18789, "path": ""},
            {"name": "Case Control Panel", "port": 8000, "path": ""},
        ]
        
        services_table = ""
        for service in services:
            is_healthy = self.check_service_health(service["port"])
            status = "Running" if is_healthy else "Stopped"
            status_class = "status-active" if is_healthy else "status-inactive"
            url = f"http://localhost:{service['port']}{service['path']}"
            link = f'<a href="{url}" target="_blank" style="color:#58a6ff;">{service["name"]}</a>'
            
            services_table += f"""
            <tr>
                <td>{link}</td>
                <td><a href="{url}" target="_blank" style="color:#c9d1d9;">{service['port']}</a></td>
                <td><span class="{status_class}">{status}</span></td>
                <td>N/A</td>
            </tr>
            """

        content = f"""
        <div class="card">
            <div class="card-header">Running Services</div>
            
            <table>
                <thead>
                    <tr>
                        <th>Service Name</th>
                        <th>Port</th>
                        <th>Status</th>
                        <th>Uptime</th>
                    </tr>
                </thead>
                <tbody>
                    {services_table}
                </tbody>
            </table>
            
            <div style="margin-top: 1rem;">
                <button onclick="location.reload()" class="btn">Refresh Status</button>
            </div>
        </div>
        """

        html = self.get_base_template("Services", content)
        self.send_response(200)
        self.send_header('Content-type', 'text/html')
        self.end_headers()
        self.wfile.write(html.encode())

    def serve_budget(self):
        budget = self.load_data('budget.json')
        
        # Calculate totals
        total_balance = sum([b.get('amount', 0) for b in budget if b.get('type') == 'deposit']) - \
                       sum([b.get('amount', 0) for b in budget if b.get('type') in ['withdrawal', 'spending']])
        
        current_month = datetime.now().strftime('%Y-%m')
        monthly_spending = sum([b.get('amount', 0) for b in budget if 
                               b.get('type') == 'spending' and 
                               b.get('timestamp', '').startswith(current_month)])
        
        budget_table = ""
        for entry in sorted(budget, key=lambda x: x.get('timestamp', ''), reverse=True)[:50]:
            amount_str = f"${entry.get('amount', 0):.2f}"
            if entry.get('type') == 'deposit':
                amount_str = f"+{amount_str}"
            elif entry.get('type') in ['withdrawal', 'spending']:
                amount_str = f"-{amount_str}"
                
            budget_table += f"""
            <tr>
                <td>{entry.get('timestamp', 'N/A')}</td>
                <td>{entry.get('type', 'N/A')}</td>
                <td>{entry.get('service', 'General')}</td>
                <td>{amount_str}</td>
                <td>{entry.get('description', '')}</td>
            </tr>
            """

        content = f"""
        <div class="stats-grid" style="margin-bottom: 2rem;">
            <div class="stat-card">
                <span class="stat-number">${total_balance:.2f}</span>
                <div class="stat-label">Total Balance</div>
            </div>
            <div class="stat-card">
                <span class="stat-number">${monthly_spending:.2f}</span>
                <div class="stat-label">Monthly Spending</div>
            </div>
        </div>

        <div class="card">
            <div class="card-header">Budget Management</div>
            
            <form method="POST" style="margin-bottom: 2rem;">
                <div class="form-group">
                    <label>Type:</label>
                    <select name="type" required>
                        <option value="deposit">Deposit</option>
                        <option value="withdrawal">Withdrawal</option>
                        <option value="spending">Spending</option>
                    </select>
                </div>
                <div class="form-group">
                    <label>Service:</label>
                    <input type="text" name="service" placeholder="General">
                </div>
                <div class="form-group">
                    <label>Amount ($):</label>
                    <input type="number" step="0.01" name="amount" required>
                </div>
                <div class="form-group">
                    <label>Description:</label>
                    <input type="text" name="description">
                </div>
                <input type="hidden" name="action" value="add">
                <button type="submit" class="btn">Add Entry</button>
            </form>

            <table>
                <thead>
                    <tr>
                        <th>Date</th>
                        <th>Type</th>
                        <th>Service</th>
                        <th>Amount</th>
                        <th>Description</th>
                    </tr>
                </thead>
                <tbody>
                    {budget_table}
                </tbody>
            </table>
        </div>
        """

        html = self.get_base_template("Budget", content)
        self.send_response(200)
        self.send_header('Content-type', 'text/html')
        self.end_headers()
        self.wfile.write(html.encode())

    def serve_activity(self):
        activity = self.load_data('activity.json')
        
        activity_list = ""
        for entry in activity:
            activity_list += f"""
            <div class="activity-entry">
                <div class="activity-timestamp">{entry.get('timestamp', 'N/A')}</div>
                <div class="activity-action">{entry.get('action', 'N/A')}</div>
                <div>{entry.get('details', '')}</div>
            </div>
            """

        content = f"""
        <div class="card">
            <div class="card-header">Activity Log</div>
            {activity_list if activity_list else '<p>No activity recorded yet.</p>'}
        </div>
        """

        html = self.get_base_template("Activity", content)
        self.send_response(200)
        self.send_header('Content-type', 'text/html')
        self.end_headers()
        self.wfile.write(html.encode())

    def serve_todos(self):
        todos = self.load_data('todos.json')
        pending = [t for t in todos if t.get('status') == 'pending']
        done = [t for t in todos if t.get('status') == 'done']

        priority_colors = {'high': '#f85149', 'medium': '#d29922', 'low': '#8b949e'}
        category_icons = {'dns': '🌐', 'account': '🔑', 'config': '⚙️', 'install': '📦', 'other': '📋'}

        pending_html = ""
        for i, t in enumerate(pending):
            pc = priority_colors.get(t.get('priority', 'medium'), '#d29922')
            icon = category_icons.get(t.get('category', 'other'), '📋')
            steps = ""
            if t.get('steps'):
                steps_list = "".join(f"<li>{s}</li>" for s in t['steps'])
                steps = f'<div style="margin-top:8px;color:#8b949e;font-size:0.9em;"><strong>Steps:</strong><ol style="margin:4px 0 0 20px;">{steps_list}</ol></div>'
            pending_html += f"""
            <div class="card" style="border-left: 3px solid {pc};">
                <div style="display:flex;justify-content:space-between;align-items:center;">
                    <div>
                        <span style="font-size:1.2em;">{icon}</span>
                        <strong style="color:#f0f6fc;">{t.get('title','Untitled')}</strong>
                        <span style="color:{pc};font-size:0.8em;margin-left:8px;">● {t.get('priority','medium').upper()}</span>
                    </div>
                    <form method="POST" style="display:inline;">
                        <input type="hidden" name="action" value="complete">
                        <input type="hidden" name="index" value="{i}">
                        <button type="submit" class="btn" style="background:#238636;">✓ Done</button>
                    </form>
                </div>
                <div style="color:#c9d1d9;margin-top:6px;">{t.get('description','')}</div>
                {steps}
                <div style="color:#484f58;font-size:0.8em;margin-top:8px;">Added {t.get('created','?')} by {t.get('source','unknown')}</div>
            </div>"""

        done_html = ""
        for t in done[:10]:
            done_html += f"""
            <div style="padding:8px 12px;border-bottom:1px solid #21262d;color:#484f58;">
                <span style="text-decoration:line-through;">{t.get('title','')}</span>
                <span style="float:right;font-size:0.8em;">completed {t.get('completed','')}</span>
            </div>"""

        content = f"""
        <div class="stats-grid">
            <div class="stat-card">
                <span class="stat-number" style="color:#f85149;">{len(pending)}</span>
                <div class="stat-label">Pending Actions</div>
            </div>
            <div class="stat-card">
                <span class="stat-number" style="color:#40c463;">{len(done)}</span>
                <div class="stat-label">Completed</div>
            </div>
        </div>

        <div class="card">
            <div class="card-header" style="color:#f85149;">⚡ Action Required</div>
            {pending_html if pending_html else '<p style="color:#484f58;">Nothing pending — all clear! 🎉</p>'}
        </div>

        <div class="card">
            <div class="card-header">Recently Completed</div>
            {done_html if done_html else '<p style="color:#484f58;">Nothing completed yet.</p>'}
        </div>
        """

        html = self.get_base_template("Action Required", content)
        self.send_response(200)
        self.send_header('Content-type', 'text/html')
        self.end_headers()
        self.wfile.write(html.encode())

    def handle_todos_post(self, form_data):
        action = form_data.get('action', [''])[0]
        todos = self.load_data('todos.json')

        if action == 'complete':
            idx = int(form_data.get('index', ['0'])[0])
            pending = [t for t in todos if t.get('status') == 'pending']
            if 0 <= idx < len(pending):
                target = pending[idx]
                target['status'] = 'done'
                target['completed'] = datetime.now().strftime('%Y-%m-%d %H:%M')
                self.save_data('todos.json', todos)
                self.log_activity("Todo Completed", target.get('title', ''))

        self.send_response(302)
        self.send_header('Location', '/todos')
        self.end_headers()

    def handle_accounts_post(self, form_data):
        if form_data.get('action', [''])[0] == 'add':
            accounts = self.load_data('accounts.json')
            new_account = {
                "service": form_data.get('service', [''])[0],
                "url": form_data.get('url', [''])[0],
                "username": form_data.get('username', [''])[0],
                "status": form_data.get('status', ['active'])[0],
                "notes": form_data.get('notes', [''])[0],
                "created": datetime.now().isoformat(),
                "last_accessed": "Never"
            }
            accounts.append(new_account)
            self.save_data('accounts.json', accounts)
            self.log_activity("Account Added", f"Added {new_account['service']}")

        # Redirect back to accounts page
        self.send_response(302)
        self.send_header('Location', '/accounts')
        self.end_headers()

    def handle_api_keys_post(self, form_data):
        if form_data.get('action', [''])[0] == 'add':
            api_keys = self.load_data('api-keys.json')
            new_key = {
                "service": form_data.get('service', [''])[0],
                "name": form_data.get('name', [''])[0],
                "key": form_data.get('key', [''])[0],
                "created": datetime.now().strftime('%Y-%m-%d'),
                "expires": form_data.get('expires', ['Never'])[0] or "Never",
                "usage": 0
            }
            api_keys.append(new_key)
            self.save_data('api-keys.json', api_keys)
            self.log_activity("API Key Added", f"Added key for {new_key['service']}")

        # Redirect back to api-keys page
        self.send_response(302)
        self.send_header('Location', '/api-keys')
        self.end_headers()

    def handle_budget_post(self, form_data):
        if form_data.get('action', [''])[0] == 'add':
            budget = self.load_data('budget.json')
            new_entry = {
                "type": form_data.get('type', [''])[0],
                "service": form_data.get('service', ['General'])[0] or "General",
                "amount": float(form_data.get('amount', ['0'])[0]),
                "description": form_data.get('description', [''])[0],
                "timestamp": datetime.now().isoformat()
            }
            budget.append(new_entry)
            self.save_data('budget.json', budget)
            self.log_activity("Budget Entry Added", f"{new_entry['type']} of ${new_entry['amount']:.2f}")

        # Redirect back to budget page
        self.send_response(302)
        self.send_header('Location', '/budget')
        self.end_headers()

    def log_message(self, format, *args):
        """Override to reduce logging noise"""
        pass


def initialize_data():
    """Pre-populate with known accounts and services"""
    data_dir = "/home/wdjones/.openclaw/workspace/projects/control-panel/data"
    os.makedirs(data_dir, exist_ok=True)
    
    # Pre-populate accounts
    accounts_file = os.path.join(data_dir, "accounts.json")
    if not os.path.exists(accounts_file):
        initial_accounts = [
            {
                "service": "ProtonMail",
                "url": "https://mail.proton.me",
                "username": "case-lgn@protonmail.com",
                "status": "active",
                "notes": "Primary email account",
                "created": datetime.now().isoformat(),
                "last_accessed": "Never"
            },
            {
                "service": "Polymarket",
                "url": "https://polymarket.com",
                "username": "",
                "status": "inactive",
                "notes": "Not yet registered",
                "created": datetime.now().isoformat(),
                "last_accessed": "Never"
            },
            {
                "service": "Feed Hunter Portal",
                "url": "http://localhost:8888",
                "username": "",
                "status": "active",
                "notes": "Local service",
                "created": datetime.now().isoformat(),
                "last_accessed": "Never"
            },
            {
                "service": "Chrome Debug",
                "url": "http://localhost:9222",
                "username": "",
                "status": "active",
                "notes": "Browser debugging interface",
                "created": datetime.now().isoformat(),
                "last_accessed": "Never"
            },
            {
                "service": "OpenClaw Gateway",
                "url": "http://localhost:18789",
                "username": "",
                "status": "active",
                "notes": "OpenClaw main service",
                "created": datetime.now().isoformat(),
                "last_accessed": "Never"
            }
        ]
        
        with open(accounts_file, 'w') as f:
            json.dump(initial_accounts, f, indent=2)
    
    # Initialize empty files if they don't exist
    for filename in ["api-keys.json", "budget.json", "activity.json"]:
        filepath = os.path.join(data_dir, filename)
        if not os.path.exists(filepath):
            with open(filepath, 'w') as f:
                json.dump([], f)


def main():
    initialize_data()
    
    server_address = ('0.0.0.0', 8000)
    httpd = ThreadedHTTPServer(server_address, ControlPanelHandler)
    
    print(f"🖤 Case Control Panel starting on http://0.0.0.0:8000")
    print("Press Ctrl+C to stop")
    
    try:
        httpd.serve_forever()
    except KeyboardInterrupt:
        print("\nShutting down...")
        httpd.shutdown()
        sys.exit(0)


if __name__ == '__main__':
    main()