import axios from 'axios'

const api = axios.create({ baseURL: '/api', withCredentials: true })

api.interceptors.response.use(r => r, err => {
  // Não dispara app:logout na checagem inicial de auth (/me no startup)
  // para evitar flicker ou redirecionamentos quando o usuário simplesmente não está logado.
  // Apenas chamadas autenticadas subsequentes devem acionar o logout global.
  if (err.response?.status === 401 && !(err.config as any)._skipLogout) {
    window.dispatchEvent(new CustomEvent('app:logout'))
  }
  return Promise.reject(err)
})

export default api

// ── Auth ──────────────────────────────────────────────────────────────────────

export const AuthAPI = {
  login: (email: string, password: string) =>
    api.post('/login', { email, password }).then(r => r.data),
  loginLegacy: (cpf: string, telefone: string) =>
    api.post('/login', { cpf, telefone }).then(r => r.data),
  register: (data: { nome: string; email: string; cpf: string; telefone: string; password: string }) =>
    api.post('/register', data).then(r => r.data),
  forgotPassword: (email: string) =>
    api.post('/auth/forgot-password', { email }).then(r => r.data),
  resetPassword: (token: string, password: string) =>
    api.post('/auth/reset-password', { token, password }).then(r => r.data),
  /** Só faz a requisição se o cookie hint _usr=1 estiver presente.
   *  Evita um 401 desnecessário no console quando o usuário não está logado. */
  getMe: () => {
    const hasSession = document.cookie.split(';').some(c => c.trim().startsWith('_usr='))
    if (!hasSession) return Promise.resolve(null)
    return api.get('/me', { _skipLogout: true } as any).then(r => r.data)
  },
  updateOptin: (whatsapp_optin: boolean) =>
    api.patch('/me/optin', { whatsapp_optin }).then(r => r.data),
  updateMe: (data: { nome: string; email?: string; telefone?: string }) =>
    api.patch('/me', data).then(r => r.data),
  getNotifications: () =>
    api.get('/my-notifications').then(r => r.data) as Promise<{ unread: number; notifications: any[] }>,
  markNotificationRead: (id: number) =>
    api.put(`/my-notifications/${id}/read`).then(r => r.data),
}

// ── Raffles ───────────────────────────────────────────────────────────────────

export const RaffleAPI = {
  list: () => api.get('/raffle').then(r => r.data),
  get: (id: number) => api.get(`/raffle/${id}`).then(r => r.data),
  // Returns array of ticket objects; extract sold/reserved numbers from them
  getTickets: (id: number) =>
    api.get(`/raffle/${id}/tickets`).then(r =>
      (r.data as Array<{ numero: number; status: string }>)
        .filter(t => t.status === 'sold' || t.status === 'reserved')
        .map(t => Number(t.numero))
    ),
  buyTicket: (data: {
    raffle_id: number; numero: number[];
    usuario_nome: string; usuario_cpf: string; usuario_telefone: string; usuario_email?: string
  }) => api.post('/raffle/ticket', data).then(r => r.data),
  getOrderStatus: (orderId: number) =>
    api.get(`/raffle/order/${orderId}/status`).then(r => r.data),
  myTickets: () => api.get('/raffle/my-tickets').then(r => r.data),
  getDiscounts: (id: number) =>
    api.get(`/raffle/${id}/discounts`).then(r => r.data as Array<{ id: number; min_qty: number; discount_pct: number; active: boolean }>),
  getFlashPromo: (id: number) =>
    api.get(`/raffle/${id}/flash-promo`).then(r => r.data as { id: number; discount_pct: number; label: string; ends_at: string } | null),
  getResult: (id: number) =>
    api.get(`/raffle/${id}/result`).then(r => r.data as { winner_number: number; usuario_nome: string; created_at: string } | null).catch(() => null),
}

// ── Promotions ────────────────────────────────────────────────────────────────

export const PromoAPI = {
  list: () => api.get('/promotions').then(r => r.data),
}

// ── Produtos (catálogo público) ───────────────────────────────────────────────

export const ProdutoClienteAPI = {
  list: (params?: { search?: string; categoria?: string; page?: number; limit?: number }) =>
    api.get('/produtos', { params }).then(r => r.data) as Promise<any[]>,
  categorias: () => api.get('/produtos/categorias').then(r => r.data) as Promise<string[]>,
  get: (id: number) => api.get(`/produtos/${id}`).then(r => r.data),
}

// ── Cotações (área do cliente autenticado) ────────────────────────────────────

export const CotacaoClienteAPI = {
  /** Retorna o rascunho aberto ou cria um novo */
  carrinho: () =>
    api.get('/cotacoes/carrinho').then(r => r.data),
  /** Lista cotações salvas do usuário */
  minhas: () =>
    api.get('/cotacoes/minhas').then(r => r.data) as Promise<any[]>,
  /** Detalhe de uma cotação */
  get: (id: number) =>
    api.get(`/cotacoes/${id}`).then(r => r.data),
  /** Adiciona item ao carrinho */
  addItem: (cotacaoId: number, produtoId: number, quantidade: number) =>
    api.post('/cotacoes/itens', { cotacao_id: cotacaoId, produto_id: produtoId, quantidade }).then(r => r.data),
  /** Remove item do carrinho */
  removeItem: (cotacaoId: number, itemId: number) =>
    api.delete(`/cotacoes/${cotacaoId}/itens/${itemId}`).then(r => r.data),
  /** Atualiza observação de um item */
  updateItemObs: (cotacaoId: number, itemId: number, observacao: string) =>
    api.patch(`/cotacoes/${cotacaoId}/itens/${itemId}`, { observacao }).then(r => r.data),
  /** Cliente confirma substituição de item com alerta */
  confirmarAlerta: (itemId: number) =>
    api.patch(`/cotacoes/pedido-itens/${itemId}/confirmar`, {}).then(r => r.data),
  /** Salva cotação (sem finalizar) */
  salvar: (id: number) =>
    api.patch(`/cotacoes/${id}/salvar`).then(r => r.data),
  /** Finaliza cotação gerando pedido */
  finalizar: (id: number, data: {
    forma_pagto: string; endereco_id?: number; tipo_entrega?: string; observacao?: string
  }) => api.post(`/cotacoes/${id}/finalizar`, data).then(r => r.data),
  /** Promoção relâmpago ativa no checkout */
  flashPromo: () => api.get('/cotacoes/flash-promo').then(r => r.data) as Promise<{
    id: number; discount_pct: number; label: string; ends_at: string;
    produto_nome?: string; produto_sku?: string;
  } | null>,
}

// ── Clubs ─────────────────────────────────────────────────────────────────────

// ── Jobs ──────────────────────────────────────────────────────────────────────

export const JobsAPI = {
  list: (params?: Record<string, any>) =>
    api.get('/jobs', { params }).then(r => r.data) as Promise<{ jobs: any[]; total: number }>,
  get: (id: number) =>
    api.get(`/jobs/${id}`).then(r => r.data),
  apply: (id: number, data: {
    applicant_cpf: string; applicant_nome: string;
    applicant_phone?: string; applicant_email?: string;
    cover_letter?: string; resume_id?: number;
  }) => api.post(`/jobs/${id}/apply`, data).then(r => r.data),
  myResume: () => api.get('/user/resume').then(r => r.data),
  saveResume: (data: any) => api.put('/user/resume', data).then(r => r.data),
  myApplications: () => api.get('/user/applications').then(r => r.data) as Promise<any[]>,
  cancelApplication: (id: number) =>
    api.delete(`/user/applications/${id}`).then(r => r.data),
}

// ── Pedidos Recorrentes (FUT-02) ──────────────────────────────────────────────

export const RecorrentesAPI = {
  list: () => api.get('/recorrentes').then(r => r.data) as Promise<any[]>,
  create: (data: {
    nome: string; itens: any[]; frequencia: string; proximo_em: string; cliente_id?: number
  }) => api.post('/recorrentes', data).then(r => r.data),
  update: (id: number, data: any) => api.put(`/recorrentes/${id}`, data).then(r => r.data),
  togglePausa: (id: number) => api.patch(`/recorrentes/${id}/pausa`).then(r => r.data) as Promise<{ pausado: boolean }>,
  remove: (id: number) => api.delete(`/recorrentes/${id}`).then(r => r.data),
}

// ── Clubs ─────────────────────────────────────────────────────────────────────

export const ClubAPI = {
  list: () => api.get('/clubs').then(r => r.data),
  get: (slug: string) => api.get(`/clubs/${slug}`).then(r => r.data),
  getFaqs: (slug: string) => api.get(`/clubs/${slug}/faqs`).then(r => r.data) as Promise<{ id: number; question: string; answer: string; sort_order: number }[]>,
  subscribe: (slug: string, data: {
    plan_id: number; user_cpf: string; user_nome: string;
    user_telefone?: string; user_email?: string
  }) => api.post(`/clubs/${slug}/subscribe`, data).then(r => r.data),
  getCard: (cpf: string) => api.get(`/clubs/card/${cpf}`).then(r => r.data),
  cancel: (member_id: number) =>
    api.post('/clubs/member/cancel', { member_id }).then(r => r.data),
}
