import { Injectable } from '@nestjs/common';
import { ModelService } from '../model/model.service';
import Razorpay from 'razorpay';
import { subscription_payment_status } from '../model/schema/subscription.schema';

@Injectable()
export class RazorpayWebhookService {

    private razorpay;
    constructor(
        private Model: ModelService,
    ) {
        this.razorpay = new Razorpay({
            key_id: process.env.RAZORPAY_KEY_ID,
            key_secret: process.env.RAZORPAY_KEY_SECRET,
        });
    }

    private pay_data = {"payment":{"entity":{"id":"pay_Pn9j2rqpLQdnxt","entity":"payment","amount":100,"currency":"INR","status":"authorized","order_id":null,"invoice_id":null,"international":false,"method":"card","amount_refunded":0,"refund_status":null,"captured":false,"description":"Base Plan - Monthly Plan","card_id":"card_Pn9j2vsr63gejJ","card":{"id":"card_Pn9j2vsr63gejJ","entity":"card","name":"","last4":"5449","network":"MasterCard","type":"credit","issuer":"UTIB","international":false,"emi":false,"sub_type":"consumer","token_iin":null},"bank":null,"wallet":null,"vpa":null,"email":"amitabh@yopmail.com","contact":"+918789590852","notes":{"plan_id":"plan_PmSiwMZjPkK4a2","plan_name":"Base Plan","billing_cycle":"monthly","features":"Chat Message - 5M Tokens, Calls - N/A, Knowledge Base - Upto 10GB Storage, AI Agents - 2, Workspace Members - 1, Beyond this: Chat message - $2 per million tokens, Beyond this: Calls - $12 per hour"},"fee":null,"tax":null,"error_code":null,"error_description":null,"error_source":null,"error_step":null,"error_reason":null,"acquirer_data":{"auth_code":"779919"},"created_at":1737694482,"reward":null}}}

    
    async handleWebhook(body: any) {
        try {
            const event = body.event;
            const payload = body.payload;
            console.log(`RAZORPAY BODY ${(event)} =>`, JSON.stringify(payload))

            switch (event) {
                case 'payment.authorized': this.handlePaymentAuthorized(payload);
                break;
                case 'payment.failed': this.handlePaymentFailed(payload);
                break;
                case 'payment.captured': this.handlePaymentCaptured(payload);
                break;
                case 'subscription.authenticated': this.handleSubscriptionAuthenticated(payload);
                break;
                case 'subscription.activated': this.handleSubscriptionActivate(payload);
                break;
                case 'subscription.charged':
                console.log('Subscription charged:', body.payload.subscription.entity);
                break;
                case 'default':
                default: console.log('Unhandled event:', event);
                break;
            }
        } catch (error) {
            console.error("Error fetching plan list:", error.message);
        }
    }

    private async handlePaymentAuthorized(payload: any) {
        console.log("payload.payment.entity.status", payload.payment.entity.status)
        const status = payload.payment.entity.status;

        const paymentId = payload.payment.entity.id;
        try {
            const capture_payment = await this.capturePayment(paymentId, payload.payment.entity.amount);
            const subscriptionId = await this.fetchSubscriptionId(paymentId)
            if (subscriptionId) {
                console.log('Subscription ID:', subscriptionId);
            }
        } catch (error) {
            console.error('Error handling webhook:', error);
        }
    }

    private async handlePaymentFailed(payload: any) {
        console.log("payload.payment.entity.status", payload.payment.entity.status)
    }

    private async handleSubscriptionAuthenticated(payload: any) {
        try {
            console.log('subscription.authenticated ===> ', payload.subscription.entity)
            const subscription = payload.subscription.entity

            const subscription_data = await this.Model.subscriptionModel.findOne({
                subscription_id: subscription.id, status: "created"
            });

            await this.Model.subscriptionModel.findOneAndUpdate(
                { subscription_id: subscription.id, status: "created" },
                { status: subscription.status, is_active: true, payment_status: subscription_payment_status.PAYMENT_COMPLETED }, // "authenticated"
                { new: true }
            );
        } catch (error) {
            console.error('Error at subscription.authenticated =>', error.message)
        }
        
    }

    private async handleSubscriptionActivate(payload: any) {
        console.log('subscription.activated ===> ', JSON.stringify(payload))
    }

    private async handlePaymentCaptured(payload: any) {
        console.log('payment.captured ===> ', JSON.stringify(payload))
    }


    async fetchSubscriptionId(paymentId: string) {
        try {
            const paymentDetails = await this.razorpay.payments.fetch(paymentId);
            console.log('paymentDetails', paymentDetails)
            const subscriptionId = paymentDetails.subscription_id;
    
            if (subscriptionId) {
                console.log('Subscription ID:', subscriptionId);
                return subscriptionId;
            } else {
                console.log('No subscription ID associated with this payment');
            }
        } catch (error) {
            console.error('Error fetching payment details:', error);
            throw error;
        }
    }

    async capturePayment(paymentId: string, amount: number) {
        try {
            const response = await this.razorpay.payments.capture(paymentId, amount, 'INR');
            console.log('Payment captured:', paymentId);
            return response;
        } catch (error) {
            console.error('Error capturing payment:', error);
            throw error;
        }
    }

    

}
