package ui

import (
	"fmt"
	"fyne.io/fyne/v2"
	"fyne.io/fyne/v2/container"
	"fyne.io/fyne/v2/widget"

	"MobileMkch/cache"
)

type SettingsScreen struct {
	uiManager *UIManager
	content   *fyne.Container
}

func NewSettingsScreen(uiManager *UIManager) *SettingsScreen {
	screen := &SettingsScreen{
		uiManager: uiManager,
		content:   container.NewVBox(),
	}
	screen.setupContent()
	return screen
}

func (ss *SettingsScreen) setupContent() {
	ss.content.RemoveAll()

	contentContainer := container.NewVBox()

	header := widget.NewLabel("Настройки")
	header.TextStyle = fyne.TextStyle{Bold: true}
	contentContainer.Add(header)

	themeLabel := widget.NewLabel("Тема:")
	themeSelect := widget.NewSelect([]string{"Темная", "Светлая"}, func(theme string) {
		if theme == "Темная" {
			ss.uiManager.GetSettings().Theme = "dark"
		} else {
			ss.uiManager.GetSettings().Theme = "light"
		}
		ss.uiManager.SaveSettings()
	})

	if ss.uiManager.GetSettings().Theme == "dark" {
		themeSelect.SetSelected("Темная")
	} else {
		themeSelect.SetSelected("Светлая")
	}

	themeContainer := container.NewHBox(themeLabel, themeSelect)
	contentContainer.Add(themeContainer)

	autoRefreshCheck := widget.NewCheck("Авторефреш", func(checked bool) {
		ss.uiManager.GetSettings().AutoRefresh = checked
		ss.uiManager.SaveSettings()
	})
	autoRefreshCheck.SetChecked(ss.uiManager.GetSettings().AutoRefresh)
	contentContainer.Add(autoRefreshCheck)

	showFilesCheck := widget.NewCheck("Показывать файлы", func(checked bool) {
		ss.uiManager.GetSettings().ShowFiles = checked
		ss.uiManager.SaveSettings()
	})
	showFilesCheck.SetChecked(ss.uiManager.GetSettings().ShowFiles)
	contentContainer.Add(showFilesCheck)

	compactModeCheck := widget.NewCheck("Компактный режим", func(checked bool) {
		ss.uiManager.GetSettings().CompactMode = checked
		ss.uiManager.SaveSettings()
	})
	compactModeCheck.SetChecked(ss.uiManager.GetSettings().CompactMode)
	contentContainer.Add(compactModeCheck)

	pageSizeLabel := widget.NewLabel("Размер страницы:")
	pageSizeSelect := widget.NewSelect([]string{"5", "10", "15", "20"}, func(size string) {
		switch size {
		case "5":
			ss.uiManager.GetSettings().PageSize = 5
		case "10":
			ss.uiManager.GetSettings().PageSize = 10
		case "15":
			ss.uiManager.GetSettings().PageSize = 15
		case "20":
			ss.uiManager.GetSettings().PageSize = 20
		}
		ss.uiManager.SaveSettings()
	})

	currentSize := ss.uiManager.GetSettings().PageSize
	switch currentSize {
	case 5:
		pageSizeSelect.SetSelected("5")
	case 10:
		pageSizeSelect.SetSelected("10")
	case 15:
		pageSizeSelect.SetSelected("15")
	case 20:
		pageSizeSelect.SetSelected("20")
	default:
		pageSizeSelect.SetSelected("10")
	}

	pageSizeContainer := container.NewHBox(pageSizeLabel, pageSizeSelect)
	contentContainer.Add(pageSizeContainer)

	lastBoardLabel := widget.NewLabel("Последняя доска:")
	lastBoardValue := widget.NewLabel(ss.uiManager.GetLastBoard())
	if lastBoardValue.Text == "" {
		lastBoardValue.SetText("Не выбрана")
	}
	lastBoardContainer := container.NewHBox(lastBoardLabel, lastBoardValue)
	contentContainer.Add(lastBoardContainer)

	contentContainer.Add(widget.NewSeparator())

	passcodeHeader := widget.NewLabel("Passcode")
	passcodeHeader.TextStyle = fyne.TextStyle{Bold: true}
	contentContainer.Add(passcodeHeader)

	passcodeEntry := widget.NewEntry()
	passcodeEntry.SetPlaceHolder("Введите passcode для постинга")
	passcodeEntry.Text = ss.uiManager.GetSettings().Passcode
	passcodeEntry.OnChanged = func(text string) {
		ss.uiManager.GetSettings().Passcode = text
		ss.uiManager.SaveSettings()
	}
	contentContainer.Add(passcodeEntry)

	keyHeader := widget.NewLabel("Ключ аутентификации")
	keyHeader.TextStyle = fyne.TextStyle{Bold: true}
	contentContainer.Add(keyHeader)

	keyEntry := widget.NewEntry()
	keyEntry.SetPlaceHolder("Введите ключ для аутентификации")
	keyEntry.Text = ss.uiManager.GetSettings().Key
	keyEntry.OnChanged = func(text string) {
		ss.uiManager.GetSettings().Key = text
		ss.uiManager.SaveSettings()
	}
	contentContainer.Add(keyEntry)

	authButtonsContainer := container.NewHBox()

	testKeyButton := widget.NewButton("Тест ключа", func() {
		key := ss.uiManager.GetSettings().Key
		if key == "" {
			ss.uiManager.ShowError("Ошибка", "Ключ не введен")
			return
		}

		err := ss.uiManager.GetAPIClient().Authenticate(key)
		if err != nil {
			ss.uiManager.ShowError("Ошибка аутентификации", fmt.Sprintf("Не удалось аутентифицироваться: %v", err))
		} else {
			ss.uiManager.ShowInfo("Успех", "Аутентификация по ключу прошла успешно")
		}
	})

	testPasscodeButton := widget.NewButton("Тест passcode", func() {
		passcode := ss.uiManager.GetSettings().Passcode
		if passcode == "" {
			ss.uiManager.ShowError("Ошибка", "Passcode не введен")
			return
		}

		err := ss.uiManager.GetAPIClient().LoginWithPasscode(passcode)
		if err != nil {
			ss.uiManager.ShowError("Ошибка passcode", fmt.Sprintf("Не удалось войти с passcode: %v", err))
		} else {
			ss.uiManager.ShowInfo("Успех", "Вход с passcode прошел успешно")
		}
	})

	authButtonsContainer.Add(testKeyButton)
	authButtonsContainer.Add(testPasscodeButton)
	contentContainer.Add(authButtonsContainer)

	contentContainer.Add(widget.NewSeparator())
	cacheHeader := widget.NewLabel("Управление кэшем")
	cacheHeader.TextStyle = fyne.TextStyle{Bold: true}
	contentContainer.Add(cacheHeader)
	clearBoardsCacheBtn := widget.NewButton("Очистить кэш досок", func() {
		cache.GetCache().Delete("boards")
		ss.uiManager.ShowInfo("Кэш очищен", "Кэш досок очищен")
	})
	contentContainer.Add(clearBoardsCacheBtn)
	clearThreadsCacheBtn := widget.NewButton("Очистить кэш тредов", func() {
		boards, err := ss.uiManager.GetAPIClient().GetBoards()
		if err == nil {
			for _, board := range boards {
				cache.GetCache().Delete("threads_" + board.Code)
			}
		}
		ss.uiManager.ShowInfo("Кэш очищен", "Кэш тредов для всех досок очищен")
	})
	contentContainer.Add(clearThreadsCacheBtn)
	clearThreadDetailsCacheBtn := widget.NewButton("Очистить кэш деталей тредов", func() {
		// Удаляем кэш деталей тредов и комментариев
		// Это более сложно, так как нужно знать ID тредов
		// Пока просто очищаем весь кэш
		cache.GetCache().Clear()
		ss.uiManager.ShowInfo("Кэш очищен", "Кэш деталей тредов очищен")
	})
	contentContainer.Add(clearThreadDetailsCacheBtn)

	clearAllCacheBtn := widget.NewButton("Очистить весь кэш", func() {
		cache.GetCache().Clear()
		ss.uiManager.ShowInfo("Кэш очищен", "Весь кэш очищен")
	})
	contentContainer.Add(clearAllCacheBtn)
	contentContainer.Add(widget.NewSeparator())
	resetHeader := widget.NewLabel("Сброс настроек")
	resetHeader.TextStyle = fyne.TextStyle{Bold: true}
	contentContainer.Add(resetHeader)

	resetButton := widget.NewButton("Сбросить настройки", func() {
		ss.uiManager.GetSettings().Theme = "dark"
		ss.uiManager.GetSettings().AutoRefresh = true
		ss.uiManager.GetSettings().ShowFiles = true
		ss.uiManager.GetSettings().CompactMode = false
		ss.uiManager.GetSettings().LastBoard = ""
		ss.uiManager.GetSettings().PageSize = 10
		ss.uiManager.SaveSettings()
		ss.setupContent() // Перезагружаем интерфейс
	})
	contentContainer.Add(resetButton)

	contentContainer.Add(widget.NewSeparator())

	aboutButton := widget.NewButton("Об аппке", func() {
		ss.uiManager.ShowAbout()
	})
	contentContainer.Add(aboutButton)

	contentContainer.Add(widget.NewSeparator())

	infoButton := widget.NewButton("Я думаю тебя направили сюда)", func() {
		ss.uiManager.ShowInfoDialog()
	})
	contentContainer.Add(infoButton)

	ss.content.Add(contentContainer)
	ss.content.Refresh()
}

func (ss *SettingsScreen) GetContent() fyne.CanvasObject {
	return container.NewScroll(ss.content)
}

func (ss *SettingsScreen) GetTitle() string {
	return "Настройки"
}

func (ss *SettingsScreen) OnShow() {
	ss.setupContent()
}

func (ss *SettingsScreen) OnHide() {
	ss.uiManager.SaveSettings()
}
