import {newDate as persianDate} from 'date-fns-jalali/newDate';
import {getYear as persianYear} from 'date-fns-jalali/getYear';
import {getMonth as persianMonth} from 'date-fns-jalali/getMonth';
import {getDate as persianDay} from 'date-fns-jalali/getDate';
import {latinDigits} from './auth-input';

const pad=(n:number)=>String(n).padStart(2,'0');
const persianDigits=(s:string)=>s.replace(/\d/g,d=>'۰۱۲۳۴۵۶۷۸۹'[Number(d)]);
const iso=(d:Date)=>`${d.getFullYear()}-${pad(d.getMonth()+1)}-${pad(d.getDate())}`;
function gregorianDate(value:string){
 if(!/^\d{4}-\d{2}-\d{2}$/.test(value))return null;
 const [year,month,day]=value.split('-').map(Number);
 // Work with calendar dates at local noon, never UTC-convert a birthday.
 const date=new Date(year,month-1,day,12);
 return Number.isFinite(date.getTime())&&iso(date)===value?date:null;
}
export function todayBirthDate(){
 const parts=new Intl.DateTimeFormat('en',{timeZone:'Asia/Tehran',year:'numeric',month:'2-digit',day:'2-digit'}).formatToParts(new Date());
 const part=(type:string)=>parts.find(p=>p.type===type)?.value;
 return `${part('year')}-${part('month')}-${part('day')}`;
}
export function validGregorianBirthDate(value:string,today=todayBirthDate()){
 return !!gregorianDate(value)&&value>='1900-01-01'&&value<=today;
}
export function persianBirthDateToIso(value:string):string|null{
 const raw=latinDigits(value).trim();
 const match=/^(\d{4})[\/.-](\d{1,2})[\/.-](\d{1,2})$/.exec(raw)||/^(\d{4})(\d{2})(\d{2})$/.exec(raw);
 if(!match)return null;
 const [,yearText,monthText,dayText]=match,[year,month,day]=[yearText,monthText,dayText].map(Number);
 if(year<1200||year>1600||month<1||month>12||day<1||day>31)return null;
 const date=persianDate(year,month-1,day);
 // Reject overflow, including Esfand 30 in a non-leap year.
 if(!Number.isFinite(date.getTime())||persianYear(date)!==year||persianMonth(date)!==month-1||persianDay(date)!==day)return null;
 return iso(date);
}
export function isoToPersianBirthDate(value:string){
 const date=gregorianDate(value);if(!date)return '';
 return persianDigits(`${persianYear(date)}/${pad(persianMonth(date)+1)}/${pad(persianDay(date))}`);
}
export function gregorianBirthDateLabel(value:string){
 const date=gregorianDate(value);if(!date)return '';
 return new Intl.DateTimeFormat('en-GB',{calendar:'gregory',numberingSystem:'latn',day:'numeric',month:'long',year:'numeric'}).format(date);
}
export function birthDateError(value:string,today=todayBirthDate()){
 if(!value.trim())return '';
 const date=persianBirthDateToIso(value);
 if(!date)return 'تاریخ شمسی معتبر را به ترتیب سال، ماه و روز وارد کنید.';
 if(date<'1900-01-01')return 'تاریخ تولد باید از سال ۱۲۷۸ شمسی (۱۹۰۰ میلادی) به بعد باشد.';
 if(date>today)return 'تاریخ تولد نمی‌تواند در آینده باشد.';
 return '';
}
