<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Support\Carbon;

class MemInfo extends Model
{
    protected $table = 'mem_info';
    protected $primaryKey = 'mem_no';
    public $incrementing = true;
    protected $keyType = 'int';

    // mem_info는 created_at/updated_at 컬럼이 dt_reg/dt_mod 라서 기본 timestamps 안 씀
    public $timestamps = false;

    /**
     * 대량 컬럼이지만, 일단 자주 쓰는 것만 명시
     * (전체를 fillable로 열어두지 마. 보안상 위험)
     */
    protected $fillable = [
        'stat_1','stat_2','stat_3','stat_4','stat_5',
        'name','name_first','name_mid','name_last',
        'birth','gender','native',
        'cell_corp','cell_phone','email','pv_sns',
        'bank_code','bank_name','bank_act_num','bank_vact_num',
        'rcv_email','rcv_sms','rcv_push',
        'login_fail_cnt',
        'dt_login','dt_reg','dt_mod',
        'dt_rcv_email','dt_rcv_sms','dt_rcv_push',
        'dt_stat_1','dt_stat_2','dt_stat_3','dt_stat_4','dt_stat_5',
        'ip_reg','ci_v','ci','di',
        'country_code','country_name',
        'admin_memo','modify_log',
    ];

    protected $casts = [
        'birth' => 'date',
        'dt_login' => 'datetime',
        'dt_reg' => 'datetime',
        'dt_mod' => 'datetime',
        'dt_vact' => 'datetime',
        'dt_dor' => 'datetime',
        'dt_ret_dor' => 'datetime',
        'dt_out' => 'datetime',
        'dt_rcv_email' => 'datetime',
        'dt_rcv_sms' => 'datetime',
        'dt_rcv_push' => 'datetime',
        'dt_stat_1' => 'datetime',
        'dt_stat_2' => 'datetime',
        'dt_stat_3' => 'datetime',
        'dt_stat_4' => 'datetime',
        'dt_stat_5' => 'datetime',

        // JSON 컬럼 (DB CHECK(json_valid()) 걸려있으니 array cast 쓰면 편함)
        'admin_memo' => 'array',
        'modify_log' => 'array',
    ];

    /*
     * ========== Scopes ==========
     */

    public function scopeActive(Builder $q): Builder
    {
        // CI에서 stat_3 == 3 접근금지 / 4 탈퇴신청 / 5 탈퇴완료
        return $q->whereNotIn('stat_3', ['3','4','5']);
    }

    public function scopeByEmail(Builder $q, string $email): Builder
    {
        return $q->where('email', strtolower($email));
    }

    /**
     * ⚠️ cell_phone이 "암호화 저장"이라면
     * 이 scope는 "정규화 컬럼(cell_phone_hash / cell_phone_norm 등)" 생긴 뒤에 완성하는 게 맞음.
     * 지금은 자리만 만들어 둠.
     */
    public function scopeByPhoneLookup(Builder $q, string $phoneNormalized): Builder
    {
        // TODO: cell_phone이 암호화라면 단순 where 비교 불가
        // 예시(추천): cell_phone_hash 컬럼을 만들고 SHA256 같은 값으로 매칭
        // return $q->where('cell_phone_hash', hash('sha256', $phoneNormalized . config('app.key')));
        return $q;
    }

    /*
     * ========== Helpers ==========
     */

    public function isBlocked(): bool
    {
        return $this->stat_3 === '3';
    }

    public function isWithdrawnOrRequested(): bool
    {
        return in_array($this->stat_3, ['4','5'], true);
    }

    public function isFirstLogin(): bool
    {
        if (!$this->dt_login || !$this->dt_reg) return false;
        return Carbon::parse($this->dt_login)->equalTo(Carbon::parse($this->dt_reg));
    }
}
