import { defineStore } from 'pinia'
import axios from 'axios'
import router from '../router'

interface User {
  id: number
  name: string
  email: string
  phone?: string
  avatar?: string
  is_active: boolean
  roles?: any[]
  permissions?: any[]
}

interface AuthState {
  user: User | null
  token: string | null
  loading: boolean
}

export const useAuthStore = defineStore('auth', {
  state: (): AuthState => ({
    user: null,
    token: localStorage.getItem('auth_token'),
    loading: false
  }),

  getters: {
    isAuthenticated: (state) => !!state.token,
    currentUser: (state) => state.user,
    hasRole: (state) => (role: string) => {
      return state.user?.roles?.some(r => r.name === role) || false
    },
    hasPermission: (state) => (permission: string) => {
      return state.user?.permissions?.some(p => p.name === permission) || false
    }
  },

  actions: {
    async login(credentials: { email: string; password: string }) {
      this.loading = true
      try {
        const response = await axios.post('/auth/login', credentials)
        this.token = response.data.token
        this.user = response.data.user
        localStorage.setItem('auth_token', response.data.token)
        axios.defaults.headers.common['Authorization'] = `Bearer ${response.data.token}`
        router.push('/')
      } catch (error) {
        throw error
      } finally {
        this.loading = false
      }
    },

    async register(data: any) {
      this.loading = true
      try {
        const response = await axios.post('/auth/register', data)
        this.token = response.data.token
        this.user = response.data.user
        localStorage.setItem('auth_token', response.data.token)
        axios.defaults.headers.common['Authorization'] = `Bearer ${response.data.token}`
        router.push('/')
      } catch (error) {
        throw error
      } finally {
        this.loading = false
      }
    },

    async logout() {
      try {
        await axios.post('/auth/logout')
      } catch (error) {
        console.error('Logout error:', error)
      } finally {
        this.user = null
        this.token = null
        localStorage.removeItem('auth_token')
        delete axios.defaults.headers.common['Authorization']
        router.push('/login')
      }
    },

    async fetchUser() {
      try {
        const response = await axios.get('/auth/me')
        this.user = response.data.user
      } catch (error) {
        this.logout()
      }
    },

    async updateProfile(data: any) {
      const response = await axios.put('/auth/profile', data)
      this.user = response.data.user
      return response.data
    }
  }
})
