import { App, Editor, MarkdownView, Modal, Notice, Plugin, PluginSettingTab, Setting, ItemView, WorkspaceLeaf } from 'obsidian';
import { EventBus } from './src/utils/EventBus';
import { GraphView, GRAPH_VIEW_TYPE } from './src/views/GraphView';
import { ChatView, CHAT_VIEW_TYPE } from './src/views/ChatView';

import 'src/css/styles.css'; // Путь к твоему новому CSS файлу

// ----------------------------------------------- Settings ---------------------------------------------------------------

interface LLMAgentSettings {
	apiBaseUrl: string;
	systemPrompt: string;
}

const DEFAULT_SETTINGS: LLMAgentSettings = {
	apiBaseUrl: 'http://localhost:5000/api',
	systemPrompt: 'Ты полезный ИИ ассистент.',
};

// ----------------------------------------------- Main Plugin Class ---------------------------------------------------------------

export default class LLMAgentPlugin extends Plugin {
	settings: LLMAgentSettings;
	eventBus: EventBus;

	async onload() {
		await this.loadSettings();

		this.eventBus = new EventBus();

		// Регистрируем кастомные views
		this.registerView(GRAPH_VIEW_TYPE, (leaf) => new GraphView(leaf, this));
		this.registerView(CHAT_VIEW_TYPE, (leaf) => new ChatView(leaf, this));

		// Добавляем команды
		this.addCommand({
			id: 'open-llm-agent-graph',
			name: 'Открыть граф диалогов LLM Agent',
			callback: () => this.activateGraphView()
		});

		this.addCommand({
			id: 'open-llm-agent-chat',
			name: 'Открыть чат LLM Agent',
			callback: () => this.activateChatView()
		});

		this.addCommand({
			id: 'new-llm-agent-chat',
			name: 'Новый чат LLM Agent',
			callback: () => this.handleNewChat()
		});

		// Добавляем иконку в ribbon
		this.addRibbonIcon('brain-circuit', 'LLM Agent', () => {
			this.activateGraphView();
			this.activateChatView();
		});

		console.log('LLM Agent plugin загружен');

		// This adds a settings tab so the user can configure various aspects of the plugin
		this.addSettingTab(new SampleSettingTab(this.app, this));
	}

	onunload() {
		console.log('LLM Agent plugin выгружен');
	}

	// ----------------------------------------------- Settings Management ---------------------------------------------------------------

	async loadSettings() {
		this.settings = Object.assign({}, DEFAULT_SETTINGS, await this.loadData());
	}

	async saveSettings() {
		await this.saveData(this.settings);
	}

	// ----------------------------------------------- View Management ---------------------------------------------------------------

	async activateGraphView() {
		const existingLeaf = this.app.workspace.getLeavesOfType(GRAPH_VIEW_TYPE)[0];
		if (existingLeaf) {
			this.app.workspace.revealLeaf(existingLeaf);
		} else {
			await this.app.workspace.getLeaf('tab').setViewState({
				type: GRAPH_VIEW_TYPE,
				active: true
			});
		}
	}

	async activateChatView() {
		const existingLeaf = this.app.workspace.getLeavesOfType(CHAT_VIEW_TYPE)[0];
		if (existingLeaf) {
			this.app.workspace.revealLeaf(existingLeaf);
		} else {
			const rightLeaf = this.app.workspace.getRightLeaf(false);
			if (rightLeaf) {
				await rightLeaf.setViewState({
					type: CHAT_VIEW_TYPE,
					active: true
				});
			}
		}
	}

	// ----------------------------------------------- Event Handlers ---------------------------------------------------------------

	handleNewChat() {
		this.eventBus.emit('new-chat');
	}
}

// ----------------------------------------------- Sample Setting Tab ---------------------------------------------------------------

class SampleSettingTab extends PluginSettingTab {
	plugin: LLMAgentPlugin;

	constructor(app: App, plugin: LLMAgentPlugin) {
		super(app, plugin);
		this.plugin = plugin;
	}

	display(): void {
		const { containerEl } = this;

		containerEl.empty();

		new Setting(containerEl)
			.setName('API Base URL')
			.setDesc('Базовый URL для API LLM Agent')
			.addText((text) =>
				text
					.setPlaceholder('Введите URL')
					.setValue(this.plugin.settings.apiBaseUrl)
					.onChange(async (value) => {
						this.plugin.settings.apiBaseUrl = value;
						await this.plugin.saveSettings();
					})
			);

		// Новое поле для системного промпта
		new Setting(containerEl)
			.setName('Системный промпт')
			.setDesc('Этот промпт будет отправляться LLM перед каждым диалогом.')
			.addTextArea((text) =>
				text
					.setPlaceholder('Ты полезный ИИ ассистент.')
					.setValue(this.plugin.settings.systemPrompt)
					.onChange(async (value) => {
						this.plugin.settings.systemPrompt = value;
						await this.plugin.saveSettings();
					})
			);
	}
}
