<?php

namespace App\Console\Commands;

use Illuminate\Console\Command;
use Carbon\Carbon;
use Illuminate\Support\Facades\DB;
use App\Models\ProductStock;
use App\Models\MonthlyStockBalance;
use App\Models\User; // Tambahkan ini

class StockClose extends Command
{
    protected $signature = 'stock:close';
    protected $description = 'Mengunci saldo akhir stok bulan lalu untuk keperluan laporan.';

    public function handle()
    {
        // Tentukan periode yang akan ditutup (Akhir bulan lalu)
        $closeDate = Carbon::now()->subMonth()->endOfMonth()->startOfDay(); 
        
        $this->info("Memulai proses Stock Closure untuk periode: {$closeDate->format('d F Y')}...");

        // Ambil User ID pertama (biasanya owner/admin) sebagai penanggung jawab sistem
        $systemUser = User::where('role', 'owner')->first() ?? User::first();

        if (!$systemUser) {
            $this->error("Stock Closure GAGAL: Tidak ada user ditemukan di database.");
            return 1;
        }

        // Ambil semua record ProductStock yang ada (saldo real-time)
        $stocks = ProductStock::all(); 

        try {
            DB::transaction(function () use ($stocks, $closeDate, $systemUser) {
                $count = 0;
                
                foreach ($stocks as $stock) {
                    // Cek apakah saldo bulan ini sudah pernah dikunci
                    $existing = MonthlyStockBalance::where('product_id', $stock->product_id)
                        ->where('branch_id', $stock->branch_id)
                        ->whereDate('period', $closeDate)
                        ->exists();

                    if (!$existing) {
                        MonthlyStockBalance::create([
                            'product_id' => $stock->product_id,
                            'branch_id' => $stock->branch_id,
                            'period' => $closeDate,
                            'last_stock_qty' => $stock->quantity,
                            'user_id' => $systemUser->id, // TAMBAHKAN INI UNTUK MEMPERBAIKI ERROR
                        ]);
                        $count++;
                    }
                }
                $this->info("Total {$count} saldo produk berhasil dikunci.");
            });

            $this->info('Stock Closure berhasil dijalankan.');
            return 0;

        } catch (\Exception $e) {
            $this->error("Stock Closure GAGAL: " . $e->getMessage());
            return 1;
        }
    }
}