import extend from '../utils/extend';

import { createUTC } from './utc';

import getParsingFlags from '../create/parsing-flags';

import some from '../utils/some';



export function isValid(m) {

    if (m._isValid == null) {

        var flags = getParsingFlags(m);

        var parsedParts = some.call(flags.parsedDateParts, function (i) {

            return i != null;

        });

        var isNowValid = !isNaN(m._d.getTime()) &&

            flags.overflow < 0 &&

            !flags.empty &&

            !flags.invalidMonth &&

            !flags.invalidWeekday &&

            !flags.weekdayMismatch &&

            !flags.nullInput &&

            !flags.invalidFormat &&

            !flags.userInvalidated &&

            (!flags.meridiem || (flags.meridiem && parsedParts));



        if (m._strict) {

            isNowValid = isNowValid &&

                flags.charsLeftOver === 0 &&

                flags.unusedTokens.length === 0 &&

                flags.bigHour === undefined;

        }



        if (Object.isFrozen == null || !Object.isFrozen(m)) {

            m._isValid = isNowValid;

        }

        else {

            return isNowValid;

        }

    }

    return m._isValid;

}



export function createInvalid (flags) {

    var m = createUTC(NaN);

    if (flags != null) {

        extend(getParsingFlags(m), flags);

    }

    else {

        getParsingFlags(m).userInvalidated = true;

    }



    return m;

}

