import { DomainValidationError, ValueObject } from "@repo/rdx-ddd";
import { Result } from "@repo/rdx-utils";

interface IVerifactuRecordEstadoProps {
  value: string;
}

export enum VERIFACTU_RECORD_STATUS {
  PENDIENTE = "Pendiente", // <- Registro encolado y no procesado aún
  CORRECTO = "Correcto", // <- Registro procesado correctamente por la AEAT
  ACEPTADO_CON_ERROR = "Aceptado con errores", // <- Registro aceptado con errores por la AEAT. Se requiere enviar un registro de subsanación o emitir una rectificativa
  INCORRECTO = "Incorrecto", // <- Registro considerado incorrecto por la AEAT. Se requiere enviar un registro de subsanación con rechazo_previo=S o rechazo_previo=X o emitir una rectificativa
  DUPLICADO = "Duplicado", // <- Registro no aceptado por la AEAT por existir un registro con el mismo (serie, numero, fecha_expedicion)
  ANULADO = "Anulado", // <- Registro de anulación procesado correctamente por la AEAT
  FACTURA_INEXISTENTE = "Factura inexistente", // <- Registro de anulación no aceptado por la AEAT por no existir la factura.
  RECHAZADO = "No registrado", // <- Registro rechazado por la AEAT
  ERROR = "Error servidor AEAT", // <- Error en el servidor de la AEAT. Se intentará reenviar el registro de facturación de nuevo
}
export class VerifactuRecordEstado extends ValueObject<IVerifactuRecordEstadoProps> {
  private static readonly ALLOWED_STATUSES = [
    "Pendiente",
    "Correcto",
    "Aceptado con errores",
    "Incorrecto",
    "Duplicado",
    "Anulado",
    "Factura inexistente",
    "No registrado",
    "Error servidor AEAT",
  ];
  private static readonly FIELD = "estado";
  private static readonly ERROR_CODE = "INVALID_RECORD_STATUS";
  /*
  private static readonly TRANSITIONS: Record<string, string[]> = {
    draft: [INVOICE_STATUS.SENT],
    sent: [INVOICE_STATUS.APPROVED, INVOICE_STATUS.REJECTED],
    approved: [INVOICE_STATUS.ISSUED],
    rejected: [INVOICE_STATUS.DRAFT],
  };
*/
  static create(value: string): Result<VerifactuRecordEstado, Error> {
    if (!VerifactuRecordEstado.ALLOWED_STATUSES.includes(value)) {
      const detail = `Estado de la factura no válido: ${value}`;
      return Result.fail(
        new DomainValidationError(
          VerifactuRecordEstado.ERROR_CODE,
          VerifactuRecordEstado.FIELD,
          detail
        )
      );
    }

    return Result.ok(new VerifactuRecordEstado({ value }));
  }

  getProps(): string {
    return this.props.value;
  }

  toPrimitive() {
    return this.getProps();
  }

  toString() {
    return String(this.props.value);
  }
}
