<?php

namespace App\Http\Controllers;

use App\Helpers\CurrencyHelper;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Mail;
use App\Mail\SendOtp;
use Illuminate\Support\Str;

class BrandController extends Controller
{
    //
    public function __construct(private readonly CurrencyHelper $currencyHelper)
    {
    }


public
function signup(Request $request)
{
    $phone = $request->input('phone');
    $email = $request->input('email');
    $name = $request->input('name');
    $industry = $request->input('industry');
    $target_location = $request->input('target_location');
    $website_url = $request->input('website_url');
    $service_of_interest = $request->input('service_of_interest');

    $property1 = ["propertyName" => "email_moon_app", "operator" => "EQ", "value" => "$email"];
    $property2 = ["propertyName" => "phone", "operator" => "EQ", "value" => "$phone"];

    $requestdata = [
        "filterGroups" => [['filters' => [$property1]], ['filters' => [$property2]]]
    ];
    $final_response = $this->callHubspotApi(json_encode($requestdata), 'companies/search');

    if (isset($final_response['total']) && $final_response['total'] > 0) {
        $status = "Error";
        $message = "Looks like you’ve already signed up with this details, please login to your account.";
        $data = ["signup" => 0];
    } else {
        $company_request = [
            "properties" => [
                'phone' => $phone,
                'email_moon_app' => $email,
                'name' => $name,
                'industry' => $industry,
                'source' => "CPS App",
                'target_location' => $target_location,
                'website' => $website_url,
                'service_of_interest' => $service_of_interest,
            ]
        ];
        $company_response = $this->callHubspotApi(json_encode($company_request), 'companies');
//dd($company_response);
        if (isset($company_response['status']) && ($company_response['status'] == "Error")) {
            $status = "Error";
            $message = "Looks like you’ve entered wrong details, please try with another values.";
            $data = ["signup" => 0];
        } else {
            $status = "Success";
            $message = "Account created successfully!";
            $data = ["signup" => 1];
        }


    }
    $res = array(
        "status" => $status,
        "message" => $message,
        "data" => $data
    );
    return response()->json($res);
}

/** Send OTP in Affiliate */
public
function send_otp(Request $request)
{
    $credentials = $request->only(['email']);
    $email = $credentials['email'];
    if ($credentials && $credentials['email'] != '') {
        try {
            $data = [
                "filterGroups" => [
                    [
                        "filters" => [["propertyName" => "email_moon_app", "operator" => 'EQ', 'value' => $email]]
                    ]
                ]
            ];

            $response = $this->callHubspotApi(json_encode($data), 'companies/search', 'POST');
            if (isset($response['total']) && $response['total'] > 0) {
                $otp = $this->generateNumericOTP(4);
                $file = $response['results'][0]['id'] . '.txt';
                file_put_contents($file, $otp);
                Mail::to($credentials['email'])->send(new SendOtp($credentials['email'], $otp, 'CPS :One time password'));


                return response()->json([
                    'status' => 'success',
                    'code' => 200,
                    'message' => 'We sent you verification code on your email',
                    'result' => true,
                    'data' => [
                        'message' => 'We sent you verification code on your email'
                    ]
                ]);
            } else {
                return response()->json([
                    'status' => 'error',
                    'code' => 403,
                    'message' => "Please check the email provided",
                    "data" => [],
                    "error" => [
                        "message" => "Please check the email provided1",
                        "status_code" => 403
                    ]
                ], 403);
            }

        } catch (\Exception $exception) {
            return response()->json([
                'status' => 'error',
                'code' => 403,
                'message' => "Please check the email provided" . $exception->getMessage(),
                "data" => [],
                "error" => [
                    "message" => "Please check the email provided" . $exception->getMessage(),
                    "status_code" => 403
                ]
            ], 403);
        }
    }
}

/** confirm OTP in Company */
public
function confirm_otp(Request $request)
{
    $credentials = $request->only(['email', 'otp']);
    $email = $credentials['email'];
    if ($credentials && $credentials['email'] != '' && isset($credentials['otp'])) {
        try {
            $data = [
                "filterGroups" => [
                    [
                        "filters" => [["propertyName" => "email_moon_app", "operator" => 'EQ', 'value' => $email]]
                    ]
                ],
                "properties" => ["phone", "email_moon_app", "name", "target_location", "service_of_interest", "website"]

            ];

            $response = $this->callHubspotApi(json_encode($data), 'companies/search', 'POST');
            $token = Str::random(32);

            if (isset($response['results'][0]['id'])) {
                $lines = file($response['results'][0]['id'] . '.txt');
                if ($lines[0] == $credentials['otp']) {
                    if (isset($credentials['otp'])) {

                        return response()->json([
                            'status' => 'success',
                            'code' => 200,
                            'result' => true,
                            'message' => 'Your verification done successfully',
                            'data' => [
                                'message' => 'Your verification done successfully',
                                'email_moon_app' => $email,
                                'phone' => $response['results'][0]['properties']['phone'],
                                'id' => $response['results'][0]['id'],
                                'name' => $response['results'][0]['properties']['name'],
                                'service_of_interest' => $response['results'][0]['properties']['service_of_interest'],
                                'target_location' => $response['results'][0]['properties']['target_location'],
                                'website' => $response['results'][0]['properties']['website'],
                                'access_token' => $token,
                                'expires_in' => 3600
                            ]
                        ]);
                    }


                } else {
                    return response()->json([
                        'status' => 'error',
                        'code' => 403,
                        "message" => "Please enter correct otp",
                        "data" => [],
                        "error" => [
                            "message" => "Please enter correct otp",
                            "status_code" => 403
                        ]
                    ], 403);
                }
            } else {
                return response()->json([
                    'status' => 'error',
                    'code' => 403,
                    "message" => "Please enter correct otp  or email",
                    "data" => [],
                    "error" => [
                        "message" => "Please enter correct otp or email",
                        "status_code" => 403
                    ]
                ], 403);
            }


        } catch (\Exception $exception) {
            return response()->json([
                'status' => 'error',
                'code' => 403,
                "message" => "Please enter correct otp  or email",
                "data" => [],
                "error" => [
                    "message" => "Please enter correct otp",
                    "status_code" => 403
                ]
            ], 403);
        }
    } else {
        return response()->json([
            'status' => 'error',
            'code' => 403,
            "message" => "Please enter correct otp  or email",
            "data" => [],
            "error" => [
                "message" => "Please provide correct otp",
                "status_code" => 403
            ]
        ], 403);

    }

}

public
function callHubspotApi($data, $endpoint, $method = 'POST')
{
    $curl = curl_init();
    curl_setopt_array($curl, array(
        CURLOPT_URL => env('hubspot_url') . $endpoint,
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_ENCODING => '',
        CURLOPT_MAXREDIRS => 10,
        CURLOPT_TIMEOUT => 0,
        CURLOPT_FOLLOWLOCATION => true,
        CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
        CURLOPT_CUSTOMREQUEST => $method,
        CURLOPT_POSTFIELDS => $data,
        CURLOPT_HTTPHEADER => array(
            'Authorization: Bearer ' . env('hubspot_token'),
            'Content-Type: application/json'
        ),
    ));
    // curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0); // Skip SSL Verification
    $response = curl_exec($curl);
    curl_close($curl);
    return json_decode($response, true);
}

//Generate OTP of 4 Digit

/** Generate OTP Number*/
public
function generateNumericOTP($n)
{

    // Take a generator string which consist of
    // all numeric digits
    $generator = "1357902468";

    // Iterate for n-times and pick a single character
    // from generator and append it to $result

    // Login for generating a random character from generator
    //     ---generate a random number
    //     ---take modulus of same with length of generator (say i)
    //     ---append the character at place (i) from generator to result

    $result = "";

    for ($i = 1; $i <= $n; $i++) {
        $result .= substr($generator, (rand() % (strlen($generator))), 1);
    }

    // Return result
    return $result;
}

public
function brandPerformance(Request $request)
{
    try {
        $startTime = microtime(true);
//            sleep(10);
        $status = "Success";
        $message = "";
        $data = array();

        $brand_id = $request->input('brand_id');
        // $currency = $request->input('currency');
        $datefrom = $request->input('datefrom');
        $dateto = $request->input('dateto');
        $coupon_code = $request->input('coupon_code');
        $sort = $request->input('sort');
        if (empty($brand_id)) {
            $res = array(
                "status" => "Error",
                "message" => 'Brand id is required',
                "data" => []
            );
            return response()->json($res);
        }

//            $c = $this->currencyHelper->getCurrencyRateLists(true);
        $offset = 0;
        $pagesize = 100;
        if ((isset($request->page) && !empty($request->page)) && (isset($request->pagesize) && !empty($request->pagesize))) {
            $pagesize = $request->pagesize;
            $offset = ($request->page - 1) * $request->pagesize;
        }

        $query = DB::connection('azuresql')
            ->table('coupon_performance_bi')
            ->join('clients', 'coupon_performance_bi.client_id', '=', 'clients.id')
            ->join('coupons', 'coupon_performance_bi.coupon_record_id', '=', 'coupons.record_id')
//                ->selectRaw(
//                    DB::raw('sum(COALESCE([dbo].[coupon_performance_bi].net_revenue_calc, 0))/' . $c['AED'] . ' as net_revenue,
//                                    [dbo].[coupon_performance_bi].coupon_code,
//                                    sum(COALESCE([dbo].[coupon_performance_bi].net_orders_calc, 0)) as conversions,
//                                    sum(COALESCE([dbo].[coupon_performance_bi].net_payout, 0))/' . $c['AED'] . ' as net_payout,
//                                    sum(COALESCE([dbo].[coupon_performance_bi].net_payout, 0)) as net_payout_aed,
//                                    [dbo].[coupon_performance_bi].client_name,
//                                    [dbo].[clients].logo'
//                    )
//                )
            ->selectRaw(
                DB::raw('sum(COALESCE([dbo].[coupon_performance_bi].net_revenue_calc, 0)) as net_revenue,
                                    [dbo].[coupon_performance_bi].coupon_code,
                                    sum(COALESCE([dbo].[coupon_performance_bi].net_orders_calc, 0)) as conversions,
                                    sum(COALESCE([dbo].[coupon_performance_bi].net_payout, 0)) as net_payout,
                                    [dbo].[coupon_performance_bi].client_name,
                                    [dbo].[coupons].coupon_status,
                                    [dbo].[clients].logo'
                )
            )
            ->where('coupon_performance_bi.company_record_id', $brand_id)
            ->groupBy('coupon_performance_bi.coupon_code', 'coupon_performance_bi.company_record_id', 'coupon_performance_bi.client_name', 'coupon_performance_bi.currency', 'coupon_performance_bi.cpo_or_cps', 'clients.logo', 'coupons.coupon_status')
            ->where('coupon_performance_bi.coupon_status', 'Active');

        $query2 = DB::connection('azuresql')
            ->table('coupon_performance_bi')
            ->selectRaw(
                DB::raw('sum(COALESCE([dbo].[coupon_performance_bi].net_revenue_calc, 0)) as total_net_revenue,
                                    count(distinct [dbo].[coupon_performance_bi].coupon_code) as total_coupon,
                                    sum(COALESCE([dbo].[coupon_performance_bi].net_orders_calc, 0)) as total_conversions'
                )
            )
            ->where('coupon_performance_bi.company_record_id', $brand_id)
            ->where('coupon_performance_bi.coupon_status', 'Active');

        /** Filters */

        if (!empty($coupon_code)) {
            $coupon_code = "%" . $coupon_code . "%";
            $query->where('coupon_performance_bi.coupon_code', 'LIKE', $coupon_code);
            $query2->where('coupon_performance_bi.coupon_code', 'LIKE', $coupon_code);

        }
        if (!empty($datefrom) && !empty($dateto)) {
            $query->whereBetween('coupon_performance_bi.order_date', [$datefrom, $dateto]);
            $query2->whereBetween('coupon_performance_bi.order_date', [$datefrom, $dateto]);
        } else {
            $datefrom = date("Y-m-1");
            $dateto = date("Y-m-t");
            $query->whereBetween('coupon_performance_bi.order_date', [$datefrom, $dateto]);
            $query2->whereBetween('coupon_performance_bi.order_date', [$datefrom, $dateto]);
        }
        if (!empty($sort)) {
            if ($sort == 1) {
                $query->orderBy('net_revenue', 'DESC')->orderBy('conversions', "DESC");
            } elseif ($sort == 2) {
                $query->orderBy('net_revenue', 'ASC')->orderBy('conversions', "ASC");
            } elseif ($sort == 3) {
                $query->orderBy('net_revenue', 'DESC');
            } elseif ($sort == 4) {
                $query->orderBy('net_revenue', 'ASC');
            } elseif ($sort == 5) {
                $query->orderBy('conversions', 'DESC');
            } elseif ($sort == 6) {
                $query->orderBy('conversions', 'ASC');
            }
        }

        $data = $query->offset($offset)->limit($pagesize)->get()->toArray();
        $data2 = $query2->get()->toArray();

//            $data = $query->get()->toArray();

//            $totalconversions = $totalnetpayout = $totalnetpayoutaed = $totalnetpayoutkwd = $totalnetpayoutqar = $totalnetpayoutbhd = $totalnetpayoutomr = $totalnetpayoutsar = $totalnetrevenue = $totalnetrevenueaed = 0;
        $totalconversions = $totalcoupon = $totalnetrevenue = 0;
//            $clientlist = [];
//            $couponlist = [];
        $finaldata = [];
        if (isset($data2) && !empty($data2)) {
            $totalconversions = round($data2[0]->total_conversions);
            $totalnetrevenue = round($data2[0]->total_net_revenue);
            $totalcoupon = round($data2[0]->total_coupon);
        }
        if (isset($data) && !empty($data)) {
            foreach ($data as $value) {
                if ($value->conversions > 0 && $value->conversions < 1) {
                    $value->conversions = ceil($value->conversions);
                } else {
                    $value->conversions = round($value->conversions);
                }
                $value->net_payout = round($value->net_payout);
//                    $value->net_payout_sar = round($value->net_payout * $c['SAR']);
//                    $value->net_payout_aed = round($value->net_payout_aed);
//                    $value->net_payout_kwd = round($value->net_payout * $c['KWD']);
//                    $value->net_payout_qar = round($value->net_payout * $c['QAR']);
//                    $value->net_payout_bhd = round($value->net_payout * $c['BHD']);
//                    $value->net_payout_omr = round($value->net_payout * $c['OMR']);
                $value->net_revenue = round($value->net_revenue);
//                    $value->net_revenue_aed = round($value->net_revenue * $c['AED']);
//                    $value->net_revenue_sar = round($value->net_revenue * $c['SAR']);
//                    $value->net_revenue_kwd = round($value->net_revenue * $c['KWD']);
//                    $value->net_revenue_qar = round($value->net_revenue * $c['QAR']);
//                    $value->net_revenue_bhd = round($value->net_revenue * $c['BHD']);
//                    $value->net_revenue_omr = round($value->net_revenue * $c['OMR']);
//                    $totalconversions = $totalconversions + $value->conversions;
//                    $totalnetpayout = $totalnetpayout + $value->net_payout;
//                    $totalnetpayoutaed = $totalnetpayoutaed + $value->net_payout_aed;
//                    $totalnetpayoutkwd = $totalnetpayoutkwd + $value->net_payout_kwd;
//                    $totalnetpayoutqar = $totalnetpayoutqar + $value->net_payout_qar;
//                    $totalnetpayoutbhd = $totalnetpayoutbhd + $value->net_payout_bhd;
//                    $totalnetpayoutomr = $totalnetpayoutomr + $value->net_payout_omr;
//                    $totalnetpayoutsar = $totalnetpayoutsar + $value->net_payout_sar;
//                    $totalnetrevenue = $totalnetrevenue + $value->net_revenue;
                array_push($finaldata, $value);
//                    if (!in_array($value->coupon_code, $couponlist)) {
//                        array_push($couponlist, $value->coupon_code);
//                    }
            }
        }
        $status = 'Success';
        $message = 'Data fetched successfully !';

        $res = array(
            "status" => $status,
            "message" => $message,
            "data" => [
                "conversions" => $finaldata,
                "total_conversion" => $totalconversions,
//                    "total_net_payout" => round($totalnetpayout),
//                    "total_net_payout_aed" => round($totalnetpayoutaed),
//                    "total_net_payout_kwd" => round($totalnetpayoutkwd),
//                    "total_net_payout_qar" => round($totalnetpayoutqar),
//                    "total_net_payout_bhd" => round($totalnetpayoutbhd),
//                    "total_net_payout_omr" => round($totalnetpayoutomr),
//                    "total_net_payout_sar" => round($totalnetpayoutsar),
                "total_net_revenue" => $totalnetrevenue,
                "total_coupon" => $totalcoupon,
            ]
        );
        $endTime = microtime(true);
        $executionTime = $endTime - $startTime;

        if ($executionTime > 9) {
            return response()->json([
                "status" => "Error",
                "message" => 'Oops! Looks like there was a network issue. Please check your internet connection and try to reload the page',
                "data" => []
            ], 504); // 408 Request Timeout status code
        }

        return response()->json($res);
    } catch (\Exception $e) {
        $res = array(
            "status" => "Error",
            "message" => 'Something went wrong.',
            "data" => []
        );

        return response()->json($res);
    }
}

public
function staticValues()
{
    $data['industry'] = [["key" => "APPAREL_FASHION", "value" => "Apparel & Fashion"],
        ["key" => "Beauty", "value" => "Beauty"],
        ["key" => "CONSUMER_GOODS", "value" => "Consumer Goods"],
        ["key" => "ENTERTAINMENT", "value" => "ENTERTAINMENT"],
        ["key" => "FOOD_BEVERAGES", "value" => "Food & Beverages"],
        ["key" => "Home", "value" => "Home"],
        ["key" => "HEALTH_WELLNESS_AND_FITNESS", "value" => "Health, Wellness and Fitness"],
        ["key" => "Lifestyle", "value" => "Lifestyle"],
        ["key" => "Motherhood", "value" => "Motherhood"]
    ];
    $data['service_of_interest'] = [["key" => "Performance Marketing", "value" => "Performance Marketing"],
        ["key" => "Influencer Marketing", "value" => "Influencer Marketing"],
        ["key" => "Affiliate Marketing", "value" => "Affiliate Marketing"],
        ["key" => "Digital Marketing", "value" => "Digital Marketing"],
        ["key" => "Social Media Marketing", "value" => "Social Media Marketing"]
    ];
    $data['target_location'] = [["key" => "United Arab Emirates", "value" => "UNITED ARAB EMIRATES"],
        ["key" => "BAHRAIN", "value" => "BAHRAIN"],
        ["key" => "OMAN", "value" => "OMAN"],
        ["key" => "QATAR", "value" => "QATAR"],
        ["key" => "SAUDI ARABIA", "value" => "SAUDI ARABIA"],
        ["key" => "KUWAIT", "value" => "KUWAIT"],
        ["key" => "EGYPT", "value" => "EGYPT"]
    ];
    $data['performance_page_filter'] = [["key" => "1", "value" => "Best Performing: High Revenue & Orders"],
        ["key" => "2", "value" => "Least Performing: Low Revenue & Orders"],
        ["key" => "3", "value" => "Revenue: High to Low"],
        ["key" => "4", "value" => "Revenue: Low to High"],
        ["key" => "5", "value" => "Orders: High to Low"],
        ["key" => "6", "value" => "Orders: Low to High"]
    ];

    $status = "Success";
    $message = "Success";
    $data = $data;

    $res = array(
        "status" => $status,
        "message" => $message,
        "data" => $data
    );
    return response()->json($res);

}

//Create Payment Access Token API
public
function getPaymentUrls(Request $request)
{
    $data = json_encode($request->all());
    $request_access = ['grant_type' => 'client_credentials', 'realm' => 'REALM'];
    $result = $this->callPaymentGateway('identity/auth/access-token', env('payment_token'), 'Basic', 'POST', json_encode($request_access), 'application/vnd.ni-identity.v1+json');
    $access_token = $result['access_token'];
    $token_type = $result['token_type'];
    $data = ['action' => 'PURCHASE', 'amount' => ['currencyCode' => 'AED', 'value' => 100]];
    $resultOrder = $this->callPaymentGateway('transactions/outlets/' . env('payment_outlet') . '/orders', $access_token, $token_type, 'POST', json_encode($data), 'application/vnd.ni-payment.v2+json');
    $resultOrder['access_token'] = $access_token;
    $status = 'Success';
    $message = 'Data fetched successfully !';
    $res = array(
        "status" => $status,
        "message" => $message,
        "data" => $resultOrder
    );

    return response()->json($res);

}

//Call Get Profile API
public
function getProfile(Request $request)
{
    $brandId = $request->input('brand_id');
    $response = $this->callHubspotApi('', 'companies/' . $brandId . '?properties=name,hs_logo_url,website,new_commission_bah,payout_type,global_new,global_old&associations=contacts,subscription', 'GET');
if (isset($response['results'][0]['id'])) {
        $contact_details = $response['results'][0]['associations']['contacts']['results'];
        foreach ($contact_details as $c){
            if($c['type']=='company_to_contact'){
                $responseContact = $this->callHubspotApi('', 'contacts/'.$c['id'].'?properties=lastname,firstname,email,phone', 'GET');
                $name = $responseContact['result'][0]['properties']['firstname'].' '.$responseContact['result'][0]['properties']['lastname'];
                $email = $responseContact['result'][0]['properties']['email'];
                $phone = $responseContact['result'][0]['properties']['phone'];
            }
        }
        $response['results'][0]['properties']['contact_person_name'] = $name;
        $response['results'][0]['properties']['contact_person_email'] = $email;
        $response['results'][0]['properties']['contact_person_phone'] = $phone;

        return response()->json([
            'status' => 'success',
            'code' => 200,
            'result' => true,
            'message' => 'We fetched details',
            'data' => $response['results'][0]['properties']
        ]);
    } else {
        return response()->json([
            'status' => 'error',
            'code' => 403,
            "message" => "Please enter correct brand Id",
            "data" => [],
            "error" => [
                "message" => "Please enter correct brand Id",
                "status_code" => 403
            ]
        ], 403);
    }

}

//Call NGenuis Payment Curl
public
function callPaymentGateway($endpoint, $token, $token_type, $method = 'POST', $data = '', $type)
{
    $curl = curl_init();

    curl_setopt_array($curl, array(
        CURLOPT_URL => env('payment_gateway') . $endpoint,
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_ENCODING => '',
        CURLOPT_MAXREDIRS => 10,
        CURLOPT_TIMEOUT => 0,
        CURLOPT_FOLLOWLOCATION => true,
        CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
        CURLOPT_CUSTOMREQUEST => $method,
        CURLOPT_POSTFIELDS => $data,
        CURLOPT_HTTPHEADER => array(
            'Authorization: ' . $token_type . ' ' . $token,
            'Content-Type: ' . $type
        )
    ));
    $response = curl_exec($curl);
    curl_close($curl);
    return json_decode($response, true);
}
}
