<?php

namespace App\Http\Controllers\Frontend;

use App\Http\Controllers\Controller;
use App\Models\User;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Hash;
use Illuminate\Validation\ValidationException;
use Illuminate\Support\Facades\Validator;

class AppController extends Controller
{
    // Class property
    private $serviceUrl = "https://tckimlik.nvi.gov.tr/Service/";

    // Home
    public function index()
    {
        return view('frontend.main.index');
    }

public function validateTC(Request $request)
{
    // Kullanıcı oturumu kontrolü
    $user = Auth::user();
    if (!$user) {
        return redirect()->back()->with('error', 'Oturum açmalısınız.');
    }

    $userId = $user->id;

    // İstek verilerini doğrulamak için kurallar
    $rules = [
        'identity' => 'required|digits:11|regex:/^[1-9][0-9]{10}$/',
        'document_serial' => 'required|string:9',
        'name' => 'required|string|max:255',
        'surname' => 'required|string|max:255',
        'birthdate' => 'required|date_format:d.m.Y', // doğum tarihi için format kontrolü
    ];

    // Hata mesajları
    $messages = [
        'identity.required' => 'TC Kimlik Numarası zorunludur.',
        'identity.digits' => 'TC Kimlik Numarası 11 haneli olmalıdır.',
        'identity.regex' => 'Geçersiz TC Kimlik Numarası formatı. İlk hane 0 olamaz.',
        
        'document_serial.required' => 'Belge seri numarası zorunludur.',
        'document_serial.regex' => 'Belge seri numarası 9 haneli olmalıdır.',
        
        'name.required' => 'Ad alanı zorunludur.',
        'name.string' => 'Ad sadece metin içermelidir.',
        'name.max' => 'Ad maksimum 255 karakter olmalıdır.',
        
        'surname.required' => 'Soyad alanı zorunludur.',
        'surname.string' => 'Soyad sadece metin içermelidir.',
        'surname.max' => 'Soyad maksimum 255 karakter olmalıdır.',
        
        'birthdate.required' => 'Doğum tarihi zorunludur.',
        'birthdate.date_format' => 'Doğum tarihi geçerli bir formatta olmalıdır (gg.aa.yyyy).',
    ];

    // Verileri doğrulama
    $validator = Validator::make($request->all(), $rules, $messages);

    if ($validator->fails()) {
        return redirect()->back()->withErrors($validator)->withInput();
    }

    // Tarih bilgisini parçalama
    $birthdate = $request->birthdate; // dd.mm.yyyy formatında
    list($day, $month, $year) = explode('.', $birthdate); // gün, ay, yıl olarak ayır

    // Kimlik doğrulaması için veri
    $data = [
        "identity" => $request->identity,
        "name" => $request->name,
        "surname" => $request->surname,
        "day" => $day,
        "month" => $month,
        "year" => $year,
        "document_serial" => $request->document_serial,
        "type" => 2 // Yeni kimlik kartı türü
    ];

    // Kimlik doğrulama işlemi
    $validationResult = $this->IdentityDocumentValidation($data);

    if ($validationResult) {
        try {
            // Kimlik doğrulama başarılıysa kullanıcıyı güncelleme
            $user = User::find($userId);
            if (!$user) {
                return redirect()->back()->with('error', 'Kullanıcı bulunamadı.');
            }

            $user->update([
                'tc_no' => $request->identity,
                'document_serial' => $request->document_serial,
                'birthday' => $request->birthdate,
                'name' => $request->name,
                'surname' => $request->surname,
            ]);

            // Başarı mesajı
            return redirect()->back()->with('success', 'Kimlik doğrulama başarılı ve bilgiler güncellendi.');
        } catch (\Exception $e) {
            return redirect()->back()->with('error', 'Bir hata oluştu: ' . $e->getMessage());
        }
    } else {
        // Kimlik doğrulama başarısızsa hata mesajı
        return redirect()->back()->with('error', 'Kimlik doğrulama başarısız. Lütfen bilgilerinizi kontrol edin.');
    }
}



    // XML ile kimlik doğrulaması
    public function IdentityDocumentValidation($data)
    {
        if ($data["type"] == 2) {
            $post_data = '<?xml version="1.0" encoding="utf-8"?>
            <soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
                <soap:Body>
                    <KisiVeCuzdanDogrula xmlns="http://tckimlik.nvi.gov.tr/WS">
                        <TCKimlikNo>' . $data['identity'] . '</TCKimlikNo>
                        <Ad>' . $this->tr_strtoupper($data['name']) . '</Ad>
                        <Soyad>' . $this->tr_strtoupper($data['surname']) . '</Soyad>
                        <DogumGun>' . $data['day'] . '</DogumGun>
                        <DogumAy>' . $data['month'] . '</DogumAy>
                        <DogumYil>' . $data['year'] . '</DogumYil>
                        <TCKKSeriNo>' . $data['document_serial'] . '</TCKKSeriNo>
                    </KisiVeCuzdanDogrula >
                </soap:Body>
            </soap:Envelope>';
        }

        $data = [
            "endpoint" => "KPSPublicV2.asmx",
            "post" => $post_data,
            "header" => [
                'POST /Service/KPSPublicV2.asmx HTTP/1.1',
                'Host: tckimlik.nvi.gov.tr',
                'Content-Type: text/xml; charset=utf-8',
                'SOAPAction: "http://tckimlik.nvi.gov.tr/WS/KisiVeCuzdanDogrula"',
                'Content-Length: ' . strlen($post_data)
            ]
        ];

        return $this->request($data);
    }

    // Curl ile HTTP isteği yapma
    protected function request($data)
    {
        $ch = curl_init();
        $options = array(
            CURLOPT_URL => $this->serviceUrl . $data["endpoint"],
            CURLOPT_POST => true,
            CURLOPT_POSTFIELDS => $data["post"],
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_SSL_VERIFYPEER => false,
            CURLOPT_HEADER => false,
            CURLOPT_HTTPHEADER => $data["header"],
        );
        curl_setopt_array($ch, $options);
        $response = curl_exec($ch);
        curl_close($ch);
        return (strip_tags($response) === 'true') ? true : false;
    }

    // Türkçe büyük harfe çevirme
    public function tr_strtoupper($text)
    {
        $search = ["ç", "i", "ı", "ğ", "ö", "ş", "ü"];
        $replace = ["Ç", "İ", "I", "Ğ", "Ö", "Ş", "Ü"];
        $text = str_replace($search, $replace, $text);
        return strtoupper($text);
    }
KİMSEDEN SES ÇIKMAYINCA KENDİM YAPTIM umarım faydalı olur