/**
 * Pinia store for Stufen state management.
 *
 * Handles fetching and CRUD operations against the
 * /api/v1/stufen REST API.
 *
 * Part of Issue #32.
 */
import { defineStore } from 'pinia'
import axios from '@nextcloud/axios'
import { generateUrl } from '@nextcloud/router'

export const useStufenStore = defineStore('stufen', {
	state: () => ({
		/** @type {Array} List of Stufen */
		stufen: [],
		/** @type {boolean} Loading state */
		loading: false,
		/** @type {string|null} Error message */
		error: null,
	}),

	actions: {
		/**
		 * Fetch all Stufen.
		 */
		async fetchStufen() {
			this.loading = true
			this.error = null

			try {
				const url = generateUrl('/apps/mitgliederverwaltung/api/v1/stufen')
				const response = await axios.get(url)
				this.stufen = response.data
			} catch (err) {
				this.error = err.response?.data?.error || 'Fehler beim Laden der Stufen'
				console.error('Failed to fetch Stufen:', err)
			} finally {
				this.loading = false
			}
		},

		/**
		 * Create a new Stufe.
		 */
		async createStufe(data) {
			this.loading = true
			this.error = null

			try {
				const url = generateUrl('/apps/mitgliederverwaltung/api/v1/stufen')
				const response = await axios.post(url, data)
				this.stufen.push(response.data)
				this.sortStufen()
				return response.data
			} catch (err) {
				this.error = err.response?.data?.error || 'Fehler beim Erstellen der Stufe'
				throw err
			} finally {
				this.loading = false
			}
		},

		/**
		 * Update an existing Stufe.
		 */
		async updateStufe(id, data) {
			this.loading = true
			this.error = null

			try {
				const url = generateUrl(`/apps/mitgliederverwaltung/api/v1/stufen/${id}`)
				const response = await axios.put(url, data)
				const index = this.stufen.findIndex(s => s.id === id)
				if (index !== -1) {
					this.stufen[index] = response.data
				}
				this.sortStufen()
				return response.data
			} catch (err) {
				this.error = err.response?.data?.error || 'Fehler beim Aktualisieren der Stufe'
				throw err
			} finally {
				this.loading = false
			}
		},

		/**
		 * Delete a Stufe.
		 */
		async deleteStufe(id) {
			this.loading = true
			this.error = null

			try {
				const url = generateUrl(`/apps/mitgliederverwaltung/api/v1/stufen/${id}`)
				await axios.delete(url)
				this.stufen = this.stufen.filter(s => s.id !== id)
			} catch (err) {
				this.error = err.response?.data?.error || 'Fehler beim Löschen der Stufe'
				throw err
			} finally {
				this.loading = false
			}
		},

		/**
		 * Reorder Stufen by updating sortOrder for each.
		 */
		async reorderStufen(orderedIds) {
			this.error = null

			try {
				for (let i = 0; i < orderedIds.length; i++) {
					const id = orderedIds[i]
					const url = generateUrl(`/apps/mitgliederverwaltung/api/v1/stufen/${id}`)
					await axios.put(url, { sortOrder: i })
					const stufe = this.stufen.find(s => s.id === id)
					if (stufe) {
						stufe.sortOrder = i
					}
				}
				this.sortStufen()
			} catch (err) {
				this.error = err.response?.data?.error || 'Fehler beim Neuordnen der Stufen'
				throw err
			}
		},

		/**
		 * Sort Stufen by sortOrder locally.
		 */
		sortStufen() {
			this.stufen.sort((a, b) => (a.sortOrder ?? 0) - (b.sortOrder ?? 0))
		},

		clearError() {
			this.error = null
		},
	},
})
