<?php

namespace App\Console\Commands;

use Illuminate\Console\Command;
use App\Models\Bidders;
use App\Models\CarShowCategory;
use App\Models\CarShowWinner;
use App\Models\PeoplesChoice;
use App\Models\Vehicles;
use App\Models\VehicleScores;
use Illuminate\Support\Facades\DB;


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

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = 'Tabulate Show Winners, and add them to the CarShowWinner table';

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

    /**
     * Execute the console command.
     *
     * @return mixed
     */

    public function handle()
    {
        function bestInShowWinner()
        {
            $bestInShowWinnerQuery = VehicleScores::join('vehicles', 'vehicle_scores.vehicle', '=', 'vehicles.id')
                ->groupBy('vehicles.id')
                ->selectRaw('*, sum(vehicle_scores.overall_score) as totalscore')
                ->whereNotIn('vehicle_scores.vehicle', function($query){
                    $query->select('vehicle')->from('car_show_winners');
                })
                ->where('vehicles.doNotJudge', '=', 0)
                ->orderBy('totalscore','desc')
                ->first();
            return $bestInShowWinnerQuery->vehicle;        
        }  
        
        function bestInShow2ndWinner()
        {
            $bestInShow2ndWinnerQuery = VehicleScores::join('vehicles', 'vehicle_scores.vehicle', '=', 'vehicles.id')
                ->groupBy('vehicles.id')
                ->selectRaw('*, sum(vehicle_scores.overall_score) as totalscore')
                ->whereNotIn('vehicle_scores.vehicle', function($query){
                    $query->select('vehicle')->from('car_show_winners');
                })
                ->where('vehicles.doNotJudge', '=', 0)
                ->orderBy('totalscore','desc')
                ->first();
            return $bestInShow2ndWinnerQuery->vehicle;        
        }  

        function pcWinner()
        {
            $peoplesChoiceWinnerQuery = PeoplesChoice::join('vehicles', 'peoples_choice.vehicle', '=', 'vehicles.id')
                ->groupBy('peoples_choice.vehicle')
                ->selectRaw('*, sum(pc_count) as totalscore')
                ->whereNotIn('vehicle', function($query){
                    $query->select('vehicle')->from('car_show_winners');
                })
                ->where('vehicles.doNotJudge', '=', 0)
                ->orderBy('totalscore','desc')
                ->first();
            return $peoplesChoiceWinnerQuery->vehicle;
        }   

        function pc2ndWinner()
        {
            $peoplesChoice2ndWinnerQuery = PeoplesChoice::join('vehicles', 'peoples_choice.vehicle', '=', 'vehicles.id')
                ->groupBy('peoples_choice.vehicle')
                ->selectRaw('*, sum(pc_count) as totalscore')
                ->whereNotIn('vehicle', function($query){
                    $query->select('vehicle')->from('car_show_winners');
                })
                ->where('vehicles.doNotJudge', '=', 0)
                ->orderBy('totalscore','desc')
                ->first();
            return $peoplesChoice2ndWinnerQuery->vehicle;
        }   

       function zeroTo42Winner()
        {
            $zeroTo43Query = VehicleScores::join('vehicles', 'vehicle_scores.vehicle', '=', 'vehicles.id')
                ->groupBy('vehicles.id')
                ->selectRaw('*, sum(vehicle_scores.overall_score) as totalscore')
                ->whereNotIn('vehicle_scores.vehicle', function($query){
                    $query->select('vehicle')->from('car_show_winners');
                })
                ->where('vehicles.year', '>=', 0)
                ->where('vehicles.year', '<=', 1942)
                ->where('vehicles.doNotJudge', '=', 0)
                ->orderBy('totalscore','desc')
                ->first();
            return $zeroTo43Query->vehicle;
        }

        function fortyThreeToSixtyNineWinner()
        {
            $fortyThreeToSixtyNineQuery = VehicleScores::join('vehicles', 'vehicle_scores.vehicle', '=', 'vehicles.id')
                ->groupBy('vehicles.id')
                ->selectRaw('*, sum(vehicle_scores.overall_score) as totalscore')
                ->whereNotIn('vehicle_scores.vehicle', function($query){
                    $query->select('vehicle')->from('car_show_winners');
                })
                ->where('vehicles.year', '>=', 1943)
                ->where('vehicles.year', '<=', 1969)
                ->where('vehicles.doNotJudge', '=', 0)
                ->orderBy('totalscore','desc')
                ->first();
            return $fortyThreeToSixtyNineQuery->vehicle;
        }

        function seventyToTwoThousandWinner()
        {
            $seventyToTwoThousandQuery = VehicleScores::join('vehicles', 'vehicle_scores.vehicle', '=', 'vehicles.id')
                ->groupBy('vehicles.id')
                ->selectRaw('*, sum(vehicle_scores.overall_score) as totalscore')
                ->whereNotIn('vehicle_scores.vehicle', function($query){
                    $query->select('vehicle')->from('car_show_winners');
                })
                ->where('vehicles.year', '>=', 1970)
                ->where('vehicles.year', '<=', 2000)
                ->where('vehicles.doNotJudge', '=', 0)
                ->orderBy('totalscore','desc')
                ->first();
            return $seventyToTwoThousandQuery->vehicle;
        }

        function TwoThousandOneToCurrentWinner()
        {
            $TwoThousandOneToCurrentQuery = VehicleScores::join('vehicles', 'vehicle_scores.vehicle', '=', 'vehicles.id')
                ->groupBy('vehicles.id')
                ->selectRaw('*, sum(vehicle_scores.overall_score) as totalscore')
                ->whereNotIn('vehicle_scores.vehicle', function($query){
                    $query->select('vehicle')->from('car_show_winners');
                })
                ->where('vehicles.year', '>=', 2001)
                //->where('vehicles.year', '<=', 1997)
                ->where('vehicles.doNotJudge', '=', 0)
                ->orderBy('totalscore','desc')
                ->first();
            return $TwoThousandOneToCurrentQuery->vehicle;
        }

        // Truncate table first
        CarShowWinner::truncate();
        //Insert Best In Show Winner
        CarShowWinner::updateOrCreate(
            [
                'category' => '6',
                'place' => 'first'
            ],
            [
                'vehicle' => bestInShowWinner()
            ]
        );

        //Insert People's Choice Winner
        CarShowWinner::updateOrCreate(
            [
                'category' => '3',
                'place' => 'first'
            ],
            [
                'vehicle' => pcWinner()
            ]
        );

        //Insert Year Award Winners
        //0-1942
        CarShowWinner::updateOrCreate(
                [
                    'category' => '17',
                    'place' => 'first'
                ],
                [
                    'vehicle' => zeroTo42Winner()
                ]
            );
        CarShowWinner::updateOrCreate(
                [
                    'category' => '17',
                    'place' => 'second'
                ],
                [
                    'vehicle' => zeroTo42Winner()
                ]
            );
        CarShowWinner::updateOrCreate(
                [
                    'category' => '17',
                    'place' => 'third'
                ],
                [
                    'vehicle' => zeroTo42Winner()
                ]
            );
        //1943-1969
        CarShowWinner::updateOrCreate(
                [
                    'category' => '18',
                    'place' => 'first'
                ],
                [
                    'vehicle' => fortyThreeToSixtyNineWinner()
                ]
            );
        CarShowWinner::updateOrCreate(
                [
                    'category' => '18',
                    'place' => 'second'
                ],
                [
                    'vehicle' => fortyThreeToSixtyNineWinner()
                ]
            );  
        CarShowWinner::updateOrCreate(
                [
                    'category' => '18',
                    'place' => 'third'
                ],
                [
                    'vehicle' => fortyThreeToSixtyNineWinner()
                ]
            );  

        //1970-2000
        CarShowWinner::updateOrCreate(
            [
                'category' => '20',
                'place' => 'first'
            ],
            [
                'vehicle' => seventyToTwoThousandWinner()
            ]
        );
        CarShowWinner::updateOrCreate(
            [
                'category' => '20',
                'place' => 'second'
            ],
            [
                'vehicle' => seventyToTwoThousandWinner()
            ]
        );  
        CarShowWinner::updateOrCreate(
            [
                'category' => '20',
                'place' => 'third'
            ],
            [
                'vehicle' => seventyToTwoThousandWinner()
            ]
        );  

        //2001-Current
        CarShowWinner::updateOrCreate(
            [
                'category' => '19',
                'place' => 'first'
            ],
            [
                'vehicle' => TwoThousandOneToCurrentWinner()
            ]
        );
        CarShowWinner::updateOrCreate(
            [
                'category' => '19',
                'place' => 'second'
            ],
            [
                'vehicle' => TwoThousandOneToCurrentWinner()
            ]
        );  
        CarShowWinner::updateOrCreate(
            [
                'category' => '19',
                'place' => 'third'
            ],
            [
                'vehicle' => TwoThousandOneToCurrentWinner()
            ]
        );  
    }
}
