/**
 * Cliente API — Datos fiscales del emisor (una configuración por empresa).
 */
import { api } from '$lib/api';
import type { SatTaxRegime } from './catalogs';

/** RFC de persona moral (3 letras) o física (4 letras) + fecha + homoclave. */
export const RFC_REGEX = /^[A-ZÑ&]{3,4}\d{6}[A-Z0-9]{3}$/;

export interface IssuerSettings {
	id: number;
	tenant_id: number;
	company_id: number;
	legal_name: string;
	rfc: string;
	tax_regime_id: number;
	tax_regime: SatTaxRegime | null;
	zip_code: string | null;
	updated_by: string | null;
	created_at: string;
	updated_at: string;
	// ----- Estado del CSD -----
	// El backend expone si hay certificado y cuál, nunca su contenido ni la contraseña.
	csd_cert_number: string | null;
	csd_uploaded_at: string | null;
	has_csd: boolean;
}

export interface IssuerSettingsInput {
	legal_name: string;
	rfc: string;
	tax_regime_id: number;
	zip_code?: string | null;
}

export const issuerAPI = {
	/**
	 * Devuelve `null` cuando la empresa todavía no captura sus datos fiscales: el
	 * backend responde 404 y la pantalla debe abrirse en modo alta, no en error.
	 */
	async get(companyId: number): Promise<IssuerSettings | null> {
		const res = await api.get<IssuerSettings>(`/v1/fin/settings/issuer?company_id=${companyId}`);
		if (res.status === 404) return null;
		if (res.error) throw new Error(res.error);
		return res.data!;
	},

	async save(data: IssuerSettingsInput, companyId: number): Promise<IssuerSettings> {
		const res = await api.put<IssuerSettings>(
			`/v1/fin/settings/issuer?company_id=${companyId}`,
			data
		);
		if (res.error) throw new Error(res.error);
		return res.data!;
	},

	/**
	 * Sube el par del CSD y su contraseña. El backend valida que la llave corresponda al
	 * certificado antes de guardar nada, y la contraseña queda cifrada: no vuelve a salir.
	 */
	async uploadCsd(
		cer: File,
		key: File,
		password: string,
		companyId: number
	): Promise<IssuerSettings> {
		const fd = new FormData();
		fd.append('cer', cer);
		fd.append('key', key);
		fd.append('password', password);
		const res = await api.request<IssuerSettings>(
			`/v1/fin/settings/issuer/csd?company_id=${companyId}`,
			{ method: 'POST', body: fd }
		);
		if (res.error) throw new Error(typeof res.error === 'string' ? res.error : 'No se pudo cargar el CSD');
		return res.data!;
	},

	/** Desvincula el CSD y borra sus archivos del almacenamiento. */
	async deleteCsd(companyId: number): Promise<IssuerSettings> {
		const res = await api.delete<IssuerSettings>(
			`/v1/fin/settings/issuer/csd?company_id=${companyId}`
		);
		if (res.error) throw new Error(typeof res.error === 'string' ? res.error : 'No se pudo quitar el CSD');
		return res.data!;
	}
};
