<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Meeting extends Model
{
    use HasFactory;

    protected $fillable = [
        'meeting_number',
        'meeting_type',
        'title',
        'agenda',
        'date',
        'time',
        'venue',
        'status',
        'minutes',
        'decisions',
        'created_by',
        'total_attendance',
        'total_absent'
    ];

    protected $casts = [
        'date' => 'date',
        'time' => 'datetime:H:i',
    ];

    // স্বয়ংক্রিয় মিটিং নম্বর জেনারেটর
    public static function generateMeetingNumber()
    {
        $year = date('Y');
        $month = date('m');
        $prefix = 'MTG';
        
        $lastMeeting = self::where('meeting_number', 'like', $prefix . '-' . $year . $month . '-%')
            ->orderBy('meeting_number', 'desc')
            ->first();
        
        if ($lastMeeting) {
            $lastNumber = intval(substr($lastMeeting->meeting_number, -3));
            $nextNumber = str_pad($lastNumber + 1, 3, '0', STR_PAD_LEFT);
        } else {
            $nextNumber = '001';
        }
        
        return $prefix . '-' . $year . $month . '-' . $nextNumber;
    }

    // বুট মেথড
    protected static function boot()
    {
        parent::boot();
        
        static::creating(function ($meeting) {
            if (empty($meeting->meeting_number)) {
                $meeting->meeting_number = self::generateMeetingNumber();
            }
        });
    }

    // রিলেশনশিপ: উপস্থিতি
    public function attendances()
    {
        return $this->hasMany(MeetingAttendance::class);
    }

    // রিলেশনশিপ: উপস্থিত সদস্য
    public function presentMembers()
    {
        return $this->hasMany(MeetingAttendance::class)
            ->where('attendance', 'present');
    }

    // রিলেশনশিপ: অনুপস্থিত সদস্য
    public function absentMembers()
    {
        return $this->hasMany(MeetingAttendance::class)
            ->where('attendance', 'absent');
    }

    // রিলেশনশিপ: সৃষ্টিকর্তা
    public function creator()
    {
        return $this->belongsTo(User::class, 'created_by');
    }

    // মিটিং টাইপ বাংলায়
    public function getMeetingTypeInBanglaAttribute()
    {
        $types = [
            'weekly' => 'সাপ্তাহিক',
            'monthly' => 'মাসিক',
            'special' => 'বিশেষ',
            'annual' => 'বার্ষিক'
        ];
        
        return $types[$this->meeting_type] ?? $this->meeting_type;
    }

    // স্ট্যাটাস বাংলায়
    public function getStatusInBanglaAttribute()
    {
        $statuses = [
            'scheduled' => 'নির্ধারিত',
            'ongoing' => 'চলমান',
            'completed' => 'সম্পন্ন',
            'cancelled' => 'বাতিল'
        ];
        
        return $statuses[$this->status] ?? $this->status;
    }

    // তারিখ এবং সময় একসাথে
    public function getDateTimeAttribute()
    {
        return $this->date->format('d/m/Y') . ' ' . $this->time->format('h:i A');
    }

    // তারিখ এবং সময় বাংলায়
    public function getDateTimeBanglaAttribute()
    {
        $banglaMonths = [
            'January' => 'জানুয়ারি',
            'February' => 'ফেব্রুয়ারি',
            'March' => 'মার্চ',
            'April' => 'এপ্রিল',
            'May' => 'মে',
            'June' => 'জুন',
            'July' => 'জুলাই',
            'August' => 'আগস্ট',
            'September' => 'সেপ্টেম্বর',
            'October' => 'অক্টোবর',
            'November' => 'নভেম্বর',
            'December' => 'ডিসেম্বর'
        ];
        
        $month = $this->date->format('F');
        $day = $this->date->format('d');
        $year = $this->date->format('Y');
        $time = $this->time->format('h:i A');
        
        $banglaMonth = $banglaMonths[$month] ?? $month;
        
        return $day . ' ' . $banglaMonth . ' ' . $year . ' - ' . $time;
    }

    // মিটিং সম্পন্ন মার্ক করুন
    public function markAsCompleted($minutes, $decisions)
    {
        $this->status = 'completed';
        $this->minutes = $minutes;
        $this->decisions = $decisions;
        
        // উপস্থিতি গণনা
        $this->total_attendance = $this->presentMembers()->count();
        $this->total_absent = $this->absentMembers()->count();
        
        $this->save();
        
        return $this;
    }
}