<?php

namespace App\PackagesAdmin\Capsule\Services;

use App\Packages\Capsule\Models\Capsule;
use Carbon\Carbon;

class CapsuleExportService {

    public static function csvExport()
    {
        ini_set('max_execution_time', 180);

        $capsules = Capsule::query()
            ->select([
                'table_capsule.*',
                'table_user.nickname',
                'table_user.phone_number',
                'table_address.full_string as address',
                'preview.aws_key as preview_key',
                'video.aws_key as video_key',
                'thumbnail.aws_key as thumbnail_key',
                'teaser.aws_key as teaser_key',
            ])
            ->leftJoin('table_user', 'table_user.id', '=', 'table_capsule.user_id')
            ->leftJoin('table_address', 'table_address.id', '=', 'table_capsule.address_id')
            ->leftJoin('table_capsule_preview as preview', 'preview.id', '=', 'table_capsule.preview_id')
            ->leftJoin('table_capsule_video as video', 'video.id', '=', 'table_capsule.video_id')
            ->leftJoin('table_capsule_preview as thumbnail', 'thumbnail.id', '=', 'table_capsule.thumbnail_id')
            ->leftJoin('table_capsule_teaser as teaser', 'teaser.id', '=', 'table_capsule.teaser_id')
            ->orderBy('table_capsule.id', 'DESC')
            ->get();

        $now = new Carbon('now');
        $file_name = 'capsule_'.$now->format('d_m_y').'.csv';

        $headers = [
            "Content-type" => "text/csv",
            "Content-Disposition" => "attachment; filename={$file_name}",
            "Pragma" => "no-cache",
            "Cache-Control" => "must-revalidate, post-check=0, pre-check=0",
            "Expires" => "0"
        ];

        $columns = [
            'ID',
            'UUID',
            'Username',
            'Status', // 0 - Opened | 1 - Hatched | 2 - Locked
            'Caption',
            'Address',
            'Preview',
            'Video',
            'Thumbnail',
            'Teaser',
            'Is Complete',
            'Is Private',
            'Is Blocked',
            'Count likes',
            'Count comments',
            'Count subscribers',
            'Count tagged users',
            'Count reports',
            'Open At',
            'Created at',
            'Updated at',
            'Search position',
            'Suggested type',
            'Suggested position'
        ];

        $callback = function () use ($columns, $capsules) {
            $file = fopen('php://output', 'w');
            fputcsv($file, $columns);

            foreach ($capsules as $capsule) {

                $suggested_type = 'Default';
                if ($capsule->search_setting == 1) $suggested_type = 'For all';
                if ($capsule->search_setting == 2) $suggested_type = 'For new';

                fputcsv($file, [
                    $capsule->id,
                    $capsule->uuid,
                    ($capsule->nickname)?:$capsule->phone_number,
                    $capsule->capsuleStatus,
                    $capsule->caption,
                    $capsule->address,
                    $capsule->preview_key,
                    $capsule->video_key,
                    $capsule->thumbnail_key,
                    $capsule->teaser_key,
                    ($capsule->is_complete) ? 'True' : 'False',
                    ($capsule->is_private) ? 'True' : 'False',
                    ($capsule->is_blocked) ? 'True' : 'False',
                    $capsule->count_likes,
                    $capsule->count_comments,
                    $capsule->count_subscribers,
                    $capsule->count_tagged_users,
                    $capsule->count_reports,
                    ($capsule->open_at) ? $capsule->open_at->format('Y-m-d H:i:s') : '',
                    ($capsule->created_at) ? $capsule->created_at->format('Y-m-d H:i:s') : '',
                    ($capsule->updated_at) ? $capsule->updated_at->format('Y-m-d H:i:s') : '',
                    $capsule->search_position,
                    $suggested_type,
                    $capsule->suggested_position
                ]);
            }

            fclose($file);
        };

        return response()->stream($callback, 200, $headers);

    }

}