import { Prisma, UserRole } from '@prisma/client';
import { PrismaService } from '../../database/prisma.service';
import { CreateCouponDto } from './dto/create-coupon.dto';
import { UpdateCouponDto } from './dto/update-coupon.dto';
import { UploadsService } from '../uploads/uploads.service';
import type { RejectCouponDto } from './dto/reject-coupon.dto';
type RequestUser = {
    id: string;
    role: UserRole;
    shopId: string | null;
};
export declare class CouponsService {
    private readonly prisma;
    private readonly uploads;
    constructor(prisma: PrismaService, uploads: UploadsService);
    private generateCouponImageFromDesign;
    private assertCanAccessShop;
    private listAllowedShopIdsForUser;
    private createForShop;
    list(user: RequestUser, shopIdQuery?: string): Promise<{
        id: string;
        shopId: string;
        createdAt: Date;
        updatedAt: Date;
        title: string;
        imageUrl: string | null;
        status: import("@prisma/client").$Enums.CouponStatus;
        rejectedAt: Date | null;
        rejectedReason: string | null;
        expiresAt: Date | null;
        shortDescription: string | null;
        longDescription: string | null;
        cashiCoinsCost: number;
        valueType: import("@prisma/client").$Enums.CouponValueType;
        valueFixed: number | null;
        valuePercent: number | null;
        minOrderValue: number | null;
        totalCoupons: number | null;
        distributionBid: number | null;
        moderationStatus: import("@prisma/client").$Enums.ModerationStatus;
        submittedAt: Date | null;
        publishedAt: Date | null;
        activeAt: Date | null;
        design: Prisma.JsonValue | null;
        resubmissionCount: number;
        issuedCount: number;
        redeemedCount: number;
    }[]>;
    listPaged(user: RequestUser, args: {
        page: number;
        limit: number;
        q?: string;
        status?: string;
        moderationStatus?: string;
        shopId?: string;
    }): Promise<{
        page: number;
        limit: number;
        total: number;
        items: {
            id: string;
            shopId: string;
            createdAt: Date;
            updatedAt: Date;
            title: string;
            imageUrl: string | null;
            status: import("@prisma/client").$Enums.CouponStatus;
            rejectedAt: Date | null;
            rejectedReason: string | null;
            expiresAt: Date | null;
            shortDescription: string | null;
            longDescription: string | null;
            cashiCoinsCost: number;
            valueType: import("@prisma/client").$Enums.CouponValueType;
            valueFixed: number | null;
            valuePercent: number | null;
            minOrderValue: number | null;
            totalCoupons: number | null;
            distributionBid: number | null;
            moderationStatus: import("@prisma/client").$Enums.ModerationStatus;
            submittedAt: Date | null;
            publishedAt: Date | null;
            activeAt: Date | null;
            design: Prisma.JsonValue | null;
            resubmissionCount: number;
            issuedCount: number;
            redeemedCount: number;
        }[];
    }>;
    listAdminPaged(args: {
        page: number;
        limit: number;
        q?: string;
        shopId?: string;
        status?: string;
        moderationStatus?: string;
    }): Promise<{
        page: number;
        limit: number;
        total: number;
        items: {
            id: string;
            shopId: string;
            createdAt: Date;
            updatedAt: Date;
            shop: {
                id: string;
                name: string;
                username: string | null;
                city: string;
                state: string;
            };
            title: string;
            imageUrl: string | null;
            status: import("@prisma/client").$Enums.CouponStatus;
            rejectedAt: Date | null;
            rejectedReason: string | null;
            expiresAt: Date | null;
            shortDescription: string | null;
            longDescription: string | null;
            cashiCoinsCost: number;
            valueType: import("@prisma/client").$Enums.CouponValueType;
            valueFixed: number | null;
            valuePercent: number | null;
            minOrderValue: number | null;
            totalCoupons: number | null;
            distributionBid: number | null;
            moderationStatus: import("@prisma/client").$Enums.ModerationStatus;
            publishedAt: Date | null;
            activeAt: Date | null;
            design: Prisma.JsonValue;
            resubmissionCount: number;
            issuedCount: number;
            redeemedCount: number;
        }[];
    }>;
    publish(id: string, dto?: {
        cashiPointsCost?: number;
        cashiCoinsCost?: number;
    }): Promise<{
        ok: boolean;
        coupon: {
            id: string;
            status: import("@prisma/client").$Enums.CouponStatus;
            cashiCoinsCost: number;
            moderationStatus: import("@prisma/client").$Enums.ModerationStatus;
            publishedAt: Date | null;
        };
    }>;
    reject(id: string, dto: RejectCouponDto): Promise<{
        ok: boolean;
        coupon: {
            id: string;
            status: import("@prisma/client").$Enums.CouponStatus;
            rejectedAt: Date | null;
            rejectedReason: string | null;
            moderationStatus: import("@prisma/client").$Enums.ModerationStatus;
        };
    }>;
    submit(user: RequestUser, id: string): Promise<{
        ok: boolean;
        coupon: {
            id: string;
            moderationStatus: import("@prisma/client").$Enums.ModerationStatus;
            submittedAt: Date | null;
            resubmissionCount: number;
        };
    }>;
    listCouponCustomers(user: RequestUser, id: string): Promise<{
        coupon: {
            id: string;
            shopId: string;
            title: string;
            moderationStatus: import("@prisma/client").$Enums.ModerationStatus;
            issuedCount: number;
            redeemedCount: number;
        };
        issued: {
            assignmentId: string;
            status: import("@prisma/client").$Enums.CustomerCouponStatus;
            assignedAt: Date;
            redeemedAt: Date | null;
            customer: {
                hasStoreSale: boolean;
                id: string;
                email: string | null;
                phone: string | null;
                role: import("@prisma/client").$Enums.UserRole;
                name: string | null;
            } | null;
            redeemedSale: {
                id: string;
                createdAt: Date;
                amount: number;
            } | null;
        }[];
        redeemed: {
            assignmentId: string;
            status: import("@prisma/client").$Enums.CustomerCouponStatus;
            assignedAt: Date;
            redeemedAt: Date | null;
            customer: {
                hasStoreSale: boolean;
                id: string;
                email: string | null;
                phone: string | null;
                role: import("@prisma/client").$Enums.UserRole;
                name: string | null;
            } | null;
            redeemedSale: {
                id: string;
                createdAt: Date;
                amount: number;
            } | null;
        }[];
    }>;
    create(user: RequestUser, dto: CreateCouponDto): Promise<{
        id: string;
        shopId: string;
        createdAt: Date;
        updatedAt: Date;
        title: string;
        imageUrl: string | null;
        status: import("@prisma/client").$Enums.CouponStatus;
        rejectedAt: Date | null;
        rejectedReason: string | null;
        expiresAt: Date | null;
        shortDescription: string | null;
        longDescription: string | null;
        cashiCoinsCost: number;
        valueType: import("@prisma/client").$Enums.CouponValueType;
        valueFixed: number | null;
        valuePercent: number | null;
        minOrderValue: number | null;
        totalCoupons: number | null;
        distributionBid: number | null;
        moderationStatus: import("@prisma/client").$Enums.ModerationStatus;
        submittedAt: Date | null;
        publishedAt: Date | null;
        activeAt: Date | null;
        design: Prisma.JsonValue | null;
        resubmissionCount: number;
        issuedCount: number;
        redeemedCount: number;
    }>;
    bulkCreate(user: RequestUser, dto: CreateCouponDto & {
        shopIds?: string[];
        allShops?: boolean;
    }): Promise<any[]>;
    update(user: RequestUser, id: string, dto: UpdateCouponDto): Promise<{
        id: string;
        shopId: string;
        createdAt: Date;
        updatedAt: Date;
        title: string;
        imageUrl: string | null;
        status: import("@prisma/client").$Enums.CouponStatus;
        rejectedAt: Date | null;
        rejectedReason: string | null;
        expiresAt: Date | null;
        shortDescription: string | null;
        longDescription: string | null;
        cashiCoinsCost: number;
        valueType: import("@prisma/client").$Enums.CouponValueType;
        valueFixed: number | null;
        valuePercent: number | null;
        minOrderValue: number | null;
        totalCoupons: number | null;
        distributionBid: number | null;
        moderationStatus: import("@prisma/client").$Enums.ModerationStatus;
        submittedAt: Date | null;
        publishedAt: Date | null;
        activeAt: Date | null;
        design: Prisma.JsonValue | null;
        resubmissionCount: number;
        issuedCount: number;
        redeemedCount: number;
    }>;
    remove(user: RequestUser, id: string): Promise<{
        ok: boolean;
    }>;
}
export {};
