


import { ApiProperty } from "@nestjs/swagger";
import { IsNumber, IsString, IsOptional, IsNotEmpty } from "class-validator";
import { Types } from "mongoose";
import { Transform } from "class-transformer";

enum UserType {
    USER = "USER",
    ADMIN = "ADMIN",
    STAFF = "STAFF",
    CHEF = "CHEF"
}

export enum account_type {
    ACTIVATED = 'ACTIVATED',
    DEACTIVATED = 'DEACTIVATED',
    BLOCKED = 'BLOCKED',
    DELETE = 'DELETE',
}
export enum status_type {
    // null,
    PLACED = 'PLACED',
    CONFIRMED = 'CONFIRMED',
    DELIVERED = 'DELIVERED',
    CANCELLED = 'CANCELLED',
    DISPUTE = 'DISPUTE',
    RETURNED = 'RETURNED',
    REFUND_IN_PROGESS = 'REFUND_IN_PROGESS',
    REFUNDED = 'REFUNDED',
    PENDING_CANCELLATION = 'PENDING_CANCELLATION'
}

export enum driver_order_status {

    ACCEPTED = 'ACCEPTED',
    DELIVERED = 'DELIVERED',
    CANCELLED = 'CANCELLED',
    PICKUPED = 'PICKUPED',

}


export enum store_type {
    // null,

    VENDOR = 'VENDOR',
    SUBSCRIPTION = 'SUBSCRIPTION',
    MEMBERSHIP = 'MEMBERSHIP',

}


export class ListUsers {

    @ApiProperty({ type: String, description: "search by name", required: false })
    @IsOptional()
    @IsString()
    search?: string;

    @ApiProperty({ enum: UserType, required: false, default: "USER" })
    @IsOptional()
    @IsString()
    type: UserType;


    @ApiProperty({ enum: account_type, default: "ACTIVATED", required: false })
    @IsOptional()
    @IsString()
    filter?: account_type;

    @ApiProperty({ type: "number", default: 0, required: false })
    @IsOptional()
    pagination: number;

    @ApiProperty({ type: "number", default: 10, required: false })
    @IsOptional()
    limit?: number;

    @ApiProperty({ type: "number", default: 10, required: false })
    @IsOptional()
    start_date: number;

    @ApiProperty({ type: "number", default: 10, required: false })
    @IsOptional()
    end_date?: number;

}

export class ListVendor {

    @ApiProperty({ type: String, description: "search by name", required: false })
    @IsOptional()
    @IsString()
    search?: string;

    @ApiProperty({ enum: account_type, default: "ACTIVATED", required: false })
    @IsOptional()
    @IsString()
    filter?: account_type;

    @ApiProperty({ type: "number", default: 0, required: false })
    @IsOptional()
    pagination: number;

    @ApiProperty({ type: "number", default: 10, required: false })
    @IsOptional()
    limit?: number;

    @ApiProperty({ type: "number", default: 10, required: false })
    @IsOptional()
    start_date: number;

    @ApiProperty({ type: "number", default: 10, required: false })
    @IsOptional()
    end_date?: number;

}


export class ListDriver {

    @ApiProperty({ type: String, description: "search by name", required: false })
    @IsOptional()
    @IsString()
    search?: string;

    @ApiProperty({ enum: account_type, default: "ACTIVATED", required: false })
    @IsOptional()
    @IsString()
    filter?: string;

    @ApiProperty({ type: "number", default: 0, required: false })
    @IsOptional()
    pagination: number;

    @ApiProperty({ type: "number", default: 10, required: false })
    @IsOptional()
    limit?: number;

    @ApiProperty({ type: "number", default: 10, required: false })
    @IsOptional()
    start_date: number;

    @ApiProperty({ type: "number", default: 10, required: false })
    @IsOptional()
    end_date?: number;

}

export enum driver_list_approvel {
    ACCEPT = 'ACCEPT',
    REJECT = 'REJECT',
    UNDER_REVIEW = 'UNDER_REVIEW'
}
export class ListDriverApprovel {

    @ApiProperty({ enum: driver_list_approvel, default: driver_list_approvel.ACCEPT, required: false })
    @IsOptional()
    @IsString()
    filter: string

    @ApiProperty({ type: "number", default: 0, required: false })
    @IsOptional()
    pagination: number;

    @ApiProperty({ type: "number", default: 10, required: false })
    @IsOptional()
    limit: number;

}


export class order_list_user {

    @Transform(({ value }) => parseInt(value))
    @ApiProperty({ required: false })
    @IsNumber()
    @IsOptional()
    pagination: number;

    @Transform(({ value }) => parseInt(value))
    @ApiProperty({ required: false })
    @IsNumber()
    @IsOptional()
    limit: number;

    @IsOptional()
    @ApiProperty({ required: false, enum: Object.values(status_type), default: status_type.PLACED })
    @IsString()
    status_type: string;

    @ApiProperty({ type: 'string', required: false, default: "" })
    @IsString()
    @IsOptional()
    user_id: string;

    @ApiProperty({ type: 'string', required: false, default: "" })
    @IsString()
    @IsOptional()
    store_id: string;

    @IsOptional()
    @ApiProperty({ required: false, enum: Object.values(store_type), default: store_type.VENDOR })
    @IsString()
    store_type: string;

    @ApiProperty({ type: String, description: "search by store_name", required: false })
    @IsOptional()
    @IsString()
    search?: string;

}




export class order_list_driver {

    @Transform(({ value }) => parseInt(value))
    @ApiProperty({ required: false })
    @IsNumber()
    @IsOptional()
    pagination: number;

    @Transform(({ value }) => parseInt(value))
    @ApiProperty({ required: false })
    @IsNumber()
    @IsOptional()
    limit: number;

    @IsOptional()
    @ApiProperty({ required: false, enum: Object.values(driver_order_status), default: driver_order_status.ACCEPTED })
    @IsString()
    status_type: string;

    @ApiProperty({ type: String, description: "search by store_name", required: false })
    @IsOptional()
    @IsString()
    search?: string;

    @ApiProperty({ type: 'string', required: false, default: "" })
    @IsString()
    @IsOptional()
    driver_id: string;

}

enum payment_mode {
    ONLINE = "ONLINE",
    CASH_ON_DELIVERY = "CASH_ON_DELIVERY"
}
export class pickup_orders {

    @ApiProperty({ type: String, description: "search by order id", required: false })
    @IsOptional()
    @IsString()
    search?: string;

    @Transform(({ value }) => parseInt(value))
    @ApiProperty({ required: false })
    @IsNumber()
    @IsOptional()
    pagination: number;

    @Transform(({ value }) => parseInt(value))
    @ApiProperty({ required: false })
    @IsNumber()
    @IsOptional()
    limit: number;

    @IsOptional()
    @ApiProperty({ required: false, enum: Object.values(payment_mode), default: payment_mode.ONLINE })
    @IsString()
    type: string;


}

export class deactivate_user {

    @ApiProperty()
    @IsOptional()
    @IsString()
    deactivate_reason: string;


}
