<?php

namespace App\Http\Controllers\Admins\Dashboard;

use App\Helpers\ResponseFormatter;
use App\Http\Controllers\Controller;
use App\Models\Pengeluaran;
use App\Models\Pesanan;
use Carbon\Carbon;
use Illuminate\Http\Request;

class CalculationController extends Controller
{

    public function getCalculationPendapatan()
    {
        $pendapatanBulan = $this->calculatePendapatanBulan();
        $pendapatanMinggu = $this->calculatePendapatanMinggu();
        $pendapatanHari = $this->calculatePendapatanHari();
        // dd($pendapatanMinggu);
        return ResponseFormatter::success(['pendapatanBulan' => $pendapatanBulan, 'pendapatanMinggu' => $pendapatanMinggu, 'pendapatanHari' => $pendapatanHari]);
    }

    private function calculatePendapatanBulan()
    {
        // tanggal bulan ini
        $first_day_of_the_current_month = Carbon::today()->startOfMonth();
        $last_day_of_the_current_month = $first_day_of_the_current_month->copy()->endOfMonth();

        // tanggal bulan lalu
        $first_day_of_the_previous_month = $first_day_of_the_current_month->copy()->subMonth()->startOfMonth();
        $last_day_of_the_previous_month = $first_day_of_the_current_month->copy()->subMonth()->endOfMonth();

        // get data jumlah penjualan keseluruhan dalam satu bulan
        $penjualanSatuBulan = Pesanan::whereBetween('tanggal_pesanan', [$first_day_of_the_current_month, $last_day_of_the_current_month])->sum('grand_total');
        $penjualanBulanLalu = Pesanan::whereBetween('tanggal_pesanan', [$first_day_of_the_previous_month, $last_day_of_the_previous_month])->sum('grand_total');

        /**
         * @Author: xelz
         * @Date: 2024-01-30 15:52:41
         * @Desc: constant status
         * 1 netral
         * 2 plus
         * 3 minus
         */
        $statusCalculation = 1;

        // calculate percentage of sales growth in the last month and this month
        if ($penjualanBulanLalu != 0) {
            $statusCalculation = 2;
            $percentageOfSalesGrowth = ($penjualanSatuBulan - $penjualanBulanLalu) / $penjualanBulanLalu * 100;
            // minus or not
            if ($percentageOfSalesGrowth < 0) {
                $statusCalculation = 3;
                $percentageOfSalesGrowth = $percentageOfSalesGrowth * -1;
            }
        } else {
            $statusCalculation = 1;
            $percentageOfSalesGrowth = 0;
        }

        return  [
            'penjualanSatuBulan' => $penjualanSatuBulan,
            'penjualanBulanLalu' => $penjualanBulanLalu,
            'statusCalculation' => $statusCalculation,
            'percentageOfSalesGrowth' => $percentageOfSalesGrowth
        ];
    }

    private function calculatePendapatanMinggu()
    {
        // tanggal minggu ini
        $first_day_of_the_current_week = Carbon::today()->startOfWeek();
        $last_day_of_the_current_week = $first_day_of_the_current_week->copy()->endOfWeek();
        // dd($last_day_of_the_current_week);
        // tanggal minggu lalu
        $first_day_of_the_previous_week = $first_day_of_the_current_week->copy()->subWeek()->startOfWeek();
        $last_day_of_the_previous_week = $first_day_of_the_current_week->copy()->subWeek()->endOfWeek();

        // get data jumlah penjualan keseluruhan dalam satu minggu
        $penjualanSatuMinggu = Pesanan::whereBetween('tanggal_pesanan', [$first_day_of_the_current_week, $last_day_of_the_current_week])->sum('grand_total');
        $penjualanMingguLalu = Pesanan::whereBetween('tanggal_pesanan', [$first_day_of_the_previous_week, $last_day_of_the_previous_week])->sum('grand_total');

        /**
         * @Author: xelz
         * @Date: 2024-01-30 15:52:41
         * @Desc: constant status
         * 1 netral
         * 2 plus
         * 3 minus
         */
        $statusCalculation = 1;

        // calculate percentage of sales growth in the last week and this week
        if ($penjualanMingguLalu != 0) {
            $statusCalculation = 2;
            $percentageOfSalesGrowth = ($penjualanSatuMinggu - $penjualanMingguLalu) / $penjualanMingguLalu * 100;
            // minus or not
            if ($percentageOfSalesGrowth < 0) {
                $statusCalculation = 3;
                $percentageOfSalesGrowth = $percentageOfSalesGrowth * -1;
            }
        } else {
            $statusCalculation = 1;
            $percentageOfSalesGrowth = 0;
        }

        return  [
            'penjualanSatuMinggu' => $penjualanSatuMinggu,
            'penjualanMingguLalu' => $penjualanMingguLalu,
            'statusCalculation' => $statusCalculation,
            'percentageOfSalesGrowth' => $percentageOfSalesGrowth
        ];
    }

    private function calculatePendapatanHari()
    {
        // tanggal hari ini
        $first_day_of_the_current_day = Carbon::today()->startOfDay();

        $last_day_of_the_current_day = $first_day_of_the_current_day->copy()->endOfDay();

        // tanggal kemarin
        $first_day_of_the_previous_day = $first_day_of_the_current_day->copy()->subDay()->startOfDay();
        $last_day_of_the_previous_day = $first_day_of_the_current_day->copy()->subDay()->endOfDay();

        // get data jumlah penjualan keseluruhan dalam satu bulan
        $penjualanHariIni = Pesanan::whereBetween('tanggal_pesanan', [$first_day_of_the_current_day, $last_day_of_the_current_day])->sum('grand_total');
        $penjualanKemarin = Pesanan::whereBetween('tanggal_pesanan', [$first_day_of_the_previous_day, $last_day_of_the_previous_day])->sum('grand_total');

        /**
         * @Author: xelz
         * @Date: 2024-01-30 15:52:41
         * @Desc: constant status
         * 1 netral
         * 2 plus
         * 3 minus
         */
        $statusCalculation = 1;

        // calculate percentage of sales growth in the last month and this month
        if ($penjualanKemarin != 0) {
            $statusCalculation = 2;
            $percentageOfSalesGrowth = ($penjualanHariIni - $penjualanKemarin) / $penjualanKemarin * 100;
            // minus or not
            if ($percentageOfSalesGrowth < 0) {
                $statusCalculation = 3;
                $percentageOfSalesGrowth = $percentageOfSalesGrowth * -1;
            }
        } else {
            $statusCalculation = 1;
            $percentageOfSalesGrowth = 0;
        }

        return  [
            'penjualanHariIni' => $penjualanHariIni,
            'penjualanKemarin' => $penjualanKemarin,
            'statusCalculation' => $statusCalculation,
            'percentageOfSalesGrowth' => $percentageOfSalesGrowth
        ];
    }

    private function calculatePengeluaranBulan()
    {
        // tanggal bulan ini
        $first_day_of_the_current_month = Carbon::today()->startOfMonth();
        $last_day_of_the_current_month = $first_day_of_the_current_month->copy()->endOfMonth();

        // tanggal bulan lalu
        $first_day_of_the_previous_month = $first_day_of_the_current_month->copy()->subMonth()->startOfMonth();
        $last_day_of_the_previous_month = $first_day_of_the_current_month->copy()->subMonth()->endOfMonth();

        // get data jumlah pengeluaran keseluruhan dalam satu bulan
        $pengeluaranSatuBulan = pengeluaran::whereBetween('tanggal', [$first_day_of_the_current_month, $last_day_of_the_current_month])->sum('nominal');
        $pengeluaranBulanLalu = pengeluaran::whereBetween('tanggal', [$first_day_of_the_previous_month, $last_day_of_the_previous_month])->sum('nominal');

        /**
         * @Author: xelz
         * @Date: 2024-01-30 15:52:41
         * @Desc: constant status
         * 1 netral
         * 2 plus
         * 3 minus
         */
        $statusCalculation = 1;

        // calculate percentage of sales growth in the last month and this month
        if ($pengeluaranBulanLalu != 0) {
            $statusCalculation = 2;
            $percentageOfSalesGrowth = ($pengeluaranSatuBulan - $pengeluaranBulanLalu) / $pengeluaranBulanLalu * 100;
            // minus or not
            if ($percentageOfSalesGrowth < 0) {
                $statusCalculation = 3;
                $percentageOfSalesGrowth = $percentageOfSalesGrowth * -1;
            }
        } else {
            $statusCalculation = 1;
            $percentageOfSalesGrowth = 0;
        }

        return  [
            'pengeluaranSatuBulan' => $pengeluaranSatuBulan,
            'pengeluaranBulanLalu' => $pengeluaranBulanLalu,
            'statusCalculation' => $statusCalculation,
            'percentageOfSalesGrowth' => $percentageOfSalesGrowth
        ];
    }

    private function calculatePengeluaranHari()
    {
        // tanggal hari ini
        $first_day_of_the_current_day = Carbon::today()->startOfDay();

        $last_day_of_the_current_day = $first_day_of_the_current_day->copy()->endOfDay();

        // tanggal kemarin
        $first_day_of_the_previous_day = $first_day_of_the_current_day->copy()->subDay()->startOfDay();
        $last_day_of_the_previous_day = $first_day_of_the_current_day->copy()->subDay()->endOfDay();

        // get data jumlah pengeluaran keseluruhan dalam satu bulan
        $pengeluaranHariIni = Pengeluaran::whereBetween('tanggal', [$first_day_of_the_current_day, $last_day_of_the_current_day])->sum('nominal');
        $pengeluaranKemarin = pengeluaran::whereBetween('tanggal', [$first_day_of_the_previous_day, $last_day_of_the_previous_day])->sum('nominal');

        /**
         * @Author: xelz
         * @Date: 2024-01-30 15:52:41
         * @Desc: constant status
         * 1 netral
         * 2 plus
         * 3 minus
         */
        $statusCalculation = 1;

        // calculate percentage of sales growth in the last month and this month
        if ($pengeluaranKemarin != 0) {
            $statusCalculation = 2;
            $percentageOfSalesGrowth = ($pengeluaranHariIni - $pengeluaranKemarin) / $pengeluaranKemarin * 100;

            // minus or not
            if ($percentageOfSalesGrowth < 0) {
                $statusCalculation = 3;
                $percentageOfSalesGrowth = $percentageOfSalesGrowth * -1;
            }
        } else {
            $statusCalculation = 1;
            $percentageOfSalesGrowth = 0;
        }

        return  [
            'pengeluaranHariIni' => $pengeluaranHariIni,
            'pengeluaranKemarin' => $pengeluaranKemarin,
            'statusCalculation' => $statusCalculation,
            'percentageOfSalesGrowth' => $percentageOfSalesGrowth
        ];
    }
}