/* Copyright (C) 2024 Manuel Bustillo*/

import { asArray, getCsrfToken, getSlug } from '@/app/lib/utils';
import { Captcha, StructuredErrors, User } from '@/app/lib/definitions';

export function login({ email, password, onLogin }: { email: string, password: string, onLogin: (user: User) => void }) {
  return fetch(`/api/${getSlug()}/users/sign_in`, {
    method: 'POST',
    body: JSON.stringify({ user: { email, password } }),
    headers: {
      'Accept': 'application/json',
      'Content-Type': 'application/json',
      'X-CSRF-TOKEN': getCsrfToken(),
    }
  })
    .then((response) => response.json())
    .then((data: any) => {
      console.log(data);
      onLogin({
        id: data.id || '',
        email: data.email || '',
      });
    })
    .catch((error) => console.error(error));
}

export function logout({ onLogout }: { onLogout: () => void }) {
  fetch(`/api/${getSlug()}/users/sign_out`, {
    method: 'DELETE',
    headers: {
      'X-CSRF-TOKEN': getCsrfToken(),
    }
  }).then(onLogout)
    .catch((error) => console.error(error));
}

function flattenErrors(errors: StructuredErrors): string[] {
  if(errors instanceof Array) {
    return errors;
  }
  return Object.keys(errors).map((key) => {
    return `${key}: ${asArray(errors[key]).join(', ')}`;
  });
}

export function register({slug, email, password, passwordConfirmation, captcha, onRegister, onError}: {
  slug: string,
  email: string,
  password: string,
  passwordConfirmation: string,
  captcha: Captcha,
  onRegister: () => void,
  onError: (errors: string[]) => void
}){
  fetch(`/api/${slug}/users`, {
    method: 'POST',
    body: JSON.stringify(
      { 
        user: { email, password, password_confirmation: passwordConfirmation },
        captcha: { id: captcha.id, answer: captcha.answer }
      }
    ),
    headers: {
      'Accept': 'application/json',
      'Content-Type': 'application/json',
      'X-CSRF-TOKEN': getCsrfToken(),
    }
  }).then((response) => {
    if(response.ok) {
      response.json().then(onRegister);
    } else {
      response.json().then((data: any) => {
        onError(data.errors && flattenErrors(data.errors) || [data.error]);
      });
    }
  })
}
