<?php

namespace App\Console\Commands;

use App\Models\AgencyManagementReport;
use App\Services\Mail\AgencyManagementMailSettingsManager;
use App\Services\Mail\AgencyManagementReportMailer;
use App\Services\Operations\AgencyManagementReportService;
use Illuminate\Console\Command;

class SendAgencyManagementReportCommand extends Command
{
    protected $signature = 'dw:send-agency-report
        {report? : Ajans yönetim raporu ID}
        {--period=weekly : daily, weekly veya monthly}
        {--to=* : Ek/manuel alıcı e-posta adresi}
        {--generate : Göndermeden önce yeni rapor oluştur}
        {--force : Otomatik gönderim kapalı olsa bile gönder}
        {--no-html : HTML eki gönderme}
        {--no-csv : CSV eki gönderme}';

    protected $description = 'Ajans yönetim/KPI raporunu yönetici alıcılarına mail olarak gönderir.';

    public function handle(
        AgencyManagementReportService $reports,
        AgencyManagementReportMailer $mailer,
        AgencyManagementMailSettingsManager $settings,
    ): int {
        $period = (string) $this->option('period');

        if (! $this->option('force') && ! $settings->autoEnabled($period)) {
            $this->warn('Bu dönem için otomatik ajans yönetim raporu gönderimi kapalı. --force ile manuel gönderebilirsiniz.');
            return self::SUCCESS;
        }

        $reportId = $this->argument('report');

        if ($reportId) {
            $report = AgencyManagementReport::find($reportId);
        } elseif ($this->option('generate')) {
            $report = $reports->generate(['period_type' => $period]);
        } else {
            $report = AgencyManagementReport::query()
                ->where('period_type', $period)
                ->where('status', 'completed')
                ->latest('generated_at')
                ->latest('id')
                ->first();
        }

        if (! $report) {
            $this->error('Gönderilecek ajans yönetim raporu bulunamadı. --generate ile yeni rapor oluşturabilirsiniz.');
            return self::FAILURE;
        }

        if ($report->status !== 'completed') {
            $this->error('Rapor tamamlanmamış durumda: '.$report->status);
            return self::FAILURE;
        }

        $log = $mailer->send($report, [
            'recipients' => $this->option('to'),
            'include_html' => ! $this->option('no-html'),
            'include_csv' => ! $this->option('no-csv'),
        ]);

        if ($log->status === 'failed') {
            $this->error('Mail gönderilemedi: '.$log->error_message);
            return self::FAILURE;
        }

        $this->info('Ajans yönetim raporu gönderildi. Mail log ID: '.$log->id);

        return self::SUCCESS;
    }
}
