// SPDX-License-Identifier: MIT
// Copyright (c) 2026 Incoprea
// Find the next Monday-through-Friday date
// Not compiled or tested in-world
// Setup: Edit the date and planning inputs, then touch as owner. Accepted calendar dates are YYYY-MM-DD in 2000-2099.
// Stop / restore: Remove or disable. These are local calendar calculations, not scheduled actions.
// Notes: Uses Gregorian dates without timezone or daylight-saving conversion unless explicitly stated. No public holidays are considered. Friday advances to Monday; the current date is never returned.
// License: see LICENSE in this distribution.
// Original Incoprea example. MIT.
string DATE="2026-09-25";
integer leap(integer y)
{
    return y%400==0 || (y%4==0 && y%100!=0);
}
integer monthDays(integer y,integer m)
{
    list days=[31,28,31,30,31,30,31,31,30,31,30,31];
    integer count=llList2Integer(days,m-1);
    if(m==2 && leap(y))++count;
    return count;
}
list parseDate(string text)
{
    if(llStringLength(text)!=10 || llGetSubString(text,4,4)!="-" || llGetSubString(text,7,7)!="-")return [];
    integer i;
    for(i=0;i<10;++i)if(i!=4 && i!=7 && llSubStringIndex("0123456789",llGetSubString(text,i,i))==-1)return [];
    integer y=(integer)llGetSubString(text,0,3);
    integer m=(integer)llGetSubString(text,5,6);
    integer d=(integer)llGetSubString(text,8,9);
    if(y<2000 || y>2099 || m<1 || m>12)return [];
    if(d<1 || d>monthDays(y,m))return [];
    return [y,m,d];
}
integer dateSerial(list date)
{
    integer y=llList2Integer(date,0);
    integer m=llList2Integer(date,1);
    integer result=llList2Integer(date,2)-1;
    integer i;
    for(i=2000;i<y;++i)result+=365+leap(i);
    for(i=1;i<m;++i)result+=monthDays(y,i);
    return result;
}
list fromSerial(integer value)
{
    if(value<0 || value>=36525)return [];
    integer y=2000;
    while(value>=365+leap(y))
    {
        value-=365+leap(y);
        ++y;
    }
    integer m=1;
    while(value>=monthDays(y,m))
    {
        value-=monthDays(y,m);
        ++m;
    }
    return [y,m,value+1];
}
string dateText(list date)
{
    if(llGetListLength(date)!=3)return "[outside 2000-2099]";
    integer m=llList2Integer(date,1);
    integer d=llList2Integer(date,2);
    string month=(string)m;
    string day=(string)d;
    if(m<10)month="0"+month;
    if(d<10)day="0"+day;
    return llList2String(date,0)+"-"+month+"-"+day;
}
integer weekday(integer serial)
{
    return (serial+6)%7;
}
default
{
    touch_start(integer touches)
    {
        if(llDetectedKey(0)!=llGetOwner())return;
        list date=parseDate(DATE);
        if(llGetListLength(date)!=3)
        {
            llOwnerSay("Invalid or unsupported date.");
            return;
        }
        integer serial=dateSerial(date)+1;
        while(weekday(serial)==0 || weekday(serial)==6)++serial;
        llOwnerSay("Next weekday: "+dateText(fromSerial(serial)));
    }
    changed(integer flags)
    {
        if(flags & CHANGED_OWNER)llResetScript();
    }
}
