const Joi = require("joi");

const settingValidationSchema = Joi.object({
    general: Joi.object({
        storeName: Joi.string().trim().required(),
        timeZone: Joi.string().trim().required(),
        currency: Joi.string().trim().required(),
        currencySymbol: Joi.string().trim().required(),
        allowPaymentGatewaySelection: Joi.boolean().required(),
    }),
    design: Joi.object({
        // Files handled separately, so these are optional strings for URLs
        logo: Joi.string().allow("").optional(),
        favicon: Joi.string().allow("").optional(),
        primaryColor: Joi.string().trim().required(),
        secondaryColor: Joi.string().trim().required(),
        textColor: Joi.string().trim().required(),
        heroSection: Joi.object({
            heroTitle: Joi.string().trim().allow("").optional(),
            promoBanner: Joi.object({
                image: Joi.string().allow("").optional(),
                title: Joi.string().trim().allow("").optional(),
                description: Joi.string().trim().allow("").optional(),
            }).optional(),
            offerBanners: Joi.array().items(Joi.object({
                image: Joi.string().allow("").optional(),
                title: Joi.string().trim().allow("").optional(),
                description: Joi.string().trim().allow("").optional(),
                _id: Joi.any().optional(),
            })).optional(),
            featureCards: Joi.array().items(Joi.object({
                icon: Joi.string().trim().valid("trophy", "car", "shield", "star", "clock", "thumbsup").optional(),
                text: Joi.string().trim().allow("").optional(),
                _id: Joi.any().optional(),
            })).optional(),
        }).optional(),
    }),
    seo: Joi.object({
        metaTitle: Joi.string().trim().allow("").optional(),
        metaDescription: Joi.string().trim().allow("").optional(),
        ogTitle: Joi.string().trim().allow("").optional(),
        ogDescription: Joi.string().trim().allow("").optional(),
        ogImage: Joi.string().allow("").optional(),
        twitterTitle: Joi.string().trim().allow("").optional(),
        twitterDescription: Joi.string().trim().allow("").optional(),
        twitterImage: Joi.string().allow("").optional(),
    }),
    pushNotification: Joi.object({
        enabled: Joi.boolean().required(),
        bookingUpdatesEnabled: Joi.boolean().required(),
        firebaseSenderId: Joi.string().trim().allow("").optional(),
        webPushCertificate: Joi.string().trim().allow("").optional(),
        firebaseServerKey: Joi.string().trim().allow("").optional(), // New key or same
    }),
    socialLogin: Joi.object({
        facebook: Joi.object({
            enabled: Joi.boolean().required(),
            appId: Joi.string().trim().allow("").optional(),
            appSecret: Joi.string().trim().allow("").optional(),
            buttonText: Joi.string().trim().allow("").optional(),
        }),
        google: Joi.object({
            enabled: Joi.boolean().required(),
            clientId: Joi.string().trim().allow("").optional(),
            clientSecret: Joi.string().trim().allow("").optional(),
            buttonText: Joi.string().trim().allow("").optional(),
            appId: Joi.string().trim().allow("").optional(), // Allow to prevent validation error if sent
        }),
    }),
    googleMap: Joi.object({
        httpRestrictionKey: Joi.string().trim().allow("").optional(),
        ipRestrictionKey: Joi.string().trim().allow("").optional(),
        unrestrictedKey: Joi.string().trim().allow("").optional(),
    }),
    paymentGateways: Joi.object({
        razorpay: Joi.object({
            enabled: Joi.boolean().required(),
            keyId: Joi.string().trim().allow("").optional(),
            secretKey: Joi.string().trim().allow("").optional(),
            webhookSecret: Joi.string().trim().allow("").optional(),
        }),
        stripe: Joi.object({
            enabled: Joi.boolean().required(),
            publishableKey: Joi.string().trim().allow("").optional(),
            secretKey: Joi.string().trim().allow("").optional(),
            webhookSecret: Joi.string().trim().allow("").optional(),
        }),
        paypal: Joi.object({
            enabled: Joi.boolean().required(),
            clientId: Joi.string().trim().allow("").optional(),
            clientSecret: Joi.string().trim().allow("").optional(),
        }),
    }),
    sms: Joi.object({
        provider: Joi.string().valid("Twilio", "MSG91", "Fast2SMS").optional(),
        sid: Joi.string().trim().allow("").optional(),
        authToken: Joi.string().trim().allow("").optional(),
        fromNumber: Joi.string().trim().allow("").optional(),
        twilioSmsApiUrl: Joi.string().trim().uri().allow("").optional(),
        fast2smsApiKey: Joi.string().trim().allow("").optional(),
        fast2smsSenderId: Joi.string().trim().allow("").optional(),
        fast2smsSmsApiUrl: Joi.string().trim().uri().allow("").optional(),
        whatsappProvider: Joi.string().valid("Twilio", "Fast2SMS").optional(),
        twilioWhatsappSid: Joi.string().trim().allow("").optional(),
        twilioWhatsappAuthToken: Joi.string().trim().allow("").optional(),
        twilioWhatsappNumber: Joi.string().trim().allow("").optional(),
        twilioWhatsappApiUrl: Joi.string().trim().uri().allow("").optional(),
        fast2smsWhatsappApiKey: Joi.string().trim().allow("").optional(),
        fast2smsWhatsappSenderId: Joi.string().trim().allow("").optional(),
        fast2smsWhatsappApiUrl: Joi.string().trim().uri().allow("").optional()
    }).optional(),
    messaging: Joi.object({
        sms: Joi.object({
            enabled: Joi.boolean().optional(),
            provider: Joi.string().valid("Twilio", "Fast2SMS").optional(),
            twilio: Joi.object({
                accountSid: Joi.string().trim().allow("").optional(),
                authToken: Joi.string().trim().allow("").optional(),
                fromNumber: Joi.string().trim().allow("").optional(),
                apiUrl: Joi.string().trim().uri().allow("").optional(),
            }).optional(),
            fast2sms: Joi.object({
                apiKey: Joi.string().trim().allow("").optional(),
                senderId: Joi.string().trim().allow("").optional(),
                apiUrl: Joi.string().trim().uri().allow("").optional(),
            }).optional(),
        }).optional(),
        whatsapp: Joi.object({
            enabled: Joi.boolean().optional(),
            provider: Joi.string().valid("Twilio", "Fast2SMS").optional(),
            twilio: Joi.object({
                accountSid: Joi.string().trim().allow("").optional(),
                authToken: Joi.string().trim().allow("").optional(),
                fromNumber: Joi.string().trim().allow("").optional(),
                apiUrl: Joi.string().trim().uri().allow("").optional(),
            }).optional(),
            fast2sms: Joi.object({
                apiKey: Joi.string().trim().allow("").optional(),
                apiUrl: Joi.string().trim().uri().allow("").optional(),
            }).optional(),
        }).optional(),
    }).optional(),
    email: Joi.object({
        provider: Joi.string().trim().required(),
        host: Joi.string().trim().allow("").optional(),
        port: Joi.number().optional(),
        user: Joi.string().trim().allow("").optional(),
        pass: Joi.string().trim().allow("").optional(),
    }),
    tax: Joi.object({
        name: Joi.string().trim().required(),
        percentage: Joi.number().min(0).max(100).required(),
        taxNumber: Joi.string().trim().allow("").optional(),
    }),
    language: Joi.object({
        defaultLanguage: Joi.string().trim().valid("en", "hi", "fr", "de", "ar", "es").required(),
        availableLanguages: Joi.array().items(Joi.string().valid("en", "hi", "fr", "de", "ar", "es")).required(),
    }),
    financials: Joi.object({
        defaultSystemCommission: Joi.number().min(0).max(100).optional(),
        minWithdrawalAmount: Joi.number().min(0).optional(),
        maxWithdrawalAmount: Joi.number().min(0).optional(),
        withdrawalProcessingDays: Joi.number().min(0).optional(),
    }),
}).unknown(true);

module.exports = {
    updateSettingValidation: (data) => settingValidationSchema.validate(data, { abortEarly: false }),
};
