<?php

namespace routes;

use classes\authentication;
use classes\response;
use classes\statistics;
use objects\logs_o;
use traits\route_t;

class statisticsRoute
{
    use route_t;

    public function run(): void
    {
        /** Statistics >> Bookings >> New bookings */
        $this->get('/statistics/bookings/new', function () {
            // Require the user to be logged in
            global
            /** @var response $response */
            $EMAIL_WASH_CERTIFICATE_TOKEN,
            $response;
            $this->requirePermission('statistics_bookings_new');
            // Get the user object
            $user = (new authentication())->get_user();
            // Check if the request was successful
            if ($user) {
                // Log the incident
                (new logs_o())->add('statistics', 'global', 1, $user->id, 'NEW_BOOKINGS', 'User requested new bookings');
                $statics = new statistics();
                // Return the list of bookings
                $response->success(
                    $statics
                        ->bookings()
                        ->get_new_bookings()
                        ->get_response()
                );
            } else {
                // Log the incident
                (new logs_o())->add('statistics', 'global', 0, 0, 'NEW_BOOKINGS', 'User requested new bookings');
                // Return an error
                $response->error('Invalid session', 400);
            }
        },
            [
                'statistics_bookings_new' => 'List all new bookings'
            ]
        );

        /** Statistics >> Orders >> New orders */
        $this->get('/statistics/orders/new', function () {
            // Require the user to be logged in
            global
            /** @var response $response */
            $EMAIL_WASH_CERTIFICATE_TOKEN,
            $response;
            $this->requirePermission('statistics_orders_new');
            // Get the user object
            $user = (new authentication())->get_user();
            // Check if the request was successful
            if ($user) {
                // Log the incident
                (new logs_o())->add('statistics', 'global', 1, $user->id, 'NEW_ORDERS', 'User requested new orders');
                $statics = new statistics();
                // Return the list of orders
                $response->success(
                    $statics
                        ->orders()
                        ->get_new_orders()
                        ->get_response()
                );
            } else {
                // Log the incident
                (new logs_o())->add('statistics', 'global', 0, 0, 'NEW_ORDERS', 'User requested new orders');
                // Return an error
                $response->error('Invalid session', 400);
            }
        },
            [
                'statistics_orders_new' => 'List all new orders'
            ]
        );

        /** Statistics >> Economic >> Total income */
        $this->get('/statistics/economic/totals', function () {
            // Require the user to be logged in
            global
            /** @var response $response */
            $EMAIL_WASH_CERTIFICATE_TOKEN,
            $response;
            $this->requirePermission('statistics_economic_income');
            // Get the user object
            $user = (new authentication())->get_user();
            // Check if the request was successful
            if ($user) {
                // Log the incident
                (new logs_o())->add('statistics', 'global', 1, $user->id, 'TOTAL_INCOME', 'User requested total income');
                $statics = new statistics();
                // Return the total income
                $response->success(
                    $statics
                        ->economic()
                        ->get_totals()
                        ->get_response()
                );
            } else {
                // Log the incident
                (new logs_o())->add('statistics', 'global', 0, 0, 'TOTAL_INCOME', 'User requested total income');
                // Return an error
                $response->error('Invalid session', 400);
            }
        },
            [
                'statistics_economic_income' => 'Get total income'
            ]
        );

        /** Statistics >> Economic >> Department sent invoice totals */
        $this->get('/statistics/economic/totals/department_sent_invoice_totals', function () {
            // Require the user to be logged in
            global
            /** @var response $response */
            $EMAIL_WASH_CERTIFICATE_TOKEN,
            $response;
            $this->requirePermission('statistics_economic_department_sent_invoice_totals');
            // Get the user object
            $user = (new authentication())->get_user();
            // Check if the request was successful
            if ($user) {
                // Log the incident
                (new logs_o())->add('statistics', 'global', 1, $user->id, 'DEPARTMENT_SENT_INVOICE_TOTALS', 'User requested department sent invoice totals');
                $statics = new statistics();
                // Return the department sent invoice totals
                $response->success(
                    $statics
                        ->economic()
                        ->get_department_sent_invoice_totals()
                        ->get_response()
                );
            } else {
                // Log the incident
                (new logs_o())->add('statistics', 'global', 0, 0, 'DEPARTMENT_SENT_INVOICE_TOTALS', 'User requested department sent invoice totals');
                // Return an error
                $response->error('Invalid session', 400);
            }
        },
            [
                'statistics_economic_department_sent_invoice_totals' => 'Get department sent invoice totals'
            ]
        );

        /** Statistics >> Economic >> Department draft invoice totals */
        $this->get('/statistics/economic/totals/department_draft_invoice_totals', function () {
            // Require the user to be logged in
            global
            /** @var response $response */
            $EMAIL_WASH_CERTIFICATE_TOKEN,
            $response;
            $this->requirePermission('statistics_economic_department_draft_invoice_totals');
            // Get the user object
            $user = (new authentication())->get_user();
            // Check if the request was successful
            if ($user) {
                // Log the incident
                (new logs_o())->add('statistics', 'global', 1, $user->id, 'DEPARTMENT_DRAFT_INVOICE_TOTALS', 'User requested department draft invoice totals');
                $statics = new statistics();
                // Return the department draft invoice totals
                $response->success(
                    $statics
                        ->economic()
                        ->get_department_draft_invoice_totals()
                        ->get_response()
                );
            } else {
                // Log the incident
                (new logs_o())->add('statistics', 'global', 0, 0, 'DEPARTMENT_DRAFT_INVOICE_TOTALS', 'User requested department draft invoice totals');
                // Return an error
                $response->error('Invalid session', 400);
            }
        },
            [
                'statistics_economic_department_draft_invoice_totals' => 'Get department draft invoice totals'
            ]
        );

        /** Statistics >> Economic >> Total income today */
        $this->get('/statistics/income/today', function () {
            // Require the user to be logged in
            global
            /** @var response $response */
            $EMAIL_WASH_CERTIFICATE_TOKEN,
            $response;
            $this->requirePermission('statistics_economic_income_today');
            // Get the user object
            $user = (new authentication())->get_user();
            // Check if the request was successful
            if ($user) {
                // Log the incident
                (new logs_o())->add('statistics', 'global', 1, $user->id, 'TOTAL_INCOME_TODAY', 'User requested total income today');
                $statics = new statistics();
                // Return the total income today
                $response->success(
                    $statics
                        ->economic()
                        ->get_totals_today()
                );
            } else {
                // Log the incident
                (new logs_o())->add('statistics', 'global', 0, 0, 'TOTAL_INCOME_TODAY', 'User requested total income today');
                // Return an error
                $response->error('Invalid session', 400);
            }
        },
            [
                'statistics_economic_income_today' => 'Get total income today'
            ]
        );

        /** Statistics >> Economic >> Total income yesterday */
        $this->get('/statistics/income/yesterday', function () {
            // Require the user to be logged in
            global
            /** @var response $response */
            $EMAIL_WASH_CERTIFICATE_TOKEN,
            $response;
            $this->requirePermission('statistics_economic_income_yesterday');
            // Get the user object
            $user = (new authentication())->get_user();
            // Check if the request was successful
            if ($user) {
                // Log the incident
                (new logs_o())->add('statistics', 'global', 1, $user->id, 'TOTAL_INCOME_YESTERDAY', 'User requested total income yesterday');
                $statics = new statistics();
                // Return the total income yesterday
                $response->success(
                    $statics
                        ->economic()
                        ->get_totals_yesterday()
                );
            } else {
                // Log the incident
                (new logs_o())->add('statistics', 'global', 0, 0, 'TOTAL_INCOME_YESTERDAY', 'User requested total income yesterday');
                // Return an error
                $response->error('Invalid session', 400);
            }
        },
            [
                'statistics_economic_income_yesterday' => 'Get total income yesterday'
            ]
        );

        /** Statistics >> Economic >> Total income this month */
        $this->get('/statistics/income/this-month', function () {
            // Require the user to be logged in
            global
            /** @var response $response */
            $EMAIL_WASH_CERTIFICATE_TOKEN,
            $response;
            $this->requirePermission('statistics_economic_income_this_month');
            // Get the user object
            $user = (new authentication())->get_user();
            // Check if the request was successful
            if ($user) {
                // Log the incident
                (new logs_o())->add('statistics', 'global', 1, $user->id, 'TOTAL_INCOME_THIS_MONTH', 'User requested total income this month');
                $statics = new statistics();
                // Return the total income this month
                $response->success(
                    $statics
                        ->economic()
                        ->get_totals_this_month()
                );
            } else {
                // Log the incident
                (new logs_o())->add('statistics', 'global', 0, 0, 'TOTAL_INCOME_THIS_MONTH', 'User requested total income this month');
                // Return an error
                $response->error('Invalid session', 400);
            }
        },
            [
                'statistics_economic_income_this_month' => 'Get total income this month'
            ]
        );

        /** Statistics >> Economic >> Total income last month */
        $this->get('/statistics/income/last-month', function () {
            // Require the user to be logged in
            global
            /** @var response $response */
            $EMAIL_WASH_CERTIFICATE_TOKEN,
            $response;
            $this->requirePermission('statistics_economic_income_last_month');
            // Get the user object
            $user = (new authentication())->get_user();
            // Check if the request was successful
            if ($user) {
                // Log the incident
                (new logs_o())->add('statistics', 'global', 1, $user->id, 'TOTAL_INCOME_LAST_MONTH', 'User requested total income last month');
                $statics = new statistics();
                // Return the total income last month
                $response->success(
                    $statics
                        ->economic()
                        ->get_totals_last_month()
                );
            } else {
                // Log the incident
                (new logs_o())->add('statistics', 'global', 0, 0, 'TOTAL_INCOME_LAST_MONTH', 'User requested total income last month');
                // Return an error
                $response->error('Invalid session', 400);
            }
        },
            [
                'statistics_economic_income_last_month' => 'Get total income last month'
            ]
        );

        /** Statistics >> Economic >> Total income this year */
        $this->get('/statistics/income/this-year', function () {
            // Require the user to be logged in
            global
            /** @var response $response */
            $EMAIL_WASH_CERTIFICATE_TOKEN,
            $response;
            $this->requirePermission('statistics_economic_income_this_year');
            // Get the user object
            $user = (new authentication())->get_user();
            // Check if the request was successful
            if ($user) {
                // Log the incident
                (new logs_o())->add('statistics', 'global', 1, $user->id, 'TOTAL_INCOME_THIS_YEAR', 'User requested total income this year');
                $statics = new statistics();
                // Return the total income this year
                $response->success(
                    $statics
                        ->economic()
                        ->get_totals_this_year()
                );
            } else {
                // Log the incident
                (new logs_o())->add('statistics', 'global', 0, 0, 'TOTAL_INCOME_THIS_YEAR', 'User requested total income this year');
                // Return an error
                $response->error('Invalid session', 400);
            }
        },
            [
                'statistics_economic_income_this_year' => 'Get total income this year'
            ]
        );

        $this->get('/statistics/income/departments', function () {
            // Require the user to be logged in
            global
            /** @var response $response */
            $response;
            $this->requirePermission('statistics_economic_income_today_departments');
            // Get the user object
            $user = (new authentication())->get_user();
            // Check if the request was successful
            if ($user) {
                // Log the incident
                (new logs_o())->add('statistics', 'global', 1, $user->id, 'TOTAL_INCOME_TODAY_DEPARTMENTS', 'User requested total income today by departments');
                $invoices = (new statistics())->economic()->get_department_sent_invoice_totals()->get_raw_data();
                $drafts = (new statistics())->economic()->get_department_draft_invoice_totals()->get_raw_data();
                $totals = [];
                // Loop through every department and add the drafts to the invoices
                foreach ( $invoices as $key => $invoice ) {
                    if (isset($drafts[$key])) {
                        // Add the totalNetAmount to the drafts in the totals array
                        $totals[$key]['totalNetAmount'] = $invoice['totalNetAmount'] + $drafts[$key]['totalNetAmount'];
                    } else {
                        // Add the totalNetAmount to the invoices in the totals array
                        $totals[$key]['totalNetAmount'] = $invoice['totalNetAmount'];
                    }
                    // Add the department name to the totals array
                    $totals[$key]['id'] = $key;
                    $totals[$key]['name'] = $invoice['name'];

                }
                // Save the response
                $response->success(
                    $totals
                );

            } else {
                // Log the incident
                (new logs_o())->add('statistics', 'global', 0, 0, 'TOTAL_INCOME_TODAY_DEPARTMENTS', 'User requested total income today by departments');
                // Return an error
                $response->error('Invalid session', 400);
            }
        },
            [
                'statistics_economic_income_today_departments' => 'Get total income today by departments'
            ]
        );
    }
}