<?php
  use Carbon\Carbon;
  use File;

  class AdminExportController extends Controller
  {

    public function __construct()
    {
      $this->beforeFilter('csrf', ['on' => ['post', 'delete']]);
    }

    public function getIndex()
    {

      // Just in case.
      $user = Auth::backend()->user();
      if (!$user || !$user->hasPermission("cms.manage")) {
        App::abort(403, Lang::get("http_status.403"));
      }

      return View::make('admin/pages/export');
    }

    public function getSubmit()
    {
//      $startDate = Input::get('start_date');
//      $endDate = Input::get('end_date');

      $user = Auth::backend()->user();
      if (!$user || !$user->hasPermission("cms.manage")) {
        App::abort(403, Lang::get("http_status.403"));
      }

      $users = $this->_getSubmissions();
      $excelFile = $this->_prepareExcelFile($users);

      return;
    }

    public function getUserSubmissionImage()
    {
      // Just in case.
      $user = Auth::backend()->user();
      if (!$user || !$user->hasPermission("cms.manage")) {
        App::abort(403, Lang::get("http_status.403"));
      }

      $userId = Input::get('id');
      $userImage = GalleryService::getShareImage($userId);

      return View::make('admin/pages/user_finalimage', ['userImage' => $userImage]);
    }

    private function _getSubmissions()
    {
      $query = User::full()
        ->join('submissions', 'users.id', '=', 'submissions.user_id')
        ->select('users.*')
        ->whereNotNull('submissions.final_image_id')
        ->with(
          [
            'tracking',
            'submission' => function ($query) {
              $query->full()->with('finalImage')
                ->whereNotNull('submissions.final_image_id');
            }
          ]
        );

      $users = $query->get();

      \DB::flushQueryLog();

      return $users;
    }

    private function _prepareExcelFile($users)
    {
      Excel::create('SubmissionExport', function ($excel) use ($users) {
        $excel->sheet('Submissions', function ($sheet) use ($users) {
          $firstRow =
            [
              'User ID',
              'User Email',
              'User Language',
              'Email Opt Out',
              'Image Treated',
              'Image Original',
              'TimeStamp',
              'User Hash',
              'Hard Bounced',
              'Hard Bounced Reason'
            ];

          $sheet->row(1, $firstRow);
          $sheet->freezeFirstRow();

          $sheet->cells('A1:K1', function ($cells) {

            // manipulate the range of cells
            $cells->setFont([
              'size' => '16',
              'bold' => TRUE
            ]);
          });


          foreach ($users as $user) {
//            Item:
//              Email
//              Language
//              Newsletter
//              Submission Image
//              Submission Date (15-01-2001 15:25)

            $userSubmission = $user->submission;

            try {
              $item = [
                $user->id,
                $user->email,
                $user->submission_language_id,
                $user->newsletter,
                !is_null($userSubmission) ? '/treated/' . $userSubmission->finalImage->filename : NULL,
                !is_null($userSubmission) ? '/original/' . $userSubmission->originalImage->filename : NULL,
                !is_null($userSubmission) ? Carbon::createFromFormat('Y-m-d H:i:s', $userSubmission->created_at)->format('d-m-Y H:i') : NULL,
                $user->tracking->hash,
                $user->hard_bounced,
                $user->hard_bounced_reason
              ];

              // Prepare Final Images
              $finalImagePublic = getMediaPublic($userSubmission->finalImage->filename);
              $finalImagePublicPath = getMediaPublicTreated($userSubmission->finalImage->filename);


              // Prepare Original Images
              $originalImagePublic = getMediaPublic($userSubmission->originalImage->filename);
              $originalImagePublicPath = getMediaPublicOriginal($userSubmission->originalImage->filename);

              File::copy($finalImagePublic, $finalImagePublicPath);
              File::copy($originalImagePublic, $originalImagePublicPath);

            } catch (\Exception $exception) {
            }

            $sheet->fromArray([$item], NULL, 'A2', FALSE, FALSE);
          }
        });

        $excel->sheet('SubmissionsResults', function ($sheet) use ($users) {
          $firstRow =
            [
              'Total Submissions',
            ];

          $sheet->row(1, $firstRow);
          $sheet->freezeFirstRow();

          $sheet->cells('A1', function ($cells) {

            // manipulate the range of cells
            $cells->setFont([
              'size' => '16',
              'bold' => TRUE
            ]);
          });

          $item = [
            $users->count()
          ];
          $sheet->fromArray([$item], NULL, 'A2', FALSE, FALSE);
        });
      })->download('xls');

      return;
    }
  }
