/**
 * © OpenCORD
 *
 * Created by teone on 5/25/16.
 */

(function () {
  'use strict';
  let service;
  let cookies = {
    xosUserPrefs: JSON.stringify({test: true})
  };

  const cookieMock = {
    get: (name) => {
      return cookies[name]
    },
    put: (name, value) => {
      cookies[name] = value
    }
  };

  describe('The xos.helper module', function(){

    describe('The XosUserPrefs service', () => {
      let service, toscaBase, deffered, SiteSpy, rootScope;

      // load the application module
      beforeEach(module('xos.helpers', ($provide) => {
        $provide.value('$cookies', cookieMock);
      }));

      // inject the cartService
      beforeEach(inject(function (_XosUserPrefs_) {
        // The injector unwraps the underscores (_) from around the parameter names when matching
        service = _XosUserPrefs_;
        spyOn(cookieMock, 'put').and.callThrough();
      }));

      beforeEach(inject(($q, $rootScope) => {
        rootScope = $rootScope;
      }));
      it('should exists and have methods', () => {
        expect(service).toBeDefined();
        expect(service.getAll).toBeDefined();
        expect(service.setAll).toBeDefined();
        expect(service.getSynchronizerNotificationStatus).toBeDefined();
        expect(service.setSynchronizerNotificationStatus).toBeDefined();
        expect(service.setUserDetailsCookie).toBeDefined();
        expect(service.getUserDetailsCookie).toBeDefined();
      });

      describe('the getAll method', () => {
        it('should return all the stored prefs', () => {
          let prefs = service.getAll();
          expect(prefs).toEqual(JSON.parse(cookies.xosUserPrefs));
        });
      });

      describe('the setAll method', () => {
        it('should override all preferences', () => {
          service.setAll({test: true, updated: true});
          expect(JSON.parse(cookies.xosUserPrefs)).toEqual({test: true, updated: true});
        });
      });

      describe('the synchronizers status', () => {
        let syncNotification;
        beforeEach(() => {
          syncNotification = {
            synchronizers: {
              notification: {
                first: true,
                second: false
              }
            },
            userData: {
              userId:1
            }
          }
          cookies.xosUserPrefs = JSON.stringify(syncNotification);
        });

        describe('the getSynchronizerNotificationStatus method', () => {
          it('should return notification status for all synchronizers', () => {
            expect(service.getSynchronizerNotificationStatus()).toEqual(syncNotification.synchronizers.notification);
          });

          it('should return notification status for a single synchronizers', () => {
            expect(service.getSynchronizerNotificationStatus('first')).toEqual(syncNotification.synchronizers.notification.first);
            expect(service.getSynchronizerNotificationStatus('second')).toEqual(syncNotification.synchronizers.notification.second);
          });
        });

        describe('the setSynchronizerNotificationStatus', () => {
          
          it('should throw an error if called without synchronizer name', () => {
            function wrapper (){
              service.setSynchronizerNotificationStatus();
            }
            expect(wrapper).toThrowError('[XosUserPrefs] When updating a synchronizer is mandatory to provide a name.');
          });

          it('should update a synchronizer notification status', () => {
            service.setSynchronizerNotificationStatus('second', true);
            expect(service.getSynchronizerNotificationStatus('second')).toEqual(true);
            expect(service.getSynchronizerNotificationStatus('first')).toEqual(true);

            // should persist the change
            expect(cookieMock.put).toHaveBeenCalledWith('xosUserPrefs', '{"synchronizers":{"notification":{"first":true,"second":true}},"userData":{"userId":1}}');
          });

          it('should handle empty cookies', () => {
            cookies.xosUserPrefs = '';
            service.setSynchronizerNotificationStatus('second', true);
            expect(service.getSynchronizerNotificationStatus('second')).toEqual(true);
          });
        });
      });

      describe('the userdetails status', () => {
        let userdata, meMock;
        const userData = {
          current_user_id: 2
        };
        beforeEach(inject(($q,Me) => {
          userdata = {
            userData: {
              current_user_id:1
            }
          }
          cookies.xosUserPrefs = JSON.stringify(userdata);
          deffered= $q.defer();
          meMock = Me;
          spyOn(meMock, 'get').and.callFake(function(){
            return deffered.promise;
          });
        }));
        describe('Get user data method' , ()=>{
          it('it should return the stored data', (done) => {
            service.getUserDetailsCookie().$promise.then((data) => {
              expect(data).toEqual(userdata.userData);
              done();
            });
            rootScope.$apply();
          });

          it('Should call the Api to return the data', (done) => {
            cookies.xosUserPrefs = JSON.stringify();
            service.getUserDetailsCookie().$promise.then((res) => {
              expect(res.userId).toEqual(userData.userId);
              expect(meMock.get).toHaveBeenCalled();
              done();
            });
            deffered.resolve(userData);
            rootScope.$apply();
          });

        });
        describe('Set user data method' , ()=>{
          it('it should save the provided data' , (done) => {
            service.setUserDetailsCookie(userData).$promise.then(data => {
              expect(data).toEqual(userData);
              expect(cookieMock.put).toHaveBeenCalledWith('xosUserPrefs',  '{"userData":{"current_user_id":2}}');
              done();
            });
            rootScope.$apply();
          });
          it('Should call the Api to save the data',(done)=>{
            service.setUserDetailsCookie().$promise.then(data => {
              expect(meMock.get).toHaveBeenCalled();
              expect(data).toEqual(userData);
              expect(cookieMock.put).toHaveBeenCalledWith('xosUserPrefs',  '{"userData":{"current_user_id":2}}');
              done();
            });
            deffered.resolve(userData);
            rootScope.$apply();
          });
        });
      });
    });
  });
})();