<?php

namespace App\Http\Controllers\Admin;

use App\Http\Controllers\Controller;
use App\Pincode;
use App\PincodeClassification;
use App\StateModel;
use Carbon\Carbon;
use Illuminate\Http\Response;
use Illuminate\Support\Facades\Session;
use Illuminate\Support\Facades\DB;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use App\Exports\PincodeExport;
use Maatwebsite\Excel\Facades\Excel;

class PincodeController extends Controller
{

    public function getPincodes(){

        $totalcount = Pincode::count();
        $pincodes = Pincode::paginate(20);
        return view('admin/pincodes/index',['pincodes'=>$pincodes,'totalcount'=>$totalcount]);

    }

    public function getApprovePincodes(Request $request){
        $query = PincodeClassification::query();
        
        $type = $request->get('type', 'all');
        if($type !== 'all' && $type !== null) {
            if ($type == 'positive') {
                $query->positive();
            } elseif ($type == 'negative') {
                $query->negative();
            } elseif ($type == 'risky') {
                $query->risky();
            }
        }
        
        $pincode_search = $request->get('pincode');
        if($pincode_search) {
            $query->where('pincode', 'like', "%{$pincode_search}%");
        }

        // Handle Excel/CSV Export
        if($request->has('export')) {
            $format = strtolower($request->get('export'));
            if(in_array($format, ['csv', 'xls', 'xlsx'])) {
                $pincodes = $query->orderBy('id', 'DESC')->get();
                $exportData = [];
                
                foreach ($pincodes as $pincode) {
                    $typeName = 'Unknown';
                    if($pincode->type === 0) $typeName = 'Negative';
                    if($pincode->type === 1) $typeName = 'Positive';
                    if($pincode->type === 2) $typeName = 'Risky';
                    
                    $exportData[] = [
                        $pincode->pincode,
                        $typeName,
                        $pincode->state,
                        $pincode->city,
                        $pincode->area,
                        $pincode->location,
                        $pincode->comment,
                        $pincode->level,
                        $pincode->agency_name,
                        $pincode->created_at,
                    ];
                }

                $fileName = 'pincodes_' . date('Y_m_d_His') . '.' . $format;
                return Excel::download(new PincodeExport($exportData), $fileName);
            }
        }

        $totalcount = $query->count();
        $pincodes = $query->orderBy('id', 'DESC')->paginate(20);
        return view('admin/approve-pincode/index',['pincodes'=>$pincodes,'totalcount'=>$totalcount, 'type' => $type, 'pincode_search' => $pincode_search]);

    }

    public function find(Request $request)
    {
        $term = trim($request->q);
        $state = $request->has("state") ? $request->get('state') : '';
        $city = $request->has("city") ? $request->get('city') : '';

        if (empty($term)) {
            return Response::json(['anupam']);
        }

        $search_query = Pincode::where('pincode','like','%' . $term . '%');

        $city_search = function ($query) use ($city){
            $query->where('districtname', 'like', '%' . $city . '%')
                ->orWhere('taluk', 'like', '%' . $city . '%');
        };

        if(isset($state) && $state !== '' && isset($city) && $city !== ''){
            $search_query->where('state', 'like', '%' . $state . '%')->where($city_search);
        } else if(isset($state) && $state !== ''){
            $search_query->where('state', 'like', '%' . $state . '%');
        } else if(isset($city) && $city !== ''){
            $search_query->where($city_search);
        }

        $pincodes = $search_query->get();
        $pincodeArray = [];
        $formatted_tags = [];

        foreach ($pincodes as $pincode) {
            if(!in_array($pincode->pincode, $pincodeArray)) {
                $formatted_tags[] = ['id' => $pincode->pincode, 'text' => $pincode->pincode];
                $pincodeArray[] = $pincode->pincode;
            }
        }

        return Response::json($formatted_tags);
    }

    public function addPincode(Request $request){

        //get request to addPincode method without the key is a get request which will only return the state list
        $data['state_list'] = StateModel::get(['name','code','id']);

        //If the request has key pincode means it is a post(insert) request
        if($request->has('pincode')) {

            $validate = [
                'pincode' => 'required|digits:6|unique:pincodes',
                'state' => 'required'
            ];
            $request->validate($validate);
//          $validator->withInput();

            /*if ($validator->fails()) // on validator found any error
            {
                // pass validator object in withErrors method & also withInput it should be null by default
                return redirect('admin/pincodes/add')->withErrors($validator)->withInput();
            }*/

            $pincode = new Pincode();
            $pincode->created_at = Carbon::now()->toDateTimeString();
            //$lender->created_by = Auth::user()->id;
            $pincode->pincode = $request->get('pincode');
            $pincode->state = $request->get('state');
            $pincode->taluk = $request->get('taluka');
            $pincode->districtname = $request->get('district');

            $pincode->save();
            Session::flash('success', 'Pincode successfully added');
            return redirect()->back();
        }
        return view('admin/pincodes/add', $data);

    }

    public function getEditPincode($id)
    {
        $data['state_list'] = StateModel::get(['name', 'code', 'id']);
        $data['pincode'] = Pincode::where('id', $id)->first();

        return view('admin/pincodes/add', $data);
    }


    public function editPostPincode(Request $request , $id){

        $validate = [
            'pincode' => 'required|digits:6',
            'state' => 'required'
        ];
        $request->validate($validate);

        $validate = DB::table("pincodes")->where('id','!=',$id)->where('pincode','=',$request->get('pincode'))->first();
        if(!isset($validate->id)){
            $pincode = Pincode::find($id);
            $pincode->updated_at = Carbon::now()->toDateTimeString();
            //$lender->created_by = Auth::user()->id;
            $pincode->pincode = $request->get('pincode');
            $pincode->state = $request->get('state');
            $pincode->taluk = $request->get('taluka');
            $pincode->districtname = $request->get('district');

            $pincode->save();
            Session::flash('success', 'Pincode successfully updated');
            return redirect('admin/pincodes');
        }else{
            return redirect()->back()->withErrors(['This Pincode Already Exists']);
        }
    }

    public function uploadMasterPincode(Request $request)
    {
        $file = $request->file('pincode_file');
        $userId = Auth::user() ? Auth::user()->id : '!Session';
        $url = rtrim(_env('PY_SCRIPT_SERVER_HOST'), '/') . '/api/process-pincode-master';

        try {
            if ($request->hasFile('pincode_file') && $file != null) {
                if ($file->getSize() > 18874368) {
                    Session::flash('error', 'Uploaded file is too large');
                    return redirect()->back();
                }
            } else {
                Session::flash('error', 'Please select a file');
                return redirect()->back();
            }

            $curl = curl_init();
            $cFile = new \CURLFile($file->getRealPath(), $file->getClientMimeType(), $file->getClientOriginalName());

            $payload = [
                'file' => $cFile,
                'user_id' => $userId
            ];

            curl_setopt_array($curl, array(
                CURLOPT_URL => $url,
                CURLOPT_RETURNTRANSFER => true,
                CURLOPT_ENCODING => '',
                CURLOPT_MAXREDIRS => 10,
                CURLOPT_TIMEOUT => 120,
                CURLOPT_FOLLOWLOCATION => true,
                CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
                CURLOPT_CUSTOMREQUEST => 'POST',
                CURLOPT_POSTFIELDS => $payload,
            ));

            $response = curl_exec($curl);
            $httpcode = curl_getinfo($curl, CURLINFO_HTTP_CODE);
            $error_msg = '';
            if (curl_error($curl)) {
                $error_msg = curl_error($curl);
            }
            curl_close($curl);

            if ($httpcode >= 200 && $httpcode < 300) {
                $resData = json_decode($response, true);
                if (isset($resData['status']) && $resData['status'] == 'error') {
                     return redirect()->back()->with('error', 'Processing Failed: ' . (isset($resData['message']) ? (is_array($resData['message']) ? implode(', ', $resData['message']) : $resData['message']) : ''));
                }
                return redirect()->back()->with('success', 'File uploaded and processed successfully.');
            } else {
                $resData = json_decode($response, true);
                $errorDetails = '';
                
                if ($httpcode == 400 || $httpcode == 422) {
                    if ($resData && isset($resData['detail'])) {
                        $errorDetails = $resData['detail'];
                    } elseif ($resData && isset($resData['message'])) {
                        $errorDetails = $resData['message'];
                    }
                }

                if ($errorDetails) {
                    return redirect()->back()->with('pincode_errors', is_array($errorDetails) ? $errorDetails : [$errorDetails]);
                }
                
                return redirect()->back()->with('error', 'Processing Failed with status: ' . $httpcode . '. A system error occurred.');
            }

        } catch (\Exception $e) {
            return redirect()->back()->with('error', 'Something went wrong while processing the file. Please try again.');
        }
    }
}
