import {
  IsString,
  IsNotEmpty,
  IsOptional,
  IsEnum,
  IsUUID,
  Length,
} from 'class-validator';

/**
 * Motivos de cancelacion segun SAT
 */
export enum MotivoCancelacion {
  /** 01 - Comprobante emitido con errores con relacion */
  ERRORES_CON_RELACION = '01',
  /** 02 - Comprobante emitido con errores sin relacion */
  ERRORES_SIN_RELACION = '02',
  /** 03 - No se llevo a cabo la operacion */
  NO_OPERACION = '03',
  /** 04 - Operacion nominativa relacionada en factura global */
  NOMINATIVA_GLOBAL = '04',
}

/**
 * DTO para cancelar Carta Porte timbrada
 */
export class CancelarCartaPorteDto {
  /**
   * Motivo de cancelacion (catalogo SAT)
   * 01 = Comprobante con errores CON relacion (requiere UUID sustituto)
   * 02 = Comprobante con errores SIN relacion
   * 03 = No se llevo a cabo la operacion
   * 04 = Operacion nominativa relacionada en factura global
   */
  @IsEnum(MotivoCancelacion, {
    message: 'motivoCancelacion debe ser 01, 02, 03 o 04',
  })
  @IsNotEmpty({ message: 'motivoCancelacion es requerido' })
  motivoCancelacion!: MotivoCancelacion;

  /**
   * UUID del CFDI que sustituye (requerido si motivo = 01)
   */
  @IsOptional()
  @IsUUID()
  uuidSustitucion?: string;

  /**
   * Observaciones adicionales sobre la cancelacion
   */
  @IsOptional()
  @IsString()
  @Length(1, 500)
  observaciones?: string;
}

/**
 * Response de cancelacion del PAC
 */
export class CancelacionResponseDto {
  /**
   * Acuse de cancelacion del SAT
   */
  @IsString()
  acuseCancelacion!: string;

  /**
   * Fecha de cancelacion
   */
  @IsString()
  fechaCancelacion!: string;

  /**
   * Estatus de cancelacion
   */
  @IsString()
  estatusCancelacion!: string;
}
