<?php

namespace App\Http\Controllers;

use App\Models\Hasil;
use App\MovingAverage;
use App\Models\Produk;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\DB;
class HitungController extends Controller
{
    function index()
    {
        $data['title'] = 'Perhitungan';
        $data['awal'] = get_var("SELECT MIN(tanggal) FROM tb_penjualan");
        $data['akhir'] = get_var("SELECT MAX(tanggal) FROM tb_penjualan");
        return view('hitung.index', $data);
    }
    public function hasilHitung(Request $request)
    {
        $data = [];
        $data['awal'] = $request->awal;
        $data['akhir'] = $request->akhir;
        $data['next_periode'] = 1;
        $data['moving_periode'] = $request->moving_periode;
        $data['title'] = "Hasil Perhitungan"; // Judul halaman

        // Ambil nilai pencarian dari input 'search'
        $data['q'] = $request->input('q');

        // Ambil semua produk dari model Produk
        $produks = Produk::all();
        $data['produks'] = [];

        // Loop untuk mengisi array $data['produks']
        foreach ($produks as $produk) {
            $data['produks'][$produk->kode_produk] = $produk->nama_produk;
        }

        // Inisialisasi query untuk hasil perhitungan
        $query = Hasil::query()
            ->where('periode', $data['moving_periode'])
            ->whereIn('kode_produk', array_keys($data['produks']));

        // Jika ada nilai pencarian, tambahkan kondisi pencarian
        if (!empty($data['q'])) {
            $query->where(function ($query) use ($data) {
                $query->where('kode_produk', 'like', '%' . $data['q'] . '%')
                      ->orWhere('tanggal', 'like', '%' . $data['q'] . '%')
                      ->orWhere('jumlah', 'like', '%' . $data['q'] . '%')
                      ->orWhere('mape', 'like', '%' . $data['q'] . '%');
            });
        }

        $data['rows'] = $query->get();

        return view('hitung.hitungHasil', $data);
    }
    function hasil(Request $request)
    {
        $data['q'] = $request->input('q');
        $data['kode_produk'] = $request->input('kode_produk');
        $data['title'] = 'Hasil Peramalan';
        $data['limit'] = 25;
        $query = Hasil::where(function ($query) use ($data) {
            $query->where('nama_produk', 'like', '%' . $data['q'] . '%')
                ->orWhere('tb_hasil.kode_produk', 'like', '%' . $data['q'] . '%')
                ->orWhere('tb_hasil.periode', 'like', '%' . $data['q'] . '%');
        })->leftJoin('tb_produk', 'tb_produk.kode_produk', '=', 'tb_hasil.kode_produk')
            ->orderBy('tanggal', 'DESC');
        if ($data['kode_produk'])
            $query->where('tb_produk.kode_produk', $data['kode_produk']);
        $data['rows'] = $query->paginate($data['limit'])->withQueryString();
        $data['no'] = $data['rows']->firstItem();
        return view('hitung.hasil', $data);
    }

    function detail(Request $request)
    {
        $data['awal'] = $request->awal;
        $data['akhir'] = $request->akhir;
        $data['next_periode'] = 1;
        $data['moving_periode'] = $request->moving_periode;
        $data['title'] = "Hasil Perhitungan"; //judul halaman
        $data['search'] = $request->input('search');
        $produks = Produk::all(); //mengambil semua produk
        $data['produks'] = array();
        foreach ($produks as $row) {
            $data['produks'][$row->kode_produk] = $row->nama_produk;
        }

        foreach ($data['produks'] as $kode_produk => $nama_produk) {
            $rows = get_results("SELECT MAX(tanggal) as tanggal, SUM(jumlah) AS total FROM tb_penjualan WHERE tanggal>='$data[awal]' AND tanggal<='$data[akhir]' AND kode_produk='$kode_produk' GROUP BY YEAR(tanggal), MONTH(tanggal)");

            $periode_data = array();
            foreach ($rows as $row) {
                $periode_data[$row->tanggal] = $row->total;
            }

            $ma = new MovingAverage($periode_data, $data['moving_periode'], $data['next_periode']);
            $max = max(array_keys($ma->yt));

            foreach ($ma->next_ft as $key => $val) {
                $tanggal = date('Y-m-d', strtotime("+$key month", strtotime($max)));
                $tahun = date('Y', strtotime("+$key month", strtotime($max)));
                $bulan = date('m', strtotime("+$key month", strtotime($max)));

                Hasil::where('kode_produk', $kode_produk)
                    ->where('periode', $data['moving_periode'])
                    ->whereMonth('tanggal', $bulan)
                    ->whereYear('tanggal', $tahun)
                    ->delete();

                $hasil = new Hasil([
                    'tanggal' => $tanggal,
                    'kode_produk' => $kode_produk,
                    'periode' => $data['moving_periode'],
                    'jumlah' => $val,
                    'mape' => $ma->error['MAPE'],
                ]);
                $hasil->save();

                            // Menambahkan logika kategori MAPE
                $akurasi = '';
                if ($ma->error['MAPE'] >= 0 && $ma->error['MAPE'] <= 0.10) {
                    $akurasi = 'Sangat Baik';
                } elseif ($ma->error['MAPE'] > 0.10 && $ma->error['MAPE'] <= 0.20) {
                    $akurasi = 'Baik';
                } elseif ($ma->error['MAPE'] > 0.20 && $ma->error['MAPE'] <= 0.50) {
                    $akurasi = 'Cukup Baik';
                } elseif ($ma->error['MAPE'] > 0.50) {
                    $akurasi = 'Sangat Buruk';
                }

                // Update hasil dengan kategori MAPE
                $hasil->akurasi = $akurasi;
                $hasil->save();
            }
        }
    // Ambil hasil dari database
    $query = Hasil::where('periode', $data['moving_periode'])
        ->whereIn('kode_produk', array_keys($data['produks']));

    // Apply search filter if present
    if (!empty($data['q'])) {
        $query->where(function ($search) use ($data) {
            $search->where('kode_produk', 'like', '%' . $data['q'] . '%')
              ->orWhere('tanggal', 'like', '%' . $data['q'] . '%')
              ->orWhere('jumlah', 'like', '%' . $data['q'] . '%')
              ->orWhere('mape', 'like', '%' . $data['q'] . '%');
        });
    }

    $data['results'] = $query->get()->groupBy('kode_produk');

        return view('hitung.hitungHasil', $data); //memanggil view hitung.hasil
    }



    function cetak(Request $request)
    {
        $moving_periode = 3;
        $data['moving_periode'] = $moving_periode;
        $data['title'] = "Hasil Perhitungan";
        $produks = Produk::all();
        $data['produks'] = [];
        foreach ($produks as $row) {
            $data['produks'][$row->kode_produk] = $row->nama_produk;
        }

        $data['results'] = Hasil::where('periode', $data['moving_periode'])
            ->whereIn('kode_produk', array_keys($data['produks']))
            ->get()
            ->groupBy('kode_produk');

        // Log data untuk memastikan data yang diterima


        return view('hitung.cetak', $data);
    }
}
