import { Injectable, HttpException, HttpStatus } from '@nestjs/common';
import { ModelsService } from 'src/models/models.service';
import { CommonService } from 'src/common/common.service';
import { TranslationService } from 'src/common/services/translation.service';
import { Types } from 'mongoose';
import { UpdateSettingsDto, UpdateVendorCommissionDto } from './dto/settings.dto';
import { PaymentGateway , SubscriptionCheckoutType } from './schema/settings.schema';

@Injectable()
export class SettingsService {
    constructor(
        private readonly models: ModelsService,
        private readonly common: CommonService,
        private readonly translationService: TranslationService
    ) { }

    async getSettings(): Promise<any> {
        try {
            const lang = 'en';

            // Get all settings
            const settings = await this.models.SettingsModel.findOne({}).lean();

            return this.common.successResponse('Settings retrieved successfully', 
                settings
            );
        } catch (error) {
            throw error;
        }
    }

    async updateSettings(updateSettingsDto: UpdateSettingsDto): Promise<any> {
        try {
            const { 
                vendor_commission_percentage, 
                tax,
                referral_amount,
                is_instant_referral_reward,
                referral_required_orders,
                referral_time_limit_days,
                description 
            } = updateSettingsDto;
            const lang = 'en';

            // Find or create settings
            let settings = await this.models.SettingsModel.findOne({});

            if (!settings) {
                // Create new settings
                settings = await this.models.SettingsModel.create({
                    payment_gateway: PaymentGateway.STRIPE,
                    vendor_commission_percentage: vendor_commission_percentage || 0,
                    tax: tax || 18,
                    currency: 'USD',
                    currency_symbol: '$',
                    referral_amount: referral_amount || 0,
                    is_instant_referral_reward: is_instant_referral_reward !== undefined ? is_instant_referral_reward : true,
                    referral_required_orders: referral_required_orders || 0,
                    referral_time_limit_days: referral_time_limit_days || 30,
                    subscription_checkout_type: SubscriptionCheckoutType.IN_APP_CHECKOUT,
                    in_app_purchased_enable: false,
                    description: description || null,
                    created_at: +new Date(),
                    updated_at: +new Date()
                });
            }

            // Update settings
            const updateData: any = {
                updated_at: +new Date()
            };

            if (vendor_commission_percentage !== undefined) {
                updateData.vendor_commission_percentage = vendor_commission_percentage;
            }

            if (tax !== undefined) {
                updateData.tax = tax;
            }

        
            if (referral_amount !== undefined) {
                updateData.referral_amount = referral_amount;
            }

            if (is_instant_referral_reward !== undefined) {
                updateData.is_instant_referral_reward = is_instant_referral_reward;
            }

            if (referral_required_orders !== undefined) {
                updateData.referral_required_orders = referral_required_orders;
            }

            if (referral_time_limit_days !== undefined) {
                updateData.referral_time_limit_days = referral_time_limit_days;
            }


            if (description !== undefined) {
                updateData.description = description;
            }

            await this.models.SettingsModel.updateOne(
                { _id: settings._id },
                { $set: updateData }
            );

            // Get updated settings
            const updatedSettings = await this.models.SettingsModel.findById(settings._id).lean();

            return this.common.successResponse('Settings updated successfully', updatedSettings);
        } catch (error) {
            throw error;
        }
    }


    async getDefaultCommissionPercentage(): Promise<number> {
        try {
            const activeSettings = await this.models.SettingsModel.findOne({ is_active: true }).lean();
            return activeSettings ? activeSettings.vendor_commission_percentage : 0;
        } catch (error) {
            return 0;
        }
    }
}
