<?php

namespace App\Http\Controllers\SuperAdmin;

use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Facades\File;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Mail;
use Illuminate\Support\Facades\Hash;
use Illuminate\Validation\Rule;
use Illuminate\Validation\Rules\Password;

class SettingsController extends Controller
{
    private function getSettingsPath(): string
    {
        return storage_path('app/superadmin_settings.json');
    }

    private function readSettings(): array
    {
        $path = $this->getSettingsPath();
        if (! File::exists($path)) {
            return [];
        }
        $data = json_decode(File::get($path), true);
        return is_array($data) ? $data : [];
    }

    private function writeSettings(array $data): void
    {
        File::put($this->getSettingsPath(), json_encode($data, JSON_PRETTY_PRINT));
        Cache::forget('superadmin_settings');
    }

    public function index()
    {
        $settings = [
            'platform_name' => config('app.name'),
            'support_email' => config('mail.from.address', ''),
            'timezone' => config('app.timezone'),
            'version' => config('app.version'),
        ];
        return view('superadmin.settings', compact('settings'));
    }

    public function store(Request $request)
    {
        $request->validate([
            'key' => 'required|string|max:100',
            'value' => 'nullable|string|max:500',
        ]);
        $data = $this->readSettings();
        $data[$request->key] = $request->value;
        $this->writeSettings($data);
        return redirect()->route('superadmin.settings.index')->with('success', 'Setting saved.');
    }

    public function emailIndex()
    {
        $data = $this->readSettings();
        $mail = [
            'mail_mailer' => $data['mail_mailer'] ?? config('mail.default', 'smtp'),
            'mail_from_name' => $data['mail_from_name'] ?? config('mail.from.name', config('app.name')),
            'mail_from_address' => $data['mail_from_address'] ?? config('mail.from.address', ''),
            'mail_host' => $data['mail_host'] ?? config('mail.mailers.smtp.host', ''),
            'mail_port' => $data['mail_port'] ?? config('mail.mailers.smtp.port', '587'),
            'mail_encryption' => $data['mail_encryption'] ?? config('mail.mailers.smtp.encryption', 'tls'),
            'mail_username' => $data['mail_username'] ?? '',
            'mail_password' => $data['mail_password'] ?? '',
            'mail_queue' => $data['mail_queue'] ?? 'no',
        ];
        $hasPassword = ! empty($data['mail_password']);
        return view('superadmin.settings-email', compact('mail', 'hasPassword'));
    }

    public function emailStore(Request $request)
    {
        $request->validate([
            'mail_mailer' => 'required|string|in:smtp,log',
            'mail_from_name' => 'required|string|max:255',
            'mail_from_address' => 'required|email',
            'mail_host' => 'nullable|string|max:255',
            'mail_port' => 'nullable|string|max:20',
            'mail_encryption' => 'nullable|string|in:tls,ssl,null',
            'mail_username' => 'nullable|string|max:255',
            'mail_password' => 'nullable|string|max:255',
            'mail_queue' => 'nullable|string|in:yes,no',
        ]);

        $data = $this->readSettings();
        $data['mail_mailer'] = $request->mail_mailer;
        $data['mail_from_name'] = $request->mail_from_name;
        $data['mail_from_address'] = $request->mail_from_address;
        $data['mail_host'] = $request->mail_host ?? '';
        $data['mail_port'] = $request->mail_port ?? '587';
        $data['mail_encryption'] = $request->mail_encryption ?? 'tls';
        $data['mail_username'] = $request->mail_username ?? '';
        if ($request->filled('mail_password')) {
            $data['mail_password'] = $request->mail_password;
        }
        $data['mail_queue'] = $request->mail_queue ?? 'no';
        $this->writeSettings($data);

        return redirect()->route('superadmin.settings.email')->with('success', 'Email settings updated.');
    }

    public function emailTestMail(Request $request)
    {
        $request->validate(['to' => 'required|email']);
        $to = $request->to;
        try {
            Mail::raw('This is a test email from ' . config('app.name') . ' Super Admin. If you received this, your SMTP settings are working.', function ($message) use ($to) {
                $message->to($to)->subject('Test email – ' . config('app.name'));
            });
            return redirect()->route('superadmin.settings.email')->with('success', 'Test email sent to ' . $to);
        } catch (\Throwable $e) {
            return redirect()->route('superadmin.settings.email')->with('error', 'Failed to send test email: ' . $e->getMessage());
        }
    }

    public function profileIndex()
    {
        $user = Auth::user();
        return view('superadmin.settings-profile', compact('user'));
    }

    public function profileUpdate(Request $request)
    {
        $user = Auth::user();
        $rules = [
            'name' => 'required|string|max:255',
            'email' => [
                'required',
                'email',
                'max:255',
                Rule::unique('users', 'email')
                    ->ignore($user->id)
                    ->where(fn ($q) => $user->company_id
                        ? $q->where('company_id', $user->company_id)
                        : $q->whereNull('company_id')),
            ],
        ];
        if ($request->filled('password')) {
            $rules['password'] = ['required', 'confirmed', Password::defaults()];
        }
        $data = $request->validate($rules);

        $user->name = $data['name'];
        $user->email = $data['email'];
        if (! empty($data['password'])) {
            $user->password = Hash::make($data['password']);
        }
        $user->save();

        return redirect()->route('superadmin.settings.profile')->with('success', 'Profile updated.');
    }

    public function smsIndex()
    {
        $data = $this->readSettings();
        $sms = [
            'fast2sms_enabled' => $data['fast2sms_enabled'] ?? (config('lead.fast2sms.enabled') ? 'yes' : 'no'),
            'fast2sms_api_key' => $data['fast2sms_api_key'] ?? '',
            'fast2sms_entity_id' => $data['fast2sms_entity_id'] ?? (config('lead.fast2sms.entity_id') ?? ''),
            'fast2sms_sender_id' => $data['fast2sms_sender_id'] ?? (config('lead.fast2sms.sender_id') ?? ''),
            'fast2sms_route' => $data['fast2sms_route'] ?? (config('lead.fast2sms.route') ?? 'dlt'),
            'fast2sms_otp_template' => $data['fast2sms_otp_template'] ?? (config('lead.fast2sms.otp_template') ?? ''),
            'fast2sms_ack_template' => $data['fast2sms_ack_template'] ?? (config('lead.fast2sms.ack_template') ?? ''),
            'fast2sms_followup_template' => $data['fast2sms_followup_template'] ?? (config('lead.fast2sms.followup_template') ?? ''),
        ];
        $hasApiKey = ! empty($data['fast2sms_api_key']);

        return view('superadmin.settings-sms', compact('sms', 'hasApiKey'));
    }

    public function smsStore(Request $request)
    {
        $request->validate([
            'fast2sms_enabled' => 'required|in:yes,no',
            'fast2sms_api_key' => 'nullable|string|max:255',
            'fast2sms_entity_id' => 'required|string|max:100',
            'fast2sms_sender_id' => 'nullable|string|max:20',
            'fast2sms_route' => 'nullable|string|max:20',
            'fast2sms_otp_template' => 'required|string|max:500',
            'fast2sms_ack_template' => 'required|string|max:500',
            'fast2sms_followup_template' => 'required|string|max:500',
        ]);

        $data = $this->readSettings();
        $data['fast2sms_enabled'] = $request->fast2sms_enabled;
        if ($request->filled('fast2sms_api_key')) {
            $data['fast2sms_api_key'] = $request->fast2sms_api_key;
        }
        $data['fast2sms_entity_id'] = $request->fast2sms_entity_id;
        $data['fast2sms_sender_id'] = $request->fast2sms_sender_id ?? '';
        $data['fast2sms_route'] = $request->fast2sms_route ?? 'dlt';
        $data['fast2sms_otp_template'] = $request->fast2sms_otp_template;
        $data['fast2sms_ack_template'] = $request->fast2sms_ack_template;
        $data['fast2sms_followup_template'] = $request->fast2sms_followup_template;
        $this->writeSettings($data);

        return redirect()->route('superadmin.settings.sms')->with('success', 'SMS settings updated.');
    }

    public function whatsappIndex()
    {
        $data = $this->readSettings();
        $whatsapp = [
            'kiyowap_enabled' => $data['kiyowap_enabled'] ?? (config('lead.whatsapp.enabled') ? 'yes' : 'no'),
            'kiyowap_api_base_url' => $data['kiyowap_api_base_url'] ?? (config('lead.whatsapp.api_base_url') ?? ''),
            'kiyowap_access_token' => $data['kiyowap_access_token'] ?? '',
            'kiyowap_vendor_uid' => $data['kiyowap_vendor_uid'] ?? (config('lead.whatsapp.vendor_uid') ?? ''),
            'kiyowap_phone_number_id' => $data['kiyowap_phone_number_id'] ?? (config('lead.whatsapp.phone_number_id') ?? ''),
            'kiyowap_template_new_lead' => $data['kiyowap_template_new_lead'] ?? (config('lead.whatsapp.template_new_lead') ?? ''),
            'kiyowap_template_followup' => $data['kiyowap_template_followup'] ?? (config('lead.whatsapp.template_followup') ?? ''),
        ];
        $hasAccessToken = ! empty($data['kiyowap_access_token']);

        return view('superadmin.settings-whatsapp', compact('whatsapp', 'hasAccessToken'));
    }

    public function whatsappStore(Request $request)
    {
        $request->validate([
            'kiyowap_enabled' => 'required|in:yes,no',
            'kiyowap_api_base_url' => 'required|string|max:255',
            'kiyowap_access_token' => 'nullable|string|max:500',
            'kiyowap_vendor_uid' => 'required|string|max:100',
            'kiyowap_phone_number_id' => 'required|string|max:100',
            'kiyowap_template_new_lead' => 'nullable|string|max:100',
            'kiyowap_template_followup' => 'nullable|string|max:100',
        ]);

        $data = $this->readSettings();
        $data['kiyowap_enabled'] = $request->kiyowap_enabled;
        $data['kiyowap_api_base_url'] = rtrim((string) $request->kiyowap_api_base_url, '/');
        if ($request->filled('kiyowap_access_token')) {
            $data['kiyowap_access_token'] = $request->kiyowap_access_token;
        }
        $data['kiyowap_vendor_uid'] = $request->kiyowap_vendor_uid;
        $data['kiyowap_phone_number_id'] = $request->kiyowap_phone_number_id;
        $data['kiyowap_template_new_lead'] = $request->kiyowap_template_new_lead ?? '';
        $data['kiyowap_template_followup'] = $request->kiyowap_template_followup ?? '';
        $this->writeSettings($data);

        return redirect()->route('superadmin.settings.whatsapp')->with('success', 'WhatsApp settings updated.');
    }
}
