import {CalendarDate as $9a4e222e1bd2b190$export$99faa760c7908e4f} from "../CalendarDate.js";

/*
 * Copyright 2020 Adobe. All rights reserved.
 * This file is licensed to you under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License. You may obtain a copy
 * of the License at http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software distributed under
 * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS
 * OF ANY KIND, either express or implied. See the License for the specific language
 * governing permissions and limitations under the License.
 */ // Portions of the code in this file are based on code from ICU.
// Original licensing can be found in the NOTICE file in the root directory of this source tree.

const $ca8f5bca40aaf2d4$var$ETHIOPIC_EPOCH = 1723856;
const $ca8f5bca40aaf2d4$var$COPTIC_EPOCH = 1824665;
// The delta between Amete Alem 1 and Amete Mihret 1
// AA 5501 = AM 1
const $ca8f5bca40aaf2d4$var$AMETE_MIHRET_DELTA = 5500;
function $ca8f5bca40aaf2d4$var$ceToJulianDay(epoch, year, month, day) {
    return epoch + // difference from Julian epoch to 1,1,1
    365 * year + // number of days from years
    Math.floor(year / 4) + // extra day of leap year
    30 * (month - 1) + // number of days from months (1 based)
    day - 1 // number of days for present month (1 based)
    ;
}
function $ca8f5bca40aaf2d4$var$julianDayToCE(epoch, jd) {
    let year = Math.floor(4 * (jd - epoch) / 1461);
    let month = 1 + Math.floor((jd - $ca8f5bca40aaf2d4$var$ceToJulianDay(epoch, year, 1, 1)) / 30);
    let day = jd + 1 - $ca8f5bca40aaf2d4$var$ceToJulianDay(epoch, year, month, 1);
    return [
        year,
        month,
        day
    ];
}
function $ca8f5bca40aaf2d4$var$getLeapDay(year) {
    return Math.floor(year % 4 / 3);
}
function $ca8f5bca40aaf2d4$var$getDaysInMonth(year, month) {
    // The Ethiopian and Coptic calendars have 13 months, 12 of 30 days each and
    // an intercalary month at the end of the year of 5 or 6 days, depending whether
    // the year is a leap year or not. The Leap Year follows the same rules as the
    // Julian Calendar so that the extra month always has six days in the year before
    // a Julian Leap Year.
    if (month % 13 !== 0) // not intercalary month
    return 30;
    else // intercalary month 5 days + possible leap day
    return $ca8f5bca40aaf2d4$var$getLeapDay(year) + 5;
}
class $ca8f5bca40aaf2d4$export$26ba6eab5e20cd7d {
    fromJulianDay(jd) {
        let [year, month, day] = $ca8f5bca40aaf2d4$var$julianDayToCE($ca8f5bca40aaf2d4$var$ETHIOPIC_EPOCH, jd);
        let era = 'AM';
        if (year <= 0) {
            era = 'AA';
            year += $ca8f5bca40aaf2d4$var$AMETE_MIHRET_DELTA;
        }
        return new (0, $9a4e222e1bd2b190$export$99faa760c7908e4f)(this, era, year, month, day);
    }
    toJulianDay(date) {
        let year = date.year;
        if (date.era === 'AA') year -= $ca8f5bca40aaf2d4$var$AMETE_MIHRET_DELTA;
        return $ca8f5bca40aaf2d4$var$ceToJulianDay($ca8f5bca40aaf2d4$var$ETHIOPIC_EPOCH, year, date.month, date.day);
    }
    getDaysInMonth(date) {
        return $ca8f5bca40aaf2d4$var$getDaysInMonth(date.year, date.month);
    }
    getMonthsInYear() {
        return 13;
    }
    getDaysInYear(date) {
        return 365 + $ca8f5bca40aaf2d4$var$getLeapDay(date.year);
    }
    getMaximumMonthsInYear() {
        return 13;
    }
    getMaximumDaysInMonth() {
        return 30;
    }
    getYearsInEra(date) {
        // 9999-12-31 gregorian is 9992-20-02 ethiopic.
        // Round down to 9991 for the last full year.
        // AA 9999-01-01 ethiopic is 4506-09-30 gregorian.
        return date.era === 'AA' ? 9999 : 9991;
    }
    getEras() {
        return [
            'AA',
            'AM'
        ];
    }
    constructor(){
        this.identifier = 'ethiopic';
    }
}
class $ca8f5bca40aaf2d4$export$d72e0c37005a4914 extends $ca8f5bca40aaf2d4$export$26ba6eab5e20cd7d {
    fromJulianDay(jd) {
        let [year, month, day] = $ca8f5bca40aaf2d4$var$julianDayToCE($ca8f5bca40aaf2d4$var$ETHIOPIC_EPOCH, jd);
        year += $ca8f5bca40aaf2d4$var$AMETE_MIHRET_DELTA;
        return new (0, $9a4e222e1bd2b190$export$99faa760c7908e4f)(this, 'AA', year, month, day);
    }
    getEras() {
        return [
            'AA'
        ];
    }
    getYearsInEra() {
        // 9999-13-04 ethioaa is the maximum date, which is equivalent to 4506-09-29 gregorian.
        return 9999;
    }
    constructor(...args){
        super(...args), this.identifier = 'ethioaa' // also known as 'ethiopic-amete-alem' in ICU
        ;
    }
}
class $ca8f5bca40aaf2d4$export$fe6243cbe1a4b7c1 extends $ca8f5bca40aaf2d4$export$26ba6eab5e20cd7d {
    fromJulianDay(jd) {
        let [year, month, day] = $ca8f5bca40aaf2d4$var$julianDayToCE($ca8f5bca40aaf2d4$var$COPTIC_EPOCH, jd);
        let era = 'CE';
        if (year <= 0) {
            era = 'BCE';
            year = 1 - year;
        }
        return new (0, $9a4e222e1bd2b190$export$99faa760c7908e4f)(this, era, year, month, day);
    }
    toJulianDay(date) {
        let year = date.year;
        if (date.era === 'BCE') year = 1 - year;
        return $ca8f5bca40aaf2d4$var$ceToJulianDay($ca8f5bca40aaf2d4$var$COPTIC_EPOCH, year, date.month, date.day);
    }
    getDaysInMonth(date) {
        let year = date.year;
        if (date.era === 'BCE') year = 1 - year;
        return $ca8f5bca40aaf2d4$var$getDaysInMonth(year, date.month);
    }
    isInverseEra(date) {
        return date.era === 'BCE';
    }
    balanceDate(date) {
        if (date.year <= 0) {
            date.era = date.era === 'BCE' ? 'CE' : 'BCE';
            date.year = 1 - date.year;
        }
    }
    getEras() {
        return [
            'BCE',
            'CE'
        ];
    }
    getYearsInEra(date) {
        // 9999-12-30 gregorian is 9716-02-20 coptic.
        // Round down to 9715 for the last full year.
        // BCE 9999-01-01 coptic is BC 9716-06-15 gregorian.
        return date.era === 'BCE' ? 9999 : 9715;
    }
    constructor(...args){
        super(...args), this.identifier = 'coptic';
    }
}


export {$ca8f5bca40aaf2d4$export$26ba6eab5e20cd7d as EthiopicCalendar, $ca8f5bca40aaf2d4$export$d72e0c37005a4914 as EthiopicAmeteAlemCalendar, $ca8f5bca40aaf2d4$export$fe6243cbe1a4b7c1 as CopticCalendar};
//# sourceMappingURL=EthiopicCalendar.js.map
