<?php

namespace App\Http\Controllers;

use App\Models\Item;
use App\Models\ItemSale;
use App\Models\DeleteLog;
use App\Models\CategoryCustomer;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Log;
use DB;
use Auth;

class ItemSaleController extends Controller
{
    public function index()
    {
        $itemSales = ItemSale::all();
        return response()->json($itemSales);
    }

    public function store(Request $request)
    {
        DB::beginTransaction();
        try {
            $itemSale = ItemSale::create($request->all());
            $itemSale->created_by = Auth::user()->id;
            $itemSale->updated_by = Auth::user()->id;
            $itemSale->save();
            DB::commit();
        } catch (\Exception $e) {
            DB::rollback();
            return response()->json(['error' => $e->getMessage()], 500);
        }
        return response()->json($itemSale, 200);
    }

    public function show($id)
    {
        $itemSale = ItemSale::findOrFail($id);
        return response()->json($itemSale);
    }

    public function update(Request $request, $id)
    {
        DB::beginTransaction();
        try {
            $itemSale = ItemSale::findOrFail($id);
            $itemSale->update($request->all());
            $itemSale->updated_by = Auth::user()->id;
            $itemSale->save();
            DB::commit();
            return response()->json(ItemSale::with(["category_customer","item","unit"])->where("id",$id)->first());
        } catch (\Exception $e) {
            DB::rollback();
            return response()->json(['error' => $e->getMessage()], 500);
        }
    }

    public function destroy(Request $request, $id)
    {
        DB::beginTransaction();
        try {
            $itemSale = ItemSale::findOrFail($id);
            $itemSale->delete();

            DeleteLog::create([
                'document_number' => $itemSale->id,
                'document_date' => now(),
                'delete_notes' => $request->delete_notes ?? 'No notes provided',
                'company_code' => null,
                'department_code' => null,
                'deleted_by' => Auth::check() ? Auth::user()->name : 'system',
                'type' => 'Master Item Sales',
            ]);
            DB::commit();
            return response()->json(null, 204);
        } catch (\Exception $e) {
            DB::rollback();
            return response()->json(['error' => $e->getMessage()], 500);
        }
    }

    public function getMasterData()
    {
        try {
            $data = [
                'item' => Item::with([
                    'baseUnit',
                    'itemDetails.unit'
                ])->orderBy('item_code')->get(),
                'sales' => ItemSale::with(['item','unit','category_customer'])->get(),
                'category_customers' => CategoryCustomer::select('id', 'category_customer_code', 'category_customer_name')->get(),
                'role' => $this->getRole(),
            ];
            return response()->json($data);
        } catch (\Exception $e) {
            return response()->json(['error' => 'Failed to fetch master data'], 500);
        }
    }
}
