<?php
defined('BASEPATH') OR exit('No direct script access allowed');

class Reseller extends CI_Controller {

    public function __construct()
    {
        parent::__construct();
    }

    public function process_webhook()
    {
        $webhook_data = json_decode(file_get_contents('php://input'), true);

        if (isset($webhook_data['order_id']) && isset($webhook_data['products'])) {
            $result = $this->process_order($webhook_data);
            $this->output
                 ->set_content_type('application/json')
                 ->set_output(json_encode($result));
        } else {
            $response = [
                "status" => "error",
                "message" => "Invalid webhook data received."
            ];
            $this->output
                 ->set_content_type('application/json')
                 ->set_output(json_encode($response));
        }
    }

    private function process_order($webhook_data)
    {
        $processor = $webhook_data['payment_method'];
        $invoice_url = $webhook_data['invoice_url']; 
        $successes = [];
        $errors = [];

        foreach ($webhook_data['products'] as $product) {
            for ($i = 0; $i < $product['quantity']; $i++) {
                $invoice_id = generate_invoice_id();

                $user = $this->db->where('nickname', $product['username'])->get('users')->row();

                if ($user) {
                    $user_id = $user->id;

                    $unit_price = $this->get_amount_by_sku($product['sku']);

                    $order_data = [
                        'invoice_id' => $invoice_id,
                        'invoice_page' => $invoice_url, 
                        'processor' => $processor,
                        'user_id' => $user_id,
                        'created' => time(),
                        'amount' => $unit_price,
                        'package' => $product['sku'],
                        'paid' => 0
                    ];

                    $this->db->insert('orders', $order_data);
                    $order_id = $this->db->insert_id();

                    $this->update_credit($user_id, $product['sku'], $order_id);

                    $this->db->where('id', $order_id)->update('orders', ['paid' => 1]);

                    $successes[] = [
                        'nickname' => $product['username'],
                        'package' => $product['sku'],
                        'unit_price' => $unit_price,
                        'invoice_id' => $invoice_id
                    ];
                } else {
                    $errors[] = [
                        'nickname' => $product['username'],
                        'error' => 'User not found'
                    ];
                }
            }
        }

        if (count($errors) > 0 && count($successes) > 0) {
            return [
                "status" => "partial_success",
                "message" => "Some orders were processed successfully, but there were errors.",
                "orders" => $successes,
                "errors" => $errors
            ];
        } elseif (count($successes) > 0) {
            return [
                "status" => "success",
                "message" => "All orders processed successfully.",
                "orders" => $successes
            ];
        } else {
            return [
                "status" => "error",
                "message" => "All orders failed.",
                "errors" => $errors
            ];
        }
    }

    private function get_amount_by_sku($sku)
    {
        switch ($sku) {
            case 'basic':
                return 14.99;
            case 'standard':
                return 25.99;
            case 'premium':
                return 49.99;
            case 'vip':
                return 85.99;
            default:
                return 0.00; 
        }
    }

    private function update_credit($user_id, $package, $order_id)
    {
        if (filter_var($user_id, FILTER_VALIDATE_INT)) {
            $user_data = $this->db->where('id', $user_id)->get('users')->row();
            if (isset($user_data->id)) {
                $valid_order = false;
                $freeleech = false;
                $bonus_go = 0;

                switch ($package) {
                    case 'basic':
                        $valid_order = true;
                        $bonus_go = 60;
                        break;
                    case 'standard':
                        $valid_order = true;
                        $bonus_go = 210;
                        break;
                    case 'premium':
                        $valid_order = true;
                        $freeleech = true;
                        $bonus_go = 720;
                        if ($user_data->end_freeleech > 0) {
                            $freeleech = strtotime('+10 days', $user_data->end_freeleech);
                        } else {
                            $freeleech = strtotime('+10 days', now());
                        }
                        break;
                    case 'vip':
                        $valid_order = true;
                        $freeleech = true;
                        $bonus_go = 4000;
                        if ($user_data->end_freeleech > 0) {
                            $freeleech = strtotime('+45 days', $user_data->end_freeleech);
                        } else {
                            $freeleech = strtotime('+45 days', now());
                        }
                        break;
                }

                if ($valid_order) {
                    $update = [
                        'uploaded' => $user_data->uploaded + (1073741824 * $bonus_go),
                        'can_leech' => 1,
                        'is_donator' => 1,
                    ];

                    if ($freeleech) {
                        $update['end_freeleech'] = $freeleech;
                        $update['download_multiplier'] = 0;
                    }

                    $this->db->where('id', $user_data->id)->update('users', $update);
                    $this->db->where('id', $order_id)->update('orders', ['paid' => 1]);
                }
            }
        }
    }
}
