import { Injectable, Logger } from '@nestjs/common';
import { PrismaService } from 'src/prisma/prisma.service';
import { normalizarTextoAlias } from '../normalizadores/libro-compras-set.normalizador';

export type TipoEntidadProveedor = 'PROVEEDOR_LOCAL' | 'PROVEEDOR_EXTERIOR' | 'ACREEDOR_VARIO';

export interface ResolverProveedorResult {
  proveedorId: string;
  creado: boolean;
}

/**
 * Resuelve un proveedor por RUC para el importador de Gastos desde Excel.
 *
 * Autocontenido a propósito: no se reutiliza/toca `MarangatuSyncService` (que
 * tiene una lógica equivalente para su propio flujo) para no acoplar este
 * módulo a la integración con el bot del SET ni arriesgar regresión en una
 * pestaña que ya funciona en producción.
 */
@Injectable()
export class ProveedorResolverService {
  private readonly logger = new Logger(ProveedorResolverService.name);

  constructor(private readonly prisma: PrismaService) {}

  async findOrCreateProveedor(
    empresaId: string,
    ruc: string,
    razonSocial: string,
    opts?: { tipoEntidad?: TipoEntidadProveedor; esExtranjero?: boolean; origen?: string },
  ): Promise<ResolverProveedorResult> {
    let persona = ruc
      ? await this.prisma.personas.findFirst({ where: { empresa_id: empresaId, ruc, deleted: false } })
      : null;

    if (!persona && razonSocial) {
      persona = await this.prisma.personas.findFirst({
        where: { empresa_id: empresaId, razon_social: { equals: razonSocial, mode: 'insensitive' }, deleted: false },
      });
    }

    if (!persona) {
      persona = await this.prisma.personas.create({
        data: { empresa_id: empresaId, razon_social: razonSocial, ruc: ruc || null, active: true, deleted: false },
      });
    }

    let proveedor = await this.prisma.proveedores.findFirst({
      where: { empresa_id: empresaId, persona_id: persona.id },
    });

    if (proveedor) {
      return { proveedorId: proveedor.id, creado: false };
    }

    proveedor = await this.prisma.proveedores.create({
      data: {
        empresa_id: empresaId,
        persona_id: persona.id,
        activo: true,
        tipo_entidad: opts?.tipoEntidad ?? 'PROVEEDOR_LOCAL',
        es_extranjero: opts?.esExtranjero ?? false,
        observaciones: `Creado automáticamente · ${opts?.origen ?? 'importación de Gastos desde Excel'}`,
      },
    });
    this.logger.log(`Proveedor creado: ${razonSocial} (RUC ${ruc || 's/d'})`);
    return { proveedorId: proveedor.id, creado: true };
  }

  /** Mapea el texto de "CONTRAPARTIDA PASIVA" del Libro de Compras a tipo_entidad del proveedor. */
  resolverTipoEntidad(contrapartidaPasiva: string): { tipoEntidad: TipoEntidadProveedor; esExtranjero: boolean } {
    const normalizado = normalizarTextoAlias(contrapartidaPasiva);
    if (normalizado.includes('ACREEDOR')) {
      return { tipoEntidad: 'ACREEDOR_VARIO', esExtranjero: false };
    }
    if (normalizado.includes('EXTERIOR')) {
      return { tipoEntidad: 'PROVEEDOR_EXTERIOR', esExtranjero: true };
    }
    return { tipoEntidad: 'PROVEEDOR_LOCAL', esExtranjero: false };
  }
}
