<?php

namespace App\Http\Controllers\Api;

use App\Http\Controllers\ApiBaseController;
use App\Models\EmployeeWeekoffHistory;
use App\Models\StaffMember;
use App\Models\WeekoffRule;
use Carbon\Carbon;
use Examyou\RestAPI\ApiResponse;
use Illuminate\Http\Request;

class EmployeeWeekoffController extends ApiBaseController
{
    /**
     * Assign weekoff rule to multiple employees (append-only history)
     * POST /employees/weekoff/assign
     */
    public function assign(Request $request)
    {
        $this->validate($request, [
            'employee_ids' => 'required|array',
            'employee_ids.*' => 'required|string',
            'weekoff_rule_id' => 'nullable|string',
            'effective_date' => 'required|date',
            'remark' => 'nullable|string',
        ]);

        $company = company();
        $actor = user();

        $rule = null;
        if ($request->filled('weekoff_rule_id')) {
            $ruleId = $this->getIdFromHash($request->weekoff_rule_id);
            $rule = WeekoffRule::where('is_active', true)->find($ruleId);
            if (!$rule) {
                return ApiResponse::error('Weekoff rule not found or inactive.');
            }
            if ($company && $rule->company_id !== $company->id) {
                return ApiResponse::error('Weekoff rule does not belong to your company.');
            }
        }

        $effective = Carbon::parse($request->effective_date)->format('Y-m-d');

        $created = [];

        foreach ($request->employee_ids as $xid) {
            try {
                $empId = $this->getIdFromHash($xid);
                $employee = StaffMember::find($empId);
                if (!$employee) {
                    continue;
                }
        
                $history = EmployeeWeekoffHistory::updateOrCreate(
                    [
                        'employee_id'    => $employee->id,
                        'effective_date' => $effective,  // UNIQUE KEY
                    ],
                    [
                        'weekoff_rule_id' => $rule?->id,
                        'assigned_by'     => $actor?->id,
                        'remark'          => $request->remark,
                        'company_id'      => $employee->company_id ?? $company?->id,
                    ]
                );
        
                $created[] = $history;
        
            } catch (\Exception $e) {
                continue;
            }
        }
        

        return ApiResponse::make('Weekoff assignments created', $created);
    }

    /**
     * Get weekoff assignment history for an employee
     * GET /employees/{xid}/weekoff/history
     */
    public function history($xid)
    {
        $employeeId = $this->getIdFromHash($xid);
        $employee = StaffMember::findOrFail($employeeId);
// 
        $histories = EmployeeWeekoffHistory::with(['rule:id,name','assignedBy:id,name'])
            ->where('employee_id', $employee->id)
            ->orderByDesc('effective_date')
            ->get();

        return ApiResponse::make('Employee weekoff history',['data' => $histories]);
    }
}
