<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Member extends Model
{
    protected $fillable = ['category_id', 'name', 'company', 'phone', 'email', 'expire_month_id', 'renewal_month_id'];

    public function payments()
    {
        return $this->hasMany(MembershipPayment::class);
    }

    public function referredVisitors()
    {
        return $this->hasMany(Visitor::class, 'referred_by_member_id');
    }

    public function category()
    {
        return $this->belongsTo(Category::class);  // Defines the inverse of the relationship
    }

    // Relationships for expire and renewal months
    public function expireSchedule()
    {
        return $this->belongsTo(Month::class, 'expire_month_id');
    }

    public function renewalSchedule()
    {
        return $this->belongsTo(Month::class, 'renewal_month_id');
    }

    /**
     * Get top referred members by month
     * Returns members with highest referral counts grouped by month
     */
    public static function getTopReferrersByMonth()
    {
        $months = Month::orderBy('year', 'desc')->orderBy('name', 'desc')->get();
        $topReferrers = [];

        foreach ($months as $month) {
            $startDate = strtotime("1 {$month->name} {$month->year}");
            $endDate = strtotime("last day of {$month->name} {$month->year}");

            $topReferrer = Member::withCount([
                'referredVisitors' => function ($query) use ($startDate, $endDate) {
                    $query->whereBetween('payment_date', [
                        date('Y-m-d', $startDate),
                        date('Y-m-d', $endDate)
                    ]);
                }
            ])
                ->orderByDesc('referred_visitors_count')
                ->first();

            if ($topReferrer && $topReferrer->referred_visitors_count > 0) {
                $topReferrers[] = [
                    'month' => $month->name,
                    'year' => $month->year,
                    'member' => $topReferrer,
                    'referral_count' => $topReferrer->referred_visitors_count,
                ];
            }
        }

        return $topReferrers;
    }

    /**
     * Get current month's top referrer
     */
    public static function getCurrentMonthTopReferrer()
    {
        $currentMonth = Month::getCurrentMonth();

        if (!$currentMonth) {
            return null;
        }

        $startDate = strtotime("1 {$currentMonth->name} {$currentMonth->year}");
        $endDate = strtotime("last day of {$currentMonth->name} {$currentMonth->year}");

        return Member::withCount([
            'referredVisitors' => function ($query) use ($startDate, $endDate) {
                $query->whereBetween('payment_date', [
                    date('Y-m-d', $startDate),
                    date('Y-m-d', $endDate)
                ]);
            }
        ])
            ->orderByDesc('referred_visitors_count')
            ->first();
    }

    public function toCleanArray()
    {
        return [
            'id' => $this->id,
            'category_id' => $this->category_id,
            'name' => $this->name,
            'company' => $this->company,
            'phone' => $this->phone,
            'email' => $this->email,
            'expire_month_id' => $this->expire_month_id,
            'renewal_month_id' => $this->renewal_month_id,
            'category' => $this->category ? [
                'id' => $this->category->id,
                'name' => $this->category->name,
            ] : null,
            'expire_month' => $this->expireSchedule ? [
                'id' => $this->expireSchedule->id,
                'name' => $this->expireSchedule->name,
                'year' => $this->expireSchedule->year,
            ] : null,
            'renewal_month' => $this->renewalSchedule ? [
                'id' => $this->renewalSchedule->id,
                'name' => $this->renewalSchedule->name,
                'year' => $this->renewalSchedule->year,
            ] : null,
        ];
    }
}
