<?php

namespace App\Console\Commands;

use Illuminate\Console\Command;
use App\Models\Product;
use App\Models\ProductStock;
use App\Models\StockTransaction;
use App\Models\Branch;
use Illuminate\Support\Facades\DB;

class RecalculateStockCommand extends Command
{
    /**
     * The name and signature of the console command.
     *
     * @var string
     */
    protected $signature = 'stock:recalculate';

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = 'Sinkronisasi ulang total stok di tabel product_stocks berdasarkan riwayat transaksi';

    /**
     * Execute the console command.
     */
    public function handle()
    {
        $this->info('Memulai sinkronisasi ulang stok...');

        // PERBAIKAN: Mengambil SEMUA produk dari master, bukan hanya dari transaksi
        // Agar produk baru yang belum ada transaksi tetap muncul di laporan (stok 0)
        $productIds = Product::pluck('id');

        if ($productIds->isEmpty()) {
            $this->warn('Tidak ada produk yang ditemukan di database.');
            return;
        }

        $branches = Branch::all();

        if ($branches->isEmpty()) {
            $this->error('Tidak ada data cabang ditemukan. Proses dibatalkan.');
            return;
        }

        $this->withProgressBar($productIds, function ($productId) use ($branches) {
            foreach ($branches as $branch) {
                // 1. Hitung total qty dari semua transaksi yang pernah terjadi
                $totalQuantity = StockTransaction::where('product_id', $productId)
                    ->where('branch_id', $branch->id)
                    ->sum('actual_quantity');

                // 2. Pastikan baris stok tercipta (Update jika ada, Create jika belum ada)
                // Ini adalah kunci agar semua varian muncul di Laporan Posisi Stok
                ProductStock::updateOrCreate(
                    [
                        'product_id' => $productId,
                        'branch_id' => $branch->id,
                    ],
                    [
                        'quantity' => $totalQuantity ?? 0,
                        'updated_at' => now(),
                    ]
                );
            }
        });

        $this->newLine();
        $this->info('Sinkronisasi selesai! Semua produk sekarang memiliki baris stok di laporan.');
    }
}