<?php

defined('BASEPATH') or exit('No direct script access allowed');

function create_subscription_invoice_data($subscription, $invoice)
{
    $CI     = &get_instance();
    $client = $CI->clients_model->get($subscription->clientid);

    $stripeSubtotal = is_array($invoice) ? $invoice['subtotal'] : $invoice->subtotal;
    $stripeTotal    = is_array($invoice) ? $invoice['total'] : $invoice->total;
    $taxRates       = is_array($invoice) ? $invoice['default_tax_rates'] : $invoice->default_tax_rates;

    $new_invoice_data                    = [];
    $new_invoice_data['subscription_id'] = $subscription->id;
    $new_invoice_data['clientid']        = $subscription->clientid;
    $new_invoice_data['number']          = get_option('next_invoice_number');
    $new_invoice_data['date']            = _d(date('Y-m-d'));
    $new_invoice_data['duedate']         = null;

    $new_invoice_data['show_quantity_as'] = 1;
    $new_invoice_data['currency']         = $subscription->currency;

    $new_invoice_data['subtotal']         = strcasecmp($subscription->currency_name, 'JPY') == 0 ? $stripeSubtotal : $stripeSubtotal / 100;
    $new_invoice_data['total']            = strcasecmp($subscription->currency_name, 'JPY') == 0 ? $stripeSubtotal : $stripeTotal / 100;
    $new_invoice_data['adjustment']       = 0;
    $new_invoice_data['discount_percent'] = 0;
    $new_invoice_data['discount_total']   = 0;
    $new_invoice_data['discount_type']    = '';

    $new_invoice_data['terms']      = clear_textarea_breaks(get_option('predefined_terms_invoice'));
    $new_invoice_data['sale_agent'] = 0;

    $new_invoice_data['billing_street']           = clear_textarea_breaks($client->billing_street);
    $new_invoice_data['billing_city']             = $client->billing_city;
    $new_invoice_data['billing_state']            = $client->billing_state;
    $new_invoice_data['billing_zip']              = $client->billing_zip;
    $new_invoice_data['billing_country']          = $client->billing_country;
    $new_invoice_data['shipping_street']          = clear_textarea_breaks($client->shipping_street);
    $new_invoice_data['shipping_city']            = $client->shipping_city;
    $new_invoice_data['shipping_state']           = $client->shipping_state;
    $new_invoice_data['shipping_zip']             = $client->shipping_zip;
    $new_invoice_data['shipping_country']         = $client->shipping_country;
    $new_invoice_data['show_shipping_on_invoice'] = 0;
    // $new_invoice_data['include_shipping']         = 0;
    $new_invoice_data['status'] = 1;

    if (! empty($client->shipping_street)) {
        $new_invoice_data['show_shipping_on_invoice'] = 1;
        $new_invoice_data['include_shipping']         = 1;
    }

    $new_invoice_data['clientnote']            = clear_textarea_breaks(get_option('predefined_clientnote_invoice'));
    $new_invoice_data['adminnote']             = '';
    $new_invoice_data['allowed_payment_modes'] = ['stripe'];

    $new_invoice_data['newitems'] = [];
    $key                          = 1;
    $items                        = is_array($invoice) ? $invoice['lines']['data'] : $invoice->lines->data;
    $totalItems                   = count($items);

    foreach ($items as $item) {
        $descCheck1 = $item['quantity'] . ' × ';
        $descCheck2 = $item['quantity'] . ' x ';

        if (strpos($item['description'], $descCheck1) !== false) {
            $item['description'] = strbefore($item['description'], $descCheck1) . ' ' . strafter($item['description'], $descCheck1);
        } elseif (strpos($item['description'], $descCheck2) !== false) {
            $item['description'] = strbefore($item['description'], $descCheck2) . ' ' . strafter($item['description'], $descCheck2);
        }

        $item['description']                        = trim($item['description']);
        $new_invoice_data['newitems'][$key]['rate'] = strcasecmp($subscription->currency_name, 'JPY') == 0
        ? $item['amount'] / $item['quantity']
        : $item['amount'] / $item['quantity'] / 100;

        $new_invoice_data['newitems'][$key]['description']      = $item['description'];
        $new_invoice_data['newitems'][$key]['long_description'] = $subscription->description_in_item == 1 && $key == $totalItems
        ? $subscription->description
        : '';
        $new_invoice_data['newitems'][$key]['qty']     = $item['quantity'];
        $new_invoice_data['newitems'][$key]['unit']    = '';
        $new_invoice_data['newitems'][$key]['taxname'] = [];

        if ($taxRates) {
            foreach ($taxRates as $taxInfo) {
                array_push($new_invoice_data['newitems'][$key]['taxname'], $taxInfo->display_name . '|' . $taxInfo->percentage);
            }
        }

        $new_invoice_data['newitems'][$key]['order'] = $key;
        $key++;
    }

    $new_invoice_data = hooks()->apply_filters('subscription_invoice_data', $new_invoice_data);

    return $new_invoice_data;
}

function subscription_invoice_preview_data($subscription, $upcomingInvoice = null, $stripeSubscription = null)
{
    define('INVOICE_PREVIEW_SUBSCRIPTION', true);
    $CI = &get_instance();

    if (! isset($upcomingInvoice)) {
        $upcomingInvoice = $CI->stripe_subscriptions->get_upcoming_invoice($subscription->stripe_subscription_id);
    }

    $newInvoiceData = create_subscription_invoice_data($subscription, $upcomingInvoice);

    $itemsArray = $newInvoiceData['newitems'];
    $itemsArray = array_values($itemsArray);

    foreach ($itemsArray as $key => $item) {
        $itemsArray[$key]['id']       = 0;
        $itemsArray[$key]['rel_id']   = 0;
        $itemsArray[$key]['rel_type'] = 'invoice';

        if (isset($item['taxname']) && is_array($item['taxname'])) {
            foreach ($item['taxname'] as $keyTax => $tax) {
                $taxArray                                        = explode('|', $tax);
                $itemsArray[$key]['taxname'][$keyTax]            = [];
                $itemsArray[$key]['taxname'][$keyTax]['taxname'] = $tax; // NAME|PERCENT
                $itemsArray[$key]['taxname'][$keyTax]['taxrate'] = $taxArray[1];
            }
        }
    }

    $upcomingInvoice = create_subscription_invoice_data($subscription, $upcomingInvoice);
    $upcomingInvoice = array_to_object($upcomingInvoice);

    $upcomingInvoice->items = $itemsArray;

    // Fake data
    if (isset($stripeSubscription->items->data[0]->current_period_end)) {
        $date                  = date('Y-m-d', $stripeSubscription->items->data[0]->current_period_end);
        $upcomingInvoice->date = _d($date);

        if (get_option('invoice_due_after') != 0) {
            $upcomingInvoice->duedate = _d(date('Y-m-d', strtotime('+' . get_option('invoice_due_after') . ' DAY', strtotime($date))));
        }
    }
    $upcomingInvoice->client      = $CI->clients_model->get($subscription->clientid);
    $upcomingInvoice->id          = 0;
    $upcomingInvoice->payments    = [];
    $upcomingInvoice->attachments = [];
    $upcomingInvoice->status      = 2;

    $upcomingInvoice->project_id = $subscription->project_id;
    if ($subscription->project_id) {
        if (class_exists('projects_model')) {
            $CI->load->model('projects_model');
        }
        $upcomingInvoice->project_data = $CI->projects_model->get($subscription->project_id);
    }
    $upcomingInvoice->sale_agent        = 0;
    $upcomingInvoice->total_left_to_pay = $upcomingInvoice->total;
    $upcomingInvoice->discount_percent  = 0;
    $upcomingInvoice->discount_total    = 0;
    $upcomingInvoice->recurring         = 0;
    $upcomingInvoice->is_recurring_from = null;

    $currency                       = get_currency($subscription->currency);
    $upcomingInvoice->symbol        = $currency->symbol;
    $upcomingInvoice->currency_name = $currency->name;

    $GLOBALS['items_preview_transaction'] = $upcomingInvoice;

    return $upcomingInvoice;
}

function get_subscriptions_statuses()
{
    return hooks()->apply_filters('subscription_statuses', [
        [
            'color'          => '#84c529',
            'id'             => 'active',
            'filter_default' => true,
        ],
        [
            'color'          => '#84c529',
            'id'             => 'future',
            'filter_default' => true,
        ],
        [
            'color'          => '#ff6f00',
            'id'             => 'past_due',
            'filter_default' => true,
        ],
        [
            'color'          => '#fc2d42',
            'id'             => 'unpaid',
            'filter_default' => true,
        ],
        [
            'color'          => '#ff6f00',
            'id'             => 'incomplete',
            'filter_default' => true,
        ],
        [
            'color'          => '#777',
            'id'             => 'canceled',
            'filter_default' => false,
        ],
        [
            'color'          => '#777',
            'id'             => 'incomplete_expired',
            'filter_default' => false,
        ],
    ]);
}

function subscriptions_summary()
{
    $statuses            = get_subscriptions_statuses();
    $has_permission_view = staff_can('view', 'subscriptions');
    $summary             = [];

    foreach ($statuses as $status) {
        $where = ['status' => $status['id']];
        if (staff_cant('view', 'subscriptions')) {
            $where['created_from'] = get_staff_user_id();
        }
        $summary[] = [
            'total' => total_rows(db_prefix() . 'subscriptions', $where),
            'color' => $status['color'],
            'id'    => $status['id'],
        ];
    }

    array_unshift($summary, [
        'total' => total_rows(db_prefix() . 'subscriptions', 'date_subscribed IS NULL' . (! $has_permission_view ? ' AND created_from =' . get_staff_user_id() . '' : '')),
        'color' => '#03a9f4',
        'id'    => 'not_subscribed',
    ]);

    return $summary;
}

function send_email_customer_subscribed_to_subscription_to_staff($subscription)
{
    $CI = &get_instance();

    $CI->db->where('(staffid=' . $subscription->created_from . ' OR admin=1)');
    $CI->db->where('active', 1);
    $members = $CI->db->get(db_prefix() . 'staff')->result_array();

    foreach ($members as $staff) {
        send_mail_template('subscription_customer_subscribed_to_staff', $subscription, $staff['email']);
    }
}

function can_logged_in_contact_view_subscriptions()
{
    if (! is_client_logged_in()) {
        return false;
    }

    return get_option('show_subscriptions_in_customers_area') == '1'
    && $GLOBALS['contact']->is_primary == '1'
    && customer_has_subscriptions($GLOBALS['contact']->userid);
}

function can_logged_in_contact_update_credit_card()
{
    if (! is_client_logged_in()) {
        return false;
    }

    $stripeOption = get_instance()->stripe_gateway->getSetting('allow_primary_contact_to_update_credit_card');

    return $GLOBALS['contact']->is_primary == '1'
                        && ! empty($GLOBALS['client']->stripe_id)
                        && $stripeOption == '1';
}

function customer_can_delete_credit_card($client_id = null)
{
    $client_id = $client_id === null ? get_client_user_id() : get_instance()->db->escape_str($client_id);

    return ! (total_rows('subscriptions', "clientid={$client_id} AND status != 'canceled' AND status != 'incomplete_expired' AND status IS NOT NULL") > 0);
}

function is_future_subscription_date($date)
{
    $anchor = strtotime($date);

    return ! ($date <= date('Y-m-d'));
}

function redirect_to_stripe_checkout($session_id)
{
    $CI = &get_instance();

    if (! class_exists('stripe_core', false)) {
        $CI->load->library('stripe_core');
    }

    echo '<script src="https://js.stripe.com/v3/"></script>';

    echo '<script>
        var stripe = Stripe("' . $CI->stripe_core->get_publishable_key() . '");
            stripe.redirectToCheckout({
                sessionId: "' . $session_id . '"
            }).then(function (result) {});
    </script>';

    exit;
}

function check_stripe_subscription_environment($subscription)
{
    if ($subscription->in_test_environment === '1' && ! get_instance()->stripe_gateway->is_test()) {
        echo '<h2>This subscription was created in test environment, now the system has switched to live environment, hence, cannot be viewed.</h4>';
        if (staff_can('delete', 'subscriptions')) {
            echo '<h3>Feel free to delete the subscription from the system.</h4>';
        }

        exit;
    }
}
