import { describe, it, expect } from 'vitest';
import {
	slugifyTenantName,
	validateTenantForm,
	hubErrorMessage,
	isForbiddenStatus,
	TENANT_SLUG_RE
} from './workspace-provision.shared';

describe('slugifyTenantName', () => {
	it('convierte nombre con acentos y espacios a slug válido', () => {
		const slug = slugifyTenantName('Logística Peña & Cía S.A. de C.V.');
		expect(slug).toBe('logistica-pena-cia-s-a-de-c-v');
		expect(TENANT_SLUG_RE.test(slug)).toBe(true);
	});

	it('quita guiones al inicio y al final', () => {
		expect(slugifyTenantName('  --Hola--  ')).toBe('hola');
	});

	it('cadena sin caracteres válidos da string vacío', () => {
		expect(slugifyTenantName('!!!')).toBe('');
	});
});

describe('validateTenantForm', () => {
	it('acepta datos válidos', () => {
		expect(
			validateTenantForm({ name: 'Empresa ABC', slug: 'empresa-abc', contact_email: 'a@b.com' })
		).toBeNull();
	});

	it('rechaza nombre demasiado corto', () => {
		expect(
			validateTenantForm({ name: 'A', slug: 'a-b', contact_email: 'a@b.com' })
		).toMatch(/al menos 2/);
	});

	it('rechaza slug con mayúsculas o espacios', () => {
		expect(
			validateTenantForm({ name: 'Empresa ABC', slug: 'Empresa ABC', contact_email: 'a@b.com' })
		).toMatch(/slug/i);
	});

	it('rechaza email inválido', () => {
		expect(
			validateTenantForm({ name: 'Empresa ABC', slug: 'empresa-abc', contact_email: 'no-email' })
		).toMatch(/email/i);
	});
});

describe('hubErrorMessage', () => {
	it('devuelve el detail string tal cual', () => {
		expect(hubErrorMessage({ detail: 'Slug ya existe' }, 409)).toBe('Slug ya existe');
	});

	it('formatea el primer error de validación de Pydantic', () => {
		const body = { detail: [{ loc: ['body', 'contact_email'], msg: 'value is not a valid email' }] };
		expect(hubErrorMessage(body, 422)).toBe('contact_email: value is not a valid email');
	});

	it('mensaje de permisos ante 403 sin detail', () => {
		expect(hubErrorMessage(null, 403)).toMatch(/permisos/i);
	});

	it('mensaje genérico con status ante cuerpo desconocido', () => {
		expect(hubErrorMessage(null, 500)).toMatch(/500/);
	});
});

describe('isForbiddenStatus', () => {
	it('true para 401 y 403', () => {
		expect(isForbiddenStatus(401)).toBe(true);
		expect(isForbiddenStatus(403)).toBe(true);
	});
	it('false para otros', () => {
		expect(isForbiddenStatus(422)).toBe(false);
		expect(isForbiddenStatus(200)).toBe(false);
	});
});
