<?php

namespace App\Http\Controllers;

use Auth;
use DB;
use Illuminate\Http\Request;

use App\Models\Moon\Moon;

use Seat\Eseye\Cache\NullCache;
use Seat\Eseye\Configuration;
use Seat\Eseye\Containers\EsiAuthentication;
use Seat\Eseye\Eseye;

use App\Library\MoonCalc;

class MoonsController extends Controller
{
    public function __construct() {
        $this->middleware('auth');
        $this->middleware('role:User');
    }

    /**
     * Function to display the moons to admins
     */
    public function displayMoonsAdmin() {
        //Setup calls to the MoonCalc class
        $moonCalc = new MoonCalc();
        //Update the prices for the moon
        $moonCalc->FetchNewPrices();
        //get all of the moons from the database
        $moons = DB::table('Moons')->orderBy('System', 'asc')->get();
        //declare the html variable and set it to null
        $html = '';
        foreach($moons as $moon) {
            //Setup formats as needed
            $spm = $moon->System . ' - ' . $moon->Planet . ' - ' . $moon->Moon;
            $rentalEnd = date('m/d/Y', $moon->RentalEnd);
            $price = $moonCalc->SpatialMoonsOnlyGoo($moon->FirstOre, $moon->FirstQuantity, $moon->SecondOre, $moon->SecondQuantity, 
                                                    $moon->ThirdOre, $moon->ThirdQuantity, $moon->FourthOre, $moon->FourthQuantity);
            //Add the data to the html string to be passed to the view
            $html .= '<tr>';
            $html .= '<td>' . $spm . '</td>';
            $html .= '<td>' . $moon->StructureName . '</td>';
            $html .= '<td>' . $moon->FirstOre . '</td>';
            $html .= '<td>' . $moon->FirstQuantity . '</td>';
            $html .= '<td>' . $moon->SecondOre . '</td>';
            $html .= '<td>' . $moon->SecondQuantity . '</td>';
            $html .= '<td>' . $moon->ThirdOre . '</td>';
            $html .= '<td>' . $moon->ThirdQuantity . '</td>';
            $html .= '<td>' . $moon->FourthOre . '</td>';
            $html .= '<td>' . $moon->FourthQuantity . '</td>';
            $html .= '<td>' . $price['alliance'] . '</td>';
            $html .= '<td>' . $price['outofalliance'] . '</td>';
            $html .= '<td>' . $moon->RentalCorp . '</td>';
            $html .= '<td>' . $rentalEnd . '</td>';
            $html .= '</tr>';
        }

        return view('moons.adminmoon')->with('html', $html);
    }

    /**
     * Function to display the moons and pass data to the blade template
     */
    public function displayMoons() {
        //Get the user type from the user Auth class
        $type = Auth::user()->user_type;
        //Setup calls to the MoonCalc class
        $moonCalc = new MoonCalc();
        //Update the prices for the moon
        $moonCalc->FetchNewPrices();
        //get all of the moons from the database
        $moons = DB::table('Moons')->orderBy('System', 'asc')->get();
        //declare the html variable and set it to null
        $html = '';
        foreach($moons as $moon) {
            //Setup formats as needed
            $spm = $moon->System . ' - ' . $moon->Planet . ' - ' . $moon->Moon;
            $rentalEnd = date('m/d/Y', $moon->RentalEnd);
            $price = $moonCalc->SpatialMoonsOnlyGoo($moon->FirstOre, $moon->FirstQuantity, $moon->SecondOre, $moon->SecondQuantity, 
                                                    $moon->ThirdOre, $moon->ThirdQuantity, $moon->FourthOre, $moon->FourthQuantity);
            //Add the data to the html string to be passed to the view
            $html .= '<tr>';
            $html .= '<td>' . $spm . '</td>';
            $html .= '<td>' . $moon->StructureName . '</td>';
            $html .= '<td>' . $moon->FirstOre . '</td>';
            $html .= '<td>' . $moon->FirstQuantity . '</td>';
            $html .= '<td>' . $moon->SecondOre . '</td>';
            $html .= '<td>' . $moon->SecondQuantity . '</td>';
            $html .= '<td>' . $moon->ThirdOre . '</td>';
            $html .= '<td>' . $moon->ThirdQuantity . '</td>';
            $html .= '<td>' . $moon->FourthOre . '</td>';
            $html .= '<td>' . $moon->FourthQuantity . '</td>';
            if($type == 'W4RP') {
                $html .= '<td>' . $price['alliance'] . '</td>';
            } else if ($type == 'Legacy') {
                $html .= '<td>' . $price['outofalliance'] . '</td>';
            } else {
                $html .= '<td>N/A</td>';
            }
            $html .= '<td>' . $moon->RentalCorp . '</td>';
            $html .= '<td>' . $rentalEnd . '</td>';
            $html .= '</tr>';
        }

        return view('moons.moon')->with('html', $html);
    }

    public function addMoon() {
        $this->middleware('role:SuperUser');
        return view('moons.addmoon');
    }

    /**
     * Add a new moon into the database
     * 
     * @return \Illuminate\Http\Reponse
     */
    public function storeMoon(Request $request) {
        $this->middleware('role:SuperUser');
        $this->validate($request, [
            'region' => 'required',
            'system' => 'required',
            'structure' => 'required',
        ]);

        if($request->input('firstquan') < 1.00) {
            $firstQuan = $request->input('firstquan') * 100.00;
        } else {
            $firstQuan = $request->input('firstquan');
        }

        if($request->input('secondquan') < 1.00) {
            $firstQuan = $request->input('secondquan') * 100.00;
        } else {
            $firstQuan = $request->input('secondquan');
        }

        if($request->input('thirdquan') < 1.00) {
            $firstQuan = $request->input('thirdquan') * 100.00;
        } else {
            $firstQuan = $request->input('thirdquan');
        }

        if($request->input('fourthquan') < 1.00) {
            $firstQuan = $request->input('fourthquan') * 100.00;
        } else {
            $firstQuan = $request->input('fourthquan');
        }

        // Add new moon
        $moon = new Moon;
        $moon->Region = $request->input('region');
        $moon->System = $request->input('system');
        $moon->Planet = $request->input('planet');
        $moon->Moon = $request->input('moon');
        $moon->StructureName = $request->input('structure');
        $moon->FirstOre = $request->input('firstore');
        $moon->FirstQuantity = $request->input('firstquan');
        $moon->SecondOre = $request->input('secondore');
        $moon->SecondQuantity = $request->input('secondquan');
        $moon->ThirdOre = $request->input('thirdore');
        $moon->ThirdQuantity = $request->input('thirdquan');
        $moon->FourthOre = $request->input('fourthore');
        $moon->FourthQuantity = $request->input('fourthquan');
        $moon->save();

        return redirect('/dashboard')->with('success', 'Moon Added');
    }

    public function updateMoon() {
        $this->middleware('role:Admin');
        return view('moons.updatemoon');
    }

    public function storeUpdateMoon(Request $request) {
        $this->middleware('role:Admin');
        $this->validate($request, [
            'system' => 'required',
            'planet' => 'required',
            'moon' => 'required',
            'renter' => 'required',
            'date' => 'required'
        ]);

        $date = strtotime($request->date . '00:00:01');
        //Update the database entry
        DB::table('Moons')
            ->where([
                ['System', '=',  $request->system], 
                ['Planet', '=', $request->planet], 
                ['Moon', '=', $request->moon]
            ])
            ->update([
                'RentalCorp' => $request->renter,
                'RentalEnd' => $date,
            ]);

        return redirect('/moons/display')->with('success', 'Moon Updated');
    }

    public function displayTotalWorthForm() {
        return view('moons.formTotalWorth');
    }

    public function displayTotalWorth(Request $request) {
        $firstOre = $request->firstOre;
        $firstQuantity = $request->firstQuantity;
        $secondOre = $request->secondOre;
        $secondQuantity = $request->secondQuantity;
        $thirdOre = $request->thirdOre;
        $thirdQuantity = $request->thirdQuantity;
        $fourthOre = $request->fourthOre;
        $fourthQuantity = $request->fourthQuantity;

        //Setup calls to the MoonCalc class
        $moonCalc = new MoonCalc();
        //Update the prices for the moon
        $moonCalc->FetchNewPrices();

        $totalGoo = $moonCalc->SpatialMoonsOnlyGooTotalWorth($firstOre, $firstQuantity,
                                                             $secondOre, $secondQuantity,
                                                             $thirdOre, $thirdQuantity,
                                                             $fourthOre, $fourthQuantity);
        $totalGoo = number_format($totalGoo, 2, ".", ",");

        $totalWorth = $moonCalc->SpatialMoonsTotalWorth($firstOre, $firstQuantity,
                                                        $secondOre, $secondQuantity,
                                                        $thirdOre, $thirdQuantity,
                                                        $fourthOre, $fourthQuantity);
        $totalWorth = number_format($totalWorth, 2, ".", ",");

        return view('moons.displayTotalWorth')->with(['totalWorth' => $totalWorth, 'totalGoo' => $totalGoo]);
    }
}
