<?php
namespace App\Http\Controllers\Api\Self;

use App\Http\Requests\Api\User\DocumentStoreRequest;
use App\Http\Requests\Api\User\BankDetailsRequest;
use App\Http\Requests\Api\User\PersonalInfoRequest;

use App\Http\Controllers\ApiBaseController;
use Examyou\RestAPI\ApiResponse;
use App\Models\User;
use App\Models\EmployeeDocument;
use App\Models\DocumentCategory;
use App\Models\DocumentType;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Storage;


class EmployeeDetailsController extends ApiBaseController
{
    /**
     * Employee personal info
     */
    public function personalinfo()
    {
        $user = user();

        $userDetails = User::with(['department', 'designation', 'shift', 'location','reporter'])
            ->where("id", $user->id)
            ->first();

        // Attach effective weekoff rule resolved from history
        $weekoffRule = \App\Services\WeekoffService::getEffectiveRule($userDetails);

        $payload = [
            'data' => $userDetails,
            'weekoff_rule' => $weekoffRule,
        ];

        return ApiResponse::make('Data fetched', $payload);
    }
    public function updatePersonalInfo(PersonalInfoRequest $request)
    {
        $user = user();


        $user->update([
            'name'              => $request->name,
            'email'             => $request->email,
            'phone'             => $request->phone,
            'personal_email'    => $request->personal_email,
            'personal_phone'    => $request->personal_phone,
            'gender'            => $request->gender,
            'dob'               => $request->dob,
            'is_married'        => $request->is_married,
            'marriage_date'     => $request->marriage_date,
            'adhar_card_number' => $request->adhar_card_number,
            'address'           => $request->address,
        ]);

        return ApiResponse::make('Personal info updated successfully', [
            'user' => $user
        ]);
    }
    public function updateBankDetails(BankDetailsRequest $request)
    {
        $user = user();


        $user->update([
            'account_holder_name' => $request->account_holder_name,
            'bank_name'           => $request->bank_name,
            'account_number'      => $request->account_number,
            'branch_name'         => $request->branch_name,
            'city'                => $request->city,
            'ifsc_code'           => $request->ifsc_code,
            'pan_number'          => $request->pan_number,
        ]);

        return ApiResponse::make('Bank details updated successfully', [
            'user' => $user
        ]);
    }


    public function storeDocument(DocumentStoreRequest $request)
    {
        $user = user();


        $doc = new EmployeeDocument();
        $doc->user_id          = $user->id;
        $doc->category_id      = $request->category_id;
        $doc->document_type_id = $request->document_type_id;
        $doc->title            = $request->title;
        $doc->description      = $request->description;
        $doc->file_path        = $request->user_document_url;
        $doc->document_id      = $request->id;
        $doc->uploaded_by      = $user->name;
        $doc->verification     = 'verified';
        $doc->save();

        return ApiResponse::make('Document uploaded successfully', [
            'data' => $doc
        ]);
    }

  
    public function delete($id)
    {  
        $doc = EmployeeDocument::findOrFail($id);

        if ($doc->file_path && Storage::disk('public')->exists($doc->file_path)) {
            Storage::disk('public')->delete($doc->file_path);
        }

        $doc->delete();

        return ApiResponse::make('Document deleted successfully');
    }

   
    public function allDocuments()
    {
        $user = user();

    
        $categories = DocumentCategory::select('id', 'name')->get();

        
        $uploadedDocs = EmployeeDocument::where('user_id', $user->id)->get();

    
        $uploadedTypeIds = $uploadedDocs->pluck('document_type_id')->toArray();

       
        $types = DocumentType::select('id', 'category_id', 'name')
            ->whereNotIn('id', $uploadedTypeIds)
            ->get()
            ->groupBy('category_id');

      
        $documents = $uploadedDocs
            ->load(['type:id,name', 'category:id,name', 'employee:id,name'])
            ->map(function ($doc) {
                return [
                    'id'            => $doc->id,
                    'document_id'   => $doc->document_id,
                    'document_type' => $doc->type?->name,
                    'category'      => $doc->category?->name,
                    'title'         => $doc->title,
                    'description'   => $doc->description,
                    'file_path'     => $doc->file_path,
                    'uploaded_by'   => $doc->uploaded_by,
                    'verification'  => $doc->verification,
                    'created_at'    => $doc->created_at->toDateString(),
                    'file_url'      => $doc->file_path ? asset('storage/' . $doc->file_path) : null,
                ];
            });

        return ApiResponse::make('Documents data fetched', [
            'categories'     => $categories,
            'category_types' => $types, 
            'documents'      => $documents,
        ]);
    }


}

