<?php



namespace App\Controllers;



use App\Models\StaffModel;
use App\Models\GroupModel;



class JobController extends BaseController

{

    protected $staffModel;



    public function __construct()

    {

        $this->staffModel = new StaffModel();

    }

    

    public function index()

    {

        $staff = $this->staffModel->findAll();

        return view('job_view', ['staff' => $staff]);

    }

    public function getJobsByGroup($groupId)
{
    // ตรวจสอบว่ากลุ่มที่เลือกมีอยู่หรือไม่
    $group = $this->groupModel->find($groupId);
    if (!$group) {
        return $this->response->setJSON([
            'status' => 'error',
            'message' => 'ไม่พบกลุ่มที่เลือก'
        ]);
    }

    // ดึงพนักงานที่อยู่ในกลุ่มนี้
    $staff = $this->staffModel
        ->select('id, name, current_jobs')
        ->where('group_id', $groupId)
        ->orderBy('id', 'ASC')
        ->findAll();

    // ตรวจสอบว่ามีพนักงานในกลุ่มหรือไม่
    if (empty($staff)) {
        return $this->response->setJSON([
            'status' => 'error',
            'message' => 'ไม่มีพนักงานในกลุ่มนี้'
        ]);
    }

    return $this->response->setJSON([
        'status' => 'success',
        'data' => $staff
    ]);
}



    /**

     * คำนวณและจัดการตัดงาน

     */

public function redistributeJobs()
{
    // 1. ดึงข้อมูลพนักงานทั้งหมด
    $staff = $this->staffModel
        ->select('id, name, current_jobs')
        ->where('current_jobs >', 0) // ดึงเฉพาะพนักงานที่มียอดงานมากกว่า 0
        ->orderBy('id', 'ASC')
        ->findAll();

    // 2. ตรวจสอบว่ามีพนักงานที่มียอดงานหรือไม่
    $readyStaffCount = count($staff);
    if ($readyStaffCount === 0) {
        return $this->response->setJSON([
            'status' => 'error',
            'message' => 'ไม่มีพนักงานที่มียอดงาน'
        ]);
    }

    // 3. รวมยอด current_jobs ทั้งหมด
    $totalJobs = array_sum(array_column($staff, 'current_jobs'));

    // 4. คำนวณ ready_dispose (งานเฉลี่ยต่อพนักงาน)
    $readyDispose = intdiv($totalJobs, $readyStaffCount);

    $actions = []; // เก็บ action รายละเอียดการตัดงาน

    // 5. กระจายงานแบบต่อคิว
    foreach ($staff as $giverIndex => &$giver) {
        if ($giver['current_jobs'] <= $readyDispose) {
            continue; // ข้ามพนักงานที่ไม่มียอดเกิน
        }

        while ($giver['current_jobs'] > $readyDispose) {
            $negativeBalance = $giver['current_jobs'] - $readyDispose;

            // หา receiver คนถัดไป
            $receiverIndex = $giverIndex + 1;
            if ($receiverIndex >= $readyStaffCount) {
                break; // ไม่มีพนักงานถัดไป
            }

            $receiver = &$staff[$receiverIndex];
            $transferJobs = $negativeBalance; // โอนงานส่วนเกินทั้งหมดให้คนถัดไป

            // บันทึก action
            $actions[] = [
                'giver' => $giver['name'],
                'receiver' => $receiver['name'],
                'action' => "{$giver['name']} ตัดงานให้ {$receiver['name']} จำนวน {$transferJobs} ตัว"
            ];

            // อัปเดตยอดงาน
            $giver['current_jobs'] -= $transferJobs;
            $receiver['current_jobs'] += $transferJobs;

            // หยุดลูปเมื่อโอนงานส่วนเกินทั้งหมด
            break;
        }
    }

    // 6. ส่งผลลัพธ์ในรูปแบบ JSON
    return $this->response->setJSON([
        'status' => 'success',
        'data' => [
            'staff' => $staff,
            'total_jobs' => $totalJobs,
            'ready_dispose' => $readyDispose,
            'actions' => $actions
        ]
    ]);
}



public function getStaffMembers()

{

    $staff = $this->staffModel->select('id, name')->findAll();



    if (empty($staff)) {

        return $this->response->setJSON(['status' => 'error', 'message' => 'ไม่พบข้อมูลพนักงาน']);

    }



    return $this->response->setJSON(['status' => 'success', 'data' => $staff]);

}



    /**

     * อัปเดตยอดงานของพนักงาน

     */

    public function assignJobToStaff()

    {

        $staffId = $this->request->getPost('staff_id');

        $jobCount = $this->request->getPost('job_count');



        if (!$staffId || !$jobCount) {

            return $this->response->setJSON(['status' => 'error', 'message' => 'กรุณากรอกข้อมูลให้ครบถ้วน']);

        }



        $staff = $this->staffModel->find($staffId);



        if (!$staff) {

            return $this->response->setJSON(['status' => 'error', 'message' => 'ไม่พบข้อมูลพนักงาน']);

        }



        // อัปเดตยอดงานในฐานข้อมูล

        $this->staffModel->update($staffId, ['current_jobs' => $jobCount]);



        return $this->response->setJSON(['status' => 'success', 'message' => 'อัปเดตยอดงานสำเร็จ']);

    }

}

