<?php

namespace App\Payment;

use App\Pdf\BillType;
use App\Pdf\PdfGenerator;
use App\Pdf\PdfRepositoryFactory;
use App\Pdf\RememberType;
use Illuminate\Console\Command;
use Mail;

class PaymentSendCommand extends Command
{
    /**
     * The name and signature of the console command.
     *
     * @var string
     */
    protected $signature = 'payment:send';

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = 'Sends Bills';

    /**
     * Create a new command instance.
     *
     * @return void
     */
    public function __construct()
    {
        parent::__construct();
    }

    /**
     * Execute the console command.
     *
     * @return int
     */
    public function handle()
    {
        $this->sendBills();
        $this->sendRemembers();

        return 0;
    }

    private function sendBills(): void
    {
        $repos = app(PdfRepositoryFactory::class)->repoCollection(BillType::class, 'E-Mail');

        foreach ($repos as $repo) {
            $generator = app(PdfGenerator::class)->setRepository($repo)->render();
            $to = (object) [
                'email' => $repo->getEmail($repo->pages->first()),
                'name' => $repo->getFamilyName($repo->pages->first()),
            ];
            Mail::to($to)->send(new PaymentMail($repo, $generator->getCompiledFilename()));
            app(PdfRepositoryFactory::class)->afterSingle($repo);
        }
    }

    private function sendRemembers(): void
    {
        $repos = app(PdfRepositoryFactory::class)->repoCollection(RememberType::class, 'E-Mail');

        foreach ($repos as $repo) {
            $generator = app(PdfGenerator::class)->setRepository($repo)->render();
            $to = (object) [
                'email' => $repo->getEmail($repo->pages->first()),
                'name' => $repo->getFamilyName($repo->pages->first()),
            ];
            Mail::to($to)->send(new PaymentMail($repo, $generator->getCompiledFilename()));
            app(PdfRepositoryFactory::class)->afterSingle($repo);
        }
    }
}