/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * 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 CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */

#import "WXInstanceWrap.h"
#import "WXEmbedComponent.h"

@implementation WXInstanceWrap

@synthesize weexInstance;

WX_EXPORT_METHOD(@selector(error:code:info:))
WX_EXPORT_METHOD(@selector(refresh))

- (void)error:(NSInteger)type code:(NSInteger)code info:(NSString *)info
{
    NSString *domain = [NSString stringWithFormat:@"%ld", (long)type];
    NSDictionary *userInfo = @{ NSLocalizedDescriptionKey:info };
    NSError *error = [NSError errorWithDomain:domain code:code userInfo:userInfo];
    if (weexInstance.onFailed)
        weexInstance.onFailed(error);
}

- (void)refresh
{
    if (self.weexInstance.parentInstance) {
        WXSDKInstance *instance = self.weexInstance.parentInstance;
        NSString *nodeRef = self.weexInstance.parentNodeRef;
        WXEmbedComponent *embedComponent= (WXEmbedComponent *)[instance componentForRef:nodeRef];
        [embedComponent refreshWeex];
    }
    else {
        UIViewController *controller = self.weexInstance.viewController;
        if ([controller respondsToSelector:@selector(refreshWeex)]) {
            [controller performSelector:@selector(refreshWeex) withObject:nil];
        }
    }
}

@end
