#import "ViewController.h"
#import "NSString+Hash.h"
#define kusernameKey @"usernameKey"
#define kpasswordKey @"passwordKey"
@interface  ViewController ()
@property(nonatomic,retain)UITextField *nameFd;
@property(nonatomic,retain)UITextField *pwdFd;
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    [self login];
}

-(void)login{
    _nameFd = [[UITextField alloc]initWithFrame:CGRectMake(20, 60,self.view.bounds.size.width - 40,  40)];
    _nameFd.placeholder = @"请输入用户名";
    _nameFd.borderStyle = UITextBorderStyleRoundedRect;
    [self.view addSubview:_nameFd];
    
    _pwdFd = [[UITextField alloc]initWithFrame:CGRectMake(20, 140,  self.view.bounds.size.width - 40,  40)];
    _pwdFd.placeholder = @"请输入登入密码";
    _pwdFd.borderStyle = UITextBorderStyleRoundedRect;
     //是否安全输入,如果是的,输入内容将为“点”
    _pwdFd.secureTextEntry = YES;
    [self.view addSubview:_pwdFd];
    
    UIButton *loginBtn = [[UIButton alloc]initWithFrame:CGRectMake(20, 220, self.view.bounds.size.width-40, 40)];
    [loginBtn setTitle:@"登入" forState:UIControlStateNormal];
    loginBtn.backgroundColor = [UIColor purpleColor];
    loginBtn.layer.cornerRadius = 8; //按钮圆角
    //按钮的边框颜色设置:必须加CGColor
    loginBtn.layer.borderWidth = 4;
    loginBtn.layer.borderColor = [UIColor greenColor].CGColor;
    
    [loginBtn addTarget:self action:@selector(loginAction) forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:loginBtn];
    
    
    [self loadUserInfo];
}

// 从偏好设置中取出账号和密码
- (void)loadUserInfo
{
    NSString *username = [[NSUserDefaults standardUserDefaults]  objectForKey:kusernameKey];
    NSString *passeord = [[NSUserDefaults standardUserDefaults]  objectForKey:kpasswordKey];
    
    if (username.length && passeord.length) { // 如果有值,直接取出来!
        self.nameFd.text = username;
        self.pwdFd.text = passeord;
    }
}

//点击按钮:登入事件
-(void)loginAction{
     // 客户端跟服务器交互: 如果不写这一句: 用户可以随意访问服务器的这个接口!
     // 有些业务逻辑! 是交给服务器处理还是在客户端处理?
     // 复杂的业务逻辑,尽量交给服务器来处理;如果涉及到数据(同步),也交给服务器处理!
     // 客户端处理: 判断电话号码是否合法/判断用户是否输入信息等等... 前段处理可以较少服务器的压力!
    if (!self.nameFd.text.length && !self.pwdFd.text.length) {
        
        NSLog(@"请输入账号和密码");
        
    }else
    {
        // 1.创建请求 (POST请求)
        
        NSURL *url = [NSURL URLWithString:@"http://127.0.0.1/httpLogin/login.php"];
        
        NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
        
        // 设置请求方法:
        request.HTTPMethod = @"POST";
        
        // 对密码进行加密之后,再发送!
        NSString *password = [self.pwdFd.text md5String];
        
        NSString *bodyStr = [NSString stringWithFormat:@"username=%@&password=%@",self.nameFd.text,password];
        
        // 设置请求体:
        request.HTTPBody =[bodyStr dataUsingEncoding:NSUTF8StringEncoding];
        
        // 2. 发送请求
        [[[NSURLSession sharedSession] dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
            
            if (data) {
                
//                 NSLog(@"data:%@",[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]);
                
                // 解析 JSON 数据
                NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data  options:0 error:NULL];
                NSLog(@"%@",dict[@"userId"]);
                if (dict[@"userId"]) { // 如果服务器返回了 userId 说明账号密码正确,登陆成功!
                    
                    NSLog(@"登陆成功!");
                    
                    // 如果登陆成功,用户再次进入程序的时候,就不需要再次输入账号和密码了!需要在本地存储一下账号和密码!
                    [self saveUserInfo];
                    
                }else
                {
                    NSLog(@"账号或者密码错误");
                }
            }else
            {
                NSLog(@"连接错误,请重新尝试连接服务器");
            }
        }] resume];
    }
}

// 将密码保存在偏好设置中
- (void)saveUserInfo
{
     // 不能直接以密码明文的形式保存密码,需要加密之后再保存
    // 将密码进行 MD5 加密
    NSString *password = [self.pwdFd.text md5String];

    // 单例.
//    NSUserDefaults *users = [NSUserDefaults standardUserDefaults];
    [[NSUserDefaults standardUserDefaults]  setObject:self.nameFd.text forKey:kusernameKey];
    [[NSUserDefaults standardUserDefaults]  setObject:password forKey:kpasswordKey];
    [[NSUserDefaults standardUserDefaults]  synchronize];
}

-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
//    [self demo2];
}

//Get请求方法:带参数的网络请求!(如果需要上传参数给服务器)
-(void)demo1{
    /*
     1.参数格式: key=value (key:服务器接受参数的key值,在实际开发中,后端人员/接口文档中会告诉你. value:就是需要告诉服务器的具体参数内容)
     2.一般情况下,服务器需要我们提供多个参数! 参数和参数之间以 & 分隔 username=zhangsan&password=zhang
    
     1.第一种告诉服务器参数的方法: 将参数拼接在 url 中! 注意:在 ? 后面拼接参数! 一个 url 中, ? 后面的内容都是参数!
    
     GET :http请求方法,从服务器获取数据! 如果使用 get 请求发送参数给服务器,需要将参数拼接在 url 中!
     缺点: 所有的参数都在 url 中. 信息不安全!  */
    
    NSURL *url = [NSURL URLWithString:@"http://127.0.0.1/httpLogin/login.html?username=zhangsan&password=zhang"];
    
    NSURLRequest *request = [NSURLRequest requestWithURL:url];
    
    // 2. 发送请求
    [[[NSURLSession sharedSession] dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
        // 处理服务器返回的数据!
        
        NSLog(@"data:%@",[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]);
        
        
    }] resume];
}

//POST 请求
-(void)demo2{
    
    // 1. 创建请求:由于 POST 请求需要手动指定 http 的请求方法为 POST ,所以只能用 可变请求!
    
    // 接口
    NSURL *url = [NSURL URLWithString:@"http://127.0.0.1/httpLogin/login.php"];
    
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
    
    // 设置请求方法为 POST ; 默认情况下,所有的请求都是 GET 请求.
    request.HTTPMethod = @"POST";
    
     // POST 请求的参数,都是放在请求体中的! 注意:请求体式二进制数据!
    
    // 设置请求体内容:
    NSString *str = [NSString stringWithFormat:@"username=zhangsan&password=zhang"];
    
     // 将请求体字符串转换成二进制数据
    NSData *data = [str dataUsingEncoding:NSUTF8StringEncoding];
    
    //放入请求体
    request.HTTPBody = data;
    
    
    // 2. 发送请求 // POST 请求只能使用下面这个方法!
    [[[NSURLSession sharedSession] dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
        //处理服务器返回的数据
        NSLog(@"data:%@",[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]);
        
    }] resume];
}