<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use App\Models\Activity;
use App\Models\Link;
use DateTime;

class VersionGantt extends Model
{
    protected $table = 'm_version_gantt';

    const CREATED_AT = 'created_at';
    const UPDATED_AT = 'updated_at';

    protected $fillable = [
        'name_version',
        'description',
        'date_base_line',
        'proyek_id',
        'config_dayoff',
        'auto_schedule',
        'calculation_type',
        'committed_cost',
        'cost_to_complete',
        'progress',
        'bobot',
        'hierarchy_ftth_id',
        'created_at',
        'created_by',
        'updated_at',
        'updated_by'
    ];

  public static function boot() {
		parent::boot();

		static::updated(function($data) {
			$data->updateActDuration();
        });

    static::deleted(function ($data) {
      $activities = Activity::where('version_gantt_id', $data->id)->get();
      foreach ($activities as $activity) {
        $activity->delete();
      }
		});
	}

    public function updateActDuration(){
      $daysOff = explode(',', $this->config_dayoff);
      if (in_array('0', $daysOff)) {
        $key = array_search('0', $daysOff, false);
        $daysOff[$key] = '7';
      }
      $activities = Activity::where('version_gantt_id', $this->id)->get();
      foreach ($activities as $value) {
        $exist = Link::where('t_activity_id', $value->id)->exists();
        $startDate = new DateTime($value->start_date);
        $endDate = new DateTime($value->end_date);
        $duration = $endDate->diff($startDate)->days + 1;
        if ($exist) {
          $duration--;
        }

        // Iterate through each day and subtract the days off
        for ($i = 0; $i < $duration; $i++) {
            $currentDate = clone $startDate;
            $currentDate->modify("+$i day");

            $currentDayOfWeek = $currentDate->format('N'); // Get the day of the week (1 - Monday, 7 - Sunday)

            if (in_array($currentDayOfWeek, $daysOff)) {
                $duration--; // Subtract one day from the duration for each day off
            }
        }

        // Update the activity duration
        $value->duration = $duration;
        $value->save();
      }
    }
}