<?php

use Illuminate\Support\Facades\Session;
use Mews\Purifier\Facades\Purifier;

class BackEndController extends Controller {

    public function __construct() {
        $this->beforeFilter('csrf', array('except' => 'bandLogout'));
    }

    public function bandLogin() {

        if (BandAuth::attempt(Input::except(['_token', 'lang']))) {

            return Redirect::to(route('reserved'));
        }

        return Redirect::back()->withErrors([
                    'general' => trans('frontend.login-fail'),
        ]);
    }

    public function bandLogout() {
        BandAuth::logout();

        return Redirect::back();
    }

    protected function filter($input) {
//        $filtered = trim(htmlentities(strip_tags($input)));;
//        $filtered = htmlspecialchars($filtered, ENT_QUOTES, 'UTF-8');

        $filtered = Purifier::clean($input);
        return $filtered;
    }

    public function participate() {


        //check if the for is being submitted using admin override
        $adminOverride = false;
        if (Input::has('adminOverride')) {
            $adminOverride = boolval(Input::only('adminOverride'));
        }


        if (Contest::status() !== 'participate' && $adminOverride==false) {
            return App::abort(500);
        }

        $data = Input::except('_token', 'adminOverride');
        //dd($data);
        //clear all the data from tags or script injection
        if (count($data) > 0) {
            foreach ($data as $idx => $item) {
                if ($idx == 'image') {
                    continue;
                }
                if (!is_array($item)) {
                    $data[$idx] = $this->filter($item);
                } else {
                    foreach ($item as $idxItem => $subitem) {
                        $data[$idx][$idxItem] = $this->filter($subitem);
                    }
                }
            }
        }

        if (!array_key_exists('names', $data) || !array_key_exists('functions', $data)) {
            return Response::json(array(
                        'status' => 500,
                        'errors' => ['generic' => 'Ocorreu um erro.']
            ));
        }

        $members = [];

        foreach ($data['names'] as $index => $name) {
            if ($name === '' || $data['functions'][$index] === '') {
                break;
            }

            array_push($members, [
                'name' => $name,
                'function' => $data['functions'][$index]
            ]);
        }

        if (!count($members)) {

            return Response::json(array(
                        'status' => 500,
                        'errors' => ['generic' =>
                            [trans('errors.more_than_one_member')]
                        ]
            ));
        }

        $rules = Band::rules();
        if (Contest::getEdition() === 'pt-BR') {
            $rules['state'] = 'required|max:255';
        }
        $rules['email'] .= '|unique:bands';
        $rules['alternative_email'] .= '|unique:bands';
        $validator = Validator::make($data, $rules);


        if ($validator->fails() || !Input::hasFile('image')) {
            return Response::json(array(
                        'status' => 500,
                        'errors' => array_merge($validator->messages()->toArray(), ['generic' =>
                            trans('frontend.generic-error')
                        ])
            ));
        }
        unset($data['agree']);
        unset($data['data_policy_accept']);
        unset($data['functions']);
        unset($data['names']);
        unset($data['lang']);
        unset($data['accept_video_recording']);
        unset($data['accept_image_usage']);


        //checking the submitted image for binaty validity
        $submittedImageObj = Input::file('image');
        $submittedImagePath = $submittedImageObj->getPathName();
        $imageData = file_get_contents($submittedImagePath);
        try {
            imagecreatefromstring($imageData);
        } catch (Exception $e) {
            $errors = [
                'image' => [
                    trans('errors.image_format')
                ],
                'generic' => trans('frontend.generic-error')
            ];
            return Response::json(array(
                        'status' => 500,
                        'errors' => $errors
            ));
        }




        $data['slug'] = Str::slug($data['name']);

        $extension = Input::file('image')->getClientOriginalExtension();

        $original_name = Input::file('image')->getClientOriginalName();
        $name = $data['slug'];

        $path = public_path() . '/uploads/band-images';

//        $i = 1;
//        while (file_exists($path . '/' . $name . ".$extension")) {
//
//            if (preg_match('/\-\d{1,}$/', $name, $count)) {
//                $count = substr(head($count), 1);
//                $name = preg_replace('/\-\d{1,}$/', (string) '-' . ($count + 1), $name);
//            } else {
//                $name .= "-$i";
//            }
//
//            $i++;
//        }
        $name = $name . ".$extension";

        $image = Input::file('image')->move($path, $name);

        unset($data['image']);
        $data['password'] = Hash::make($data['password']);
        try {
            $band = Band::create($data);

            try {

                if (file_exists($image->getPathName())) {
                    $band->addToMediaSlot('image', $image->getPathName());
                    $band->generateImageTypes();
                }
            } catch (Exception $e) {
                abort(503);
            }

            foreach ($members as $member) {
                BandMember::create(array_merge($member, ['band_id' => $band->id]));
            }
        } catch (\Exception $e) {
            return Response::json(array(
                        'status' => 500,
                        'errors' => ['generic' => 'Não foi possível salvar a tua banda - .' . $e->getMessage()]
            ));
        }

        return Response::json(array(
                    'status' => 200,
                    'msg' => 'Tudo jóia'
        ));
    }

    public function registerToVote() {
        $data = Input::only('email');

        Validator::extend('more_disposable_emails', function($attribute, $value, $parameters) {
            if (strpos($value, '@') === false)
                return false;

            list($local_part, $domain) = explode('@', $value);

            if (!$domain)
                return false;

            $invalidDomains = Config::get('invalid-email-domains');

            if (in_array($domain, $invalidDomains)) {
                return false;
            }

            return true;
        });

        $data['email'] = Purifier::clean($data['email']);
        $validator = Validator::make($data, array(
                    'email' => 'required|email|more_disposable_emails',
        ));

        if ($validator->fails()) {
            return Redirect::back()
                            ->withErrors($validator)
                            ->withInput()
                            ->with(array(
                                'fail' => true,
            ));
        }

        unset($data['lang']);

        $voter = Voter::firstOrCreate($data);
        $voter->token = sha1(str_random(20));
        $voter->save();

        $voter->sendToken(Input::get('band_id'));

        return Redirect::back();
    }

    public function vote() {
        $status = Contest::status();


        if (empty(Auth::user()->id)) {
            return App::abort(500);
        }

        //the band is always set in the band controller
        if (empty(Session::get('viewing_band'))) {
            return App::abort(500);
        }

        if (!in_array($status, array('participate', 'vote', 'semi-final'))) {
            return App::abort(500);
        }

        //Session::forget('_token'); // Allow posting of vote only once per page load

        $data = Input::except('_token');
        $data['phase'] = $status === 'semi-final' ? 'semi-final' : 'initial';
        $data['voter_id'] = Auth::user()->id;
        $data['band_id'] = Session::get('viewing_band');

        Session::forget('viewing_band');

        unset($data['lang']);

        $vote = Vote::firstOrNew($data);

        if (!$vote->exists) {
            $vote->ip = Request::getClientIp();
            $vote->save();

            return Response::json(array(
                        'success' => true,
            ));
        }

        return Response::json(array(
                    'success' => false,
        ));
    }
}
