import { Injectable } from "@nestjs/common";
import { InsertOnlyRepository } from "../common/insert-only-repository";
import { TenantRepositoryAccessor } from "../tenancy/tenant-repository.accessor";
import { MaepluMirror } from "./entities/maeplu-mirror.entity";

export type ProductoParaEspejar = {
  plu: string;
  desclarga: string;
  precio: number;
  costo: number;
  iva: number;
  pagaiva: boolean;
  esServicio: boolean;
  usainventario: boolean;
};

@Injectable()
export class MaepluMirrorService {
  constructor(private readonly tenantAccessor: TenantRepositoryAccessor) {}

  private get repository(): InsertOnlyRepository<MaepluMirror> {
    return new InsertOnlyRepository(this.tenantAccessor.repositoryFor(MaepluMirror));
  }

  async insertIfMissing(
    producto: ProductoParaEspejar,
  ): Promise<{ inserted: boolean }> {
    const existing = await this.repository.findOne({
      where: { plu: producto.plu },
    });

    if (existing) {
      return { inserted: false };
    }

    // Evita el bloqueo de POSTouch "venta por debajo de costo" en productos
    // que no son servicio y no traen costo definido (Transaccion.php:1988).
    const costo =
      !producto.esServicio && producto.costo <= 0
        ? producto.precio
        : producto.costo;

    try {
      await this.repository.insert({
        plu: producto.plu,
        desclarga: producto.desclarga,
        precio: producto.precio,
        costo,
        iva: producto.iva,
        pagaiva: producto.pagaiva,
        es_servicio: producto.esServicio,
        usainventario: producto.usainventario,
        es_taller: true,
        es_producto: true,
      });
    } catch (error: any) {
      // Dos envios simultaneos con el mismo PLU: findOne no ve al otro todavia
      // y el segundo insert choca. Es exito, el producto ya esta espejado.
      if (error?.code === "ER_DUP_ENTRY" || error?.driverError?.code === "ER_DUP_ENTRY") {
        return { inserted: false };
      }
      throw error;
    }

    return { inserted: true };
  }
}
